Advertisement
kujikita

DCTNew

Mar 5th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.40 KB | None | 0 0
  1.         public static void Main(string[] args)
  2.         {
  3.             InitializeDCT();
  4.             double[] ValIn = new double[] {
  5.                 -76, -73, -67, -62, -58, -67, -64, -55,
  6.                 -65, -69, -73, -38, -19, -43, -59, -56,
  7.                 -66, -69, -60, -15,  16, -24, -62, -55,
  8.                 -65, -70, -57, - 6,  26, -22, -58, -59,
  9.                 -61, -67, -60, -24, - 2, -40, -60, -58,
  10.                 -49, -63, -68, -58, -51, -60, -70, -53,
  11.                 -43, -57, -64, -69, -73, -67, -63, -45,
  12.                 -41, -49, -59, -60, -63, -52, -50, -34
  13.             };
  14.             double[] ValDCT = DCT(ValIn);
  15.             double[] ValOut = IDCT(ValDCT);
  16.             double[] ValDiff = new double[64];
  17.             for (int i = 0; i < 64; i++) ValDiff[i] = Math.Round(ValIn[i] - ValOut[i]);
  18.         }
  19.  
  20.         unsafe static double D( ulong val) => *(double*)&val;
  21.         unsafe static  ulong I(double val) => *( ulong*)&val;
  22.  
  23.         static double[] Coeff;
  24.         static double[] C;
  25.  
  26.         static void InitializeDCT(byte N = 8)
  27.         {
  28.             byte i, j;
  29.             Coeff = new double[N * N];
  30.             C     = new double[N    ];
  31.  
  32.             for (i = 0; i < N; i++)
  33.             {
  34.                 if (i == 0) C[i] = 1 / Math.Sqrt(2);
  35.                 else        C[i] = 1;
  36.                 for (j = 0; j < N; j++)
  37.                     Coeff[i * N + j] = 0.5 * C[i] * Math.Cos((2 * j + 1) * i / (N * 2.0) * Math.PI);
  38.             }
  39.         }
  40.  
  41.         static double[] DCT(double[] In, byte N = 8)
  42.         {
  43.             byte u, v, x, y;
  44.             double[] Out = new double[N * N];
  45.  
  46.             for (v = 0; v < N; v++)
  47.                 for (u = 0; u < N; u++)
  48.                     for (y = 0, Out[v * N + u] = 0; y < N; y++)
  49.                         for (x = 0; x < N; x++)
  50.                             Out[v * N + u] += In[y * N + x] * Coeff[v * N + y] * Coeff[u * N + x];
  51.             return Out;
  52.         }
  53.  
  54.         static double[] IDCT(double[] In, byte N = 8)
  55.         {
  56.             byte u, v, x, y;
  57.             double[] Out = new double[N * N];
  58.  
  59.             for (v = 0; v < N; v++)
  60.                 for (u = 0; u < N; u++)
  61.                     for (y = 0, Out[v * 3 + u] = 0; y < N; y++)
  62.                         for (x = 0; x < N; x++)
  63.                             Out[v * N + u] += In[y * N + x] * Coeff[y * N + v] * Coeff[x * N + u];
  64.             return Out;
  65.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement