Advertisement
kujikita

DCT.cs

Mar 13th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.36 KB | None | 0 0
  1.     public class DCT
  2.     {
  3.         private double[,,,] Coeff;
  4.  
  5.         public byte N;
  6.         public int TwoN => N * N;
  7.        
  8.         private short u, v, x, y;
  9.  
  10.         public DCT(byte N = 8)
  11.         {
  12.             this.N = N;
  13.             Coeff = new double[N, N, N, N];
  14.  
  15.             double[] C = new double[N];
  16.             C[0] = 0.70710678118654746;
  17.             for (u = 1; u < N; u++) C[u] = 1;
  18.  
  19.             double coeff = 2.0 / N;
  20.             double PiN = Math.PI / (TwoN * coeff);
  21.             for (v = 0; v < N; v++)
  22.                 for (u = 0; u < N; u++)
  23.                     for (y = 0; y < N; y++)
  24.                         for (x = 0; x < N; x++)
  25.                             Coeff[v, y, u, x] = coeff
  26.                                 * C[v] * Math.Cos(((y << 1) | 1) * v * PiN)
  27.                                 * C[u] * Math.Cos(((x << 1) | 1) * u * PiN);
  28.         }
  29.  
  30.         private double t;
  31.  
  32.         public void Straight(sbyte[] In, double[] Out)
  33.         {
  34.             for (v = 0; v < N; v++)
  35.                 for (u = 0; u < N; u++)
  36.                     for (y = 0; y < N; y++)
  37.                         for (x = 0; x < N; x++)
  38.                             Out[v * N + u] += In[y * N + x] * Coeff[v, y, u, x];
  39.         }
  40.  
  41.         public void Inverse(double[] In, sbyte[] Out)
  42.         {
  43.             for (v = 0; v < N; v++)
  44.                 for (u = 0; u < N; u++)
  45.                 {
  46.                     t = 0;
  47.                     for (y = 0; y < N; y++)
  48.                         for (x = 0; x < N; x++)
  49.                             t += In[y * N + x] * Coeff[y, v, x, u];
  50.                     Out[v * N + u] = t.CFTSB();
  51.                 }
  52.         }
  53.  
  54.         public void Straight(byte[] In, double[] Out)
  55.         {
  56.             for (v = 0; v < N; v++)
  57.                 for (u = 0; u < N; u++)
  58.                     for (y = 0; y < N; y++)
  59.                         for (x = 0; x < N; x++)
  60.                             Out[v * N + u] += (In[y * N + x] - 128) * Coeff[v, y, u, x];
  61.         }
  62.  
  63.         public void Inverse(double[] In, byte[] Out)
  64.         {
  65.             for (v = 0; v < N; v++)
  66.                 for (u = 0; u < N; u++)
  67.                 {
  68.                     t = 0;
  69.                     for (y = 0; y < N; y++)
  70.                         for (x = 0; x < N; x++)
  71.                             t += In[y * N + x] * Coeff[y, v, x, u];
  72.                     Out[v * N + u] = (byte)(t.CFTSB() + 128);
  73.                 }
  74.         }
  75.  
  76.         private void _DCT(double[] In, double[] Out)
  77.         {
  78.             for (v = 0; v < N; v++)
  79.                 for (u = 0; u < N; u++)
  80.                     for (y = 0; y < N; y++)
  81.                         for (x = 0; x < N; x++)
  82.                             Out[v * N + u] += In[y * N + x] * Coeff[v, y, u, x];
  83.         }
  84.  
  85.         private void _IDCT(double[] In, double[] Out)
  86.         {
  87.             for (v = 0; v < N; v++)
  88.                 for (u = 0; u < N; u++)
  89.                     for (y = 0; y < N; y++)
  90.                         for (x = 0; x < N; x++)
  91.                             Out[v * N + u] += In[y * N + x] * Coeff[y, v, x, u];
  92.         }
  93.     }
  94.  
  95.     public static class Extensions
  96.     {
  97.         public static sbyte CFTSB(this double c)
  98.         {
  99.             c = (float)Math.Round(c);
  100.                  if (c >  0x7F) c =  0x7F;
  101.             else if (c < -0x80) c = -0x80;
  102.             return (sbyte)c;
  103.         }
  104.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement