Advertisement
kujikita

DCT

Mar 5th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.84 KB | None | 0 0
  1.         static void Main(string[] args)
  2.         {
  3.             double[] ValIn = new double[] {
  4.                 -76, -73, -67, -62, -58, -67, -64, -55,
  5.                 -65, -69, -73, -38, -19, -43, -59, -56,
  6.                 -66, -69, -60, -15,  16, -24, -62, -55,
  7.                 -65, -70, -57, - 6,  26, -22, -58, -59,
  8.                 -61, -67, -60, -24, - 2, -40, -60, -58,
  9.                 -49, -63, -68, -58, -51, -60, -70, -53,
  10.                 -43, -57, -64, -69, -73, -67, -63, -45,
  11.                 -41, -49, -59, -60, -63, -52, -50, -34
  12.             };
  13.             double[] ValDCT = DCT (ValIn);
  14.             for (int i = 0; i < 64; i++) ValDCT[i] = Math.Round(ValDCT[i] / Q[i]);
  15.             for (int i = 0; i < 64; i++) ValDCT[i] = ValDCT[i] * Q[i];
  16.             double[] ValOut = IDCT(ValDCT );
  17.             for (int i = 0; i < 64; i++) ValDCT[i] = KKtMain.CFTI(ValDCT[i] * 100) / 100.0;
  18.             for (int i = 0; i < 64; i++) ValOut[i] = KKtMain.CFTI(ValOut    [i]);
  19.             double[] ValDiff     = new double[64];
  20.             for (int i = 0; i < 64; i++) ValDiff[i] = ValOut[i] - ValIn[i];
  21.         }
  22.  
  23.         static readonly int[] Q = new int[] {
  24.             16, 11, 10, 16,  24,  40,  51,  61,
  25.             12, 12, 14, 19,  26,  58,  60,  55,
  26.             14, 13, 16, 24,  40,  57,  69,  56,
  27.             14, 17, 22, 29,  51,  87,  80,  62,
  28.             18, 22, 37, 56,  68, 109, 103,  77,
  29.             24, 35, 55, 64,  81, 104, 113,  92,
  30.             49, 64, 78, 87, 103, 121, 120, 101,
  31.             72, 92, 95, 98, 112, 100, 103,  99,
  32.         };
  33.  
  34.         static readonly double[] Coeff = new double[] {
  35.             D(0x3ff0000000000000), D(0x3FF0000000000000), D(0x3FF0000000000000), D(0x3FF0000000000000),
  36.             D(0x3FF0000000000000), D(0x3FF0000000000000), D(0x3FF0000000000000), D(0x3FF0000000000000),
  37.             D(0x3fef6297cff75cb0), D(0x3fea9b66290ea1a3), D(0x3fe1c73b39ae68c9), D(0x3fc8f8b83c69a60d),
  38.             D(0xbfc8f8b83c69a608), D(0xbfe1c73b39ae68c6), D(0xbfea9b66290ea1a4), D(0xbfef6297cff75cb0),
  39.             D(0x3fed906bcf328d46), D(0x3fd87de2a6aea964), D(0xbfd87de2a6aea962), D(0xbfed906bcf328d46),
  40.             D(0xbfed906bcf328d47), D(0xbfd87de2a6aea96d), D(0x3fd87de2a6aea967), D(0x3fed906bcf328d44),
  41.             D(0x3fea9b66290ea1a3), D(0xbfc8f8b83c69a608), D(0xbfef6297cff75cb0), D(0xbfe1c73b39ae68c8),
  42.             D(0x3fe1c73b39ae68c5), D(0x3fef6297cff75cb0), D(0x3fc8f8b83c69a61d), D(0xbfea9b66290ea1a2),
  43.             D(0x3fe6a09e667f3bcd), D(0xbfe6a09e667f3bcc), D(0xbfe6a09e667f3bce), D(0x3fe6a09e667f3bcb),
  44.             D(0x3fe6a09e667f3bce), D(0xbfe6a09e667f3bc5), D(0xbfe6a09e667f3bc9), D(0x3fe6a09e667f3bc4),
  45.             D(0x3fe1c73b39ae68c9), D(0xbfef6297cff75cb0), D(0x3fc8f8b83c69a60c), D(0x3fea9b66290ea1a5),
  46.             D(0xbfea9b66290ea1a2), D(0xbfc8f8b83c69a602), D(0x3fef6297cff75cb2), D(0xbfe1c73b39ae68c2),
  47.             D(0x3fd87de2a6aea964), D(0xbfed906bcf328d47), D(0x3fed906bcf328d44), D(0xbfd87de2a6aea965),
  48.             D(0xbfd87de2a6aea971), D(0x3fed906bcf328d46), D(0xbfed906bcf328d43), D(0x3fd87de2a6aea95f),
  49.             D(0x3fc8f8b83c69a60d), D(0xbfe1c73b39ae68c8), D(0x3fea9b66290ea1a5), D(0xbfef6297cff75cb2),
  50.             D(0x3fef6297cff75cb0), D(0xbfea9b66290ea1a1), D(0x3fe1c73b39ae68c2), D(0xbfc8f8b83c69a616),
  51.         };
  52.  
  53.         unsafe static double D( ulong val) => *(double*)&val;
  54.         unsafe static  ulong I(double val) => *( ulong*)&val;
  55.  
  56.         static readonly double[] C = new double[] { 1 / Math.Sqrt(2), 1, 1, 1, 1, 1, 1, 1, };
  57.  
  58.         static double[] DCT(double[] In)
  59.         {
  60.             int u, v, x, y;
  61.             double q, z;
  62.             double[] Out = new double[64];
  63.  
  64.             for (v = 0; v < 8; v++)
  65.                 for (u = 0; u < 8; u++)
  66.                 {
  67.                     z = 0;
  68.  
  69.                     for (y = 0; y < 8; y++)
  70.                         for (x = 0; x < 8; x++)
  71.                         {
  72.                             q = In[(y << 3) + x] * Coeff[(u << 3) + x] * Coeff[(v << 3) + y];
  73.                             z += q;
  74.                         }
  75.  
  76.                     Out[(v << 3) + u] = 0.25 * C[u] * C[v] * z;
  77.                 }
  78.             return Out;
  79.         }
  80.  
  81.         static double[] IDCT(double[] In)
  82.         {
  83.             int u, v, x, y;
  84.             double q, z;
  85.             double[] Out = new double[64];
  86.             for (y = 0; y < 8; y++)
  87.                 for (x = 0; x < 8; x++)
  88.                 {
  89.                     z = 0;
  90.  
  91.                     for (v = 0; v < 8; v++)
  92.                         for (u = 0; u < 8; u++)
  93.                         {
  94.                             q = C[u] * C[v] * In[(v << 3) + u] * Coeff[(u << 3) + x] * Coeff[(v << 3) + y];
  95.                             z += q;
  96.                         }
  97.  
  98.                     z *= 0.25;
  99.  
  100.                     Out[(x << 3) + y] = z;
  101.                 }
  102.             return Out;
  103.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement