Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void Main(string[] args)
- {
- double[] ValIn = new double[] {
- -76, -73, -67, -62, -58, -67, -64, -55,
- -65, -69, -73, -38, -19, -43, -59, -56,
- -66, -69, -60, -15, 16, -24, -62, -55,
- -65, -70, -57, - 6, 26, -22, -58, -59,
- -61, -67, -60, -24, - 2, -40, -60, -58,
- -49, -63, -68, -58, -51, -60, -70, -53,
- -43, -57, -64, -69, -73, -67, -63, -45,
- -41, -49, -59, -60, -63, -52, -50, -34
- };
- double[] ValDCT = DCT (ValIn);
- for (int i = 0; i < 64; i++) ValDCT[i] = Math.Round(ValDCT[i] / Q[i]);
- for (int i = 0; i < 64; i++) ValDCT[i] = ValDCT[i] * Q[i];
- double[] ValOut = IDCT(ValDCT );
- for (int i = 0; i < 64; i++) ValDCT[i] = KKtMain.CFTI(ValDCT[i] * 100) / 100.0;
- for (int i = 0; i < 64; i++) ValOut[i] = KKtMain.CFTI(ValOut [i]);
- double[] ValDiff = new double[64];
- for (int i = 0; i < 64; i++) ValDiff[i] = ValOut[i] - ValIn[i];
- }
- static readonly int[] Q = new int[] {
- 16, 11, 10, 16, 24, 40, 51, 61,
- 12, 12, 14, 19, 26, 58, 60, 55,
- 14, 13, 16, 24, 40, 57, 69, 56,
- 14, 17, 22, 29, 51, 87, 80, 62,
- 18, 22, 37, 56, 68, 109, 103, 77,
- 24, 35, 55, 64, 81, 104, 113, 92,
- 49, 64, 78, 87, 103, 121, 120, 101,
- 72, 92, 95, 98, 112, 100, 103, 99,
- };
- static readonly double[] Coeff = new double[] {
- D(0x3ff0000000000000), D(0x3FF0000000000000), D(0x3FF0000000000000), D(0x3FF0000000000000),
- D(0x3FF0000000000000), D(0x3FF0000000000000), D(0x3FF0000000000000), D(0x3FF0000000000000),
- D(0x3fef6297cff75cb0), D(0x3fea9b66290ea1a3), D(0x3fe1c73b39ae68c9), D(0x3fc8f8b83c69a60d),
- D(0xbfc8f8b83c69a608), D(0xbfe1c73b39ae68c6), D(0xbfea9b66290ea1a4), D(0xbfef6297cff75cb0),
- D(0x3fed906bcf328d46), D(0x3fd87de2a6aea964), D(0xbfd87de2a6aea962), D(0xbfed906bcf328d46),
- D(0xbfed906bcf328d47), D(0xbfd87de2a6aea96d), D(0x3fd87de2a6aea967), D(0x3fed906bcf328d44),
- D(0x3fea9b66290ea1a3), D(0xbfc8f8b83c69a608), D(0xbfef6297cff75cb0), D(0xbfe1c73b39ae68c8),
- D(0x3fe1c73b39ae68c5), D(0x3fef6297cff75cb0), D(0x3fc8f8b83c69a61d), D(0xbfea9b66290ea1a2),
- D(0x3fe6a09e667f3bcd), D(0xbfe6a09e667f3bcc), D(0xbfe6a09e667f3bce), D(0x3fe6a09e667f3bcb),
- D(0x3fe6a09e667f3bce), D(0xbfe6a09e667f3bc5), D(0xbfe6a09e667f3bc9), D(0x3fe6a09e667f3bc4),
- D(0x3fe1c73b39ae68c9), D(0xbfef6297cff75cb0), D(0x3fc8f8b83c69a60c), D(0x3fea9b66290ea1a5),
- D(0xbfea9b66290ea1a2), D(0xbfc8f8b83c69a602), D(0x3fef6297cff75cb2), D(0xbfe1c73b39ae68c2),
- D(0x3fd87de2a6aea964), D(0xbfed906bcf328d47), D(0x3fed906bcf328d44), D(0xbfd87de2a6aea965),
- D(0xbfd87de2a6aea971), D(0x3fed906bcf328d46), D(0xbfed906bcf328d43), D(0x3fd87de2a6aea95f),
- D(0x3fc8f8b83c69a60d), D(0xbfe1c73b39ae68c8), D(0x3fea9b66290ea1a5), D(0xbfef6297cff75cb2),
- D(0x3fef6297cff75cb0), D(0xbfea9b66290ea1a1), D(0x3fe1c73b39ae68c2), D(0xbfc8f8b83c69a616),
- };
- unsafe static double D( ulong val) => *(double*)&val;
- unsafe static ulong I(double val) => *( ulong*)&val;
- static readonly double[] C = new double[] { 1 / Math.Sqrt(2), 1, 1, 1, 1, 1, 1, 1, };
- static double[] DCT(double[] In)
- {
- int u, v, x, y;
- double q, z;
- double[] Out = new double[64];
- for (v = 0; v < 8; v++)
- for (u = 0; u < 8; u++)
- {
- z = 0;
- for (y = 0; y < 8; y++)
- for (x = 0; x < 8; x++)
- {
- q = In[(y << 3) + x] * Coeff[(u << 3) + x] * Coeff[(v << 3) + y];
- z += q;
- }
- Out[(v << 3) + u] = 0.25 * C[u] * C[v] * z;
- }
- return Out;
- }
- static double[] IDCT(double[] In)
- {
- int u, v, x, y;
- double q, z;
- double[] Out = new double[64];
- for (y = 0; y < 8; y++)
- for (x = 0; x < 8; x++)
- {
- z = 0;
- for (v = 0; v < 8; v++)
- for (u = 0; u < 8; u++)
- {
- q = C[u] * C[v] * In[(v << 3) + u] * Coeff[(u << 3) + x] * Coeff[(v << 3) + y];
- z += q;
- }
- z *= 0.25;
- Out[(x << 3) + y] = z;
- }
- return Out;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement