javazoom.jl.decoder.LayerIIIDecoder.inv_mdct C# (CSharp) Method

inv_mdct() public method

Fast INV_MDCT.
public inv_mdct ( float in_Renamed, float out_Renamed, int block_type ) : void
in_Renamed float
out_Renamed float
block_type int
return void
        public void inv_mdct(float[] in_Renamed, float[] out_Renamed, int block_type)
        {
            float[] win_bt;
            int i;

            float tmpf_0, tmpf_1, tmpf_2, tmpf_3, tmpf_4, tmpf_5, tmpf_6, tmpf_7, tmpf_8, tmpf_9;
            float tmpf_10, tmpf_11, tmpf_12, tmpf_13, tmpf_14, tmpf_15, tmpf_16, tmpf_17;

            tmpf_0 = tmpf_1 = tmpf_2 = tmpf_3 = tmpf_4 = tmpf_5 = tmpf_6 = tmpf_7 = tmpf_8 = tmpf_9 = tmpf_10 = tmpf_11 = tmpf_12 = tmpf_13 = tmpf_14 = tmpf_15 = tmpf_16 = tmpf_17 = 0.0f;

            if (block_type == 2)
            {

                /*
                *
                *		Under MicrosoftVM 2922, This causes a GPF, or
                *		At best, an ArrayIndexOutOfBoundsExceptin.
                for(int p=0;p<36;p+=9)
                {
                out[p]   = out[p+1] = out[p+2] = out[p+3] =
                out[p+4] = out[p+5] = out[p+6] = out[p+7] =
                out[p+8] = 0.0f;
                }
                */
                out_Renamed[0] = 0.0f;
                out_Renamed[1] = 0.0f;
                out_Renamed[2] = 0.0f;
                out_Renamed[3] = 0.0f;
                out_Renamed[4] = 0.0f;
                out_Renamed[5] = 0.0f;
                out_Renamed[6] = 0.0f;
                out_Renamed[7] = 0.0f;
                out_Renamed[8] = 0.0f;
                out_Renamed[9] = 0.0f;
                out_Renamed[10] = 0.0f;
                out_Renamed[11] = 0.0f;
                out_Renamed[12] = 0.0f;
                out_Renamed[13] = 0.0f;
                out_Renamed[14] = 0.0f;
                out_Renamed[15] = 0.0f;
                out_Renamed[16] = 0.0f;
                out_Renamed[17] = 0.0f;
                out_Renamed[18] = 0.0f;
                out_Renamed[19] = 0.0f;
                out_Renamed[20] = 0.0f;
                out_Renamed[21] = 0.0f;
                out_Renamed[22] = 0.0f;
                out_Renamed[23] = 0.0f;
                out_Renamed[24] = 0.0f;
                out_Renamed[25] = 0.0f;
                out_Renamed[26] = 0.0f;
                out_Renamed[27] = 0.0f;
                out_Renamed[28] = 0.0f;
                out_Renamed[29] = 0.0f;
                out_Renamed[30] = 0.0f;
                out_Renamed[31] = 0.0f;
                out_Renamed[32] = 0.0f;
                out_Renamed[33] = 0.0f;
                out_Renamed[34] = 0.0f;
                out_Renamed[35] = 0.0f;

                int six_i = 0;

                for (i = 0; i < 3; i++)
                {
                    // 12 point IMDCT
                    // Begin 12 point IDCT
                    // Input aliasing for 12 pt IDCT
                    in_Renamed[15 + i] += in_Renamed[12 + i]; in_Renamed[12 + i] += in_Renamed[9 + i]; in_Renamed[9 + i] += in_Renamed[6 + i];
                    in_Renamed[6 + i] += in_Renamed[3 + i]; in_Renamed[3 + i] += in_Renamed[0 + i];

                    // Input aliasing on odd indices (for 6 point IDCT)
                    in_Renamed[15 + i] += in_Renamed[9 + i]; in_Renamed[9 + i] += in_Renamed[3 + i];

                    // 3 point IDCT on even indices
                    float pp1, pp2, sum;
                    pp2 = in_Renamed[12 + i] * 0.500000000f;
                    pp1 = in_Renamed[6 + i] * 0.866025403f;
                    sum = in_Renamed[0 + i] + pp2;
                    tmpf_1 = in_Renamed[0 + i] - in_Renamed[12 + i];
                    tmpf_0 = sum + pp1;
                    tmpf_2 = sum - pp1;

                    // End 3 point IDCT on even indices
                    // 3 point IDCT on odd indices (for 6 point IDCT)
                    pp2 = in_Renamed[15 + i] * 0.500000000f;
                    pp1 = in_Renamed[9 + i] * 0.866025403f;
                    sum = in_Renamed[3 + i] + pp2;
                    tmpf_4 = in_Renamed[3 + i] - in_Renamed[15 + i];
                    tmpf_5 = sum + pp1;
                    tmpf_3 = sum - pp1;
                    // End 3 point IDCT on odd indices
                    // Twiddle factors on odd indices (for 6 point IDCT)

                    tmpf_3 *= 1.931851653f;
                    tmpf_4 *= 0.707106781f;
                    tmpf_5 *= 0.517638090f;

                    // Output butterflies on 2 3 point IDCT's (for 6 point IDCT)
                    float save = tmpf_0;
                    tmpf_0 += tmpf_5;
                    tmpf_5 = save - tmpf_5;
                    save = tmpf_1;
                    tmpf_1 += tmpf_4;
                    tmpf_4 = save - tmpf_4;
                    save = tmpf_2;
                    tmpf_2 += tmpf_3;
                    tmpf_3 = save - tmpf_3;

                    // End 6 point IDCT
                    // Twiddle factors on indices (for 12 point IDCT)

                    tmpf_0 *= 0.504314480f;
                    tmpf_1 *= 0.541196100f;
                    tmpf_2 *= 0.630236207f;
                    tmpf_3 *= 0.821339815f;
                    tmpf_4 *= 1.306562965f;
                    tmpf_5 *= 3.830648788f;

                    // End 12 point IDCT

                    // Shift to 12 point modified IDCT, multiply by window type 2
                    tmpf_8 = - tmpf_0 * 0.793353340f;
                    tmpf_9 = - tmpf_0 * 0.608761429f;
                    tmpf_7 = - tmpf_1 * 0.923879532f;
                    tmpf_10 = - tmpf_1 * 0.382683432f;
                    tmpf_6 = - tmpf_2 * 0.991444861f;
                    tmpf_11 = - tmpf_2 * 0.130526192f;

                    tmpf_0 = tmpf_3;
                    tmpf_1 = tmpf_4 * 0.382683432f;
                    tmpf_2 = tmpf_5 * 0.608761429f;

                    tmpf_3 = - tmpf_5 * 0.793353340f;
                    tmpf_4 = - tmpf_4 * 0.923879532f;
                    tmpf_5 = - tmpf_0 * 0.991444861f;

                    tmpf_0 *= 0.130526192f;

                    out_Renamed[six_i + 6] += tmpf_0;
                    out_Renamed[six_i + 7] += tmpf_1;
                    out_Renamed[six_i + 8] += tmpf_2;
                    out_Renamed[six_i + 9] += tmpf_3;
                    out_Renamed[six_i + 10] += tmpf_4;
                    out_Renamed[six_i + 11] += tmpf_5;
                    out_Renamed[six_i + 12] += tmpf_6;
                    out_Renamed[six_i + 13] += tmpf_7;
                    out_Renamed[six_i + 14] += tmpf_8;
                    out_Renamed[six_i + 15] += tmpf_9;
                    out_Renamed[six_i + 16] += tmpf_10;
                    out_Renamed[six_i + 17] += tmpf_11;

                    six_i += 6;
                }
            }
            else
            {
                // 36 point IDCT
                // input aliasing for 36 point IDCT
                in_Renamed[17] += in_Renamed[16]; in_Renamed[16] += in_Renamed[15]; in_Renamed[15] += in_Renamed[14]; in_Renamed[14] += in_Renamed[13];
                in_Renamed[13] += in_Renamed[12]; in_Renamed[12] += in_Renamed[11]; in_Renamed[11] += in_Renamed[10]; in_Renamed[10] += in_Renamed[9];
                in_Renamed[9] += in_Renamed[8]; in_Renamed[8] += in_Renamed[7]; in_Renamed[7] += in_Renamed[6]; in_Renamed[6] += in_Renamed[5];
                in_Renamed[5] += in_Renamed[4]; in_Renamed[4] += in_Renamed[3]; in_Renamed[3] += in_Renamed[2]; in_Renamed[2] += in_Renamed[1];
                in_Renamed[1] += in_Renamed[0];

                // 18 point IDCT for odd indices
                // input aliasing for 18 point IDCT
                in_Renamed[17] += in_Renamed[15]; in_Renamed[15] += in_Renamed[13]; in_Renamed[13] += in_Renamed[11]; in_Renamed[11] += in_Renamed[9];
                in_Renamed[9] += in_Renamed[7]; in_Renamed[7] += in_Renamed[5]; in_Renamed[5] += in_Renamed[3]; in_Renamed[3] += in_Renamed[1];

                float tmp0, tmp1, tmp2, tmp3, tmp4, tmp0_, tmp1_, tmp2_, tmp3_;
                float tmp0o, tmp1o, tmp2o, tmp3o, tmp4o, tmp0_o, tmp1_o, tmp2_o, tmp3_o;

                // Fast 9 Point Inverse Discrete Cosine Transform
                //
                // By  Francois-Raymond Boyer
                //         mailto:[email protected]
                //         http://www.iro.umontreal.ca/~boyerf
                //
                // The code has been optimized for Intel processors
                //  (takes a lot of time to convert float to and from iternal FPU representation)
                //
                // It is a simple "factorization" of the IDCT matrix.

                // 9 point IDCT on even indices

                // 5 points on odd indices (not realy an IDCT)
                float i00 = in_Renamed[0] + in_Renamed[0];
                float iip12 = i00 + in_Renamed[12];

                tmp0 = iip12 + in_Renamed[4] * 1.8793852415718f + in_Renamed[8] * 1.532088886238f + in_Renamed[16] * 0.34729635533386f;
                tmp1 = i00 + in_Renamed[4] - in_Renamed[8] - in_Renamed[12] - in_Renamed[12] - in_Renamed[16];
                tmp2 = iip12 - in_Renamed[4] * 0.34729635533386f - in_Renamed[8] * 1.8793852415718f + in_Renamed[16] * 1.532088886238f;
                tmp3 = iip12 - in_Renamed[4] * 1.532088886238f + in_Renamed[8] * 0.34729635533386f - in_Renamed[16] * 1.8793852415718f;
                tmp4 = in_Renamed[0] - in_Renamed[4] + in_Renamed[8] - in_Renamed[12] + in_Renamed[16];

                // 4 points on even indices
                float i66_ = in_Renamed[6] * 1.732050808f; // Sqrt[3]

                tmp0_ = in_Renamed[2] * 1.9696155060244f + i66_ + in_Renamed[10] * 1.2855752193731f + in_Renamed[14] * 0.68404028665134f;
                tmp1_ = (in_Renamed[2] - in_Renamed[10] - in_Renamed[14]) * 1.732050808f;
                tmp2_ = in_Renamed[2] * 1.2855752193731f - i66_ - in_Renamed[10] * 0.68404028665134f + in_Renamed[14] * 1.9696155060244f;
                tmp3_ = in_Renamed[2] * 0.68404028665134f - i66_ + in_Renamed[10] * 1.9696155060244f - in_Renamed[14] * 1.2855752193731f;

                // 9 point IDCT on odd indices
                // 5 points on odd indices (not realy an IDCT)
                float i0 = in_Renamed[0 + 1] + in_Renamed[0 + 1];
                float i0p12 = i0 + in_Renamed[12 + 1];

                tmp0o = i0p12 + in_Renamed[4 + 1] * 1.8793852415718f + in_Renamed[8 + 1] * 1.532088886238f + in_Renamed[16 + 1] * 0.34729635533386f;
                tmp1o = i0 + in_Renamed[4 + 1] - in_Renamed[8 + 1] - in_Renamed[12 + 1] - in_Renamed[12 + 1] - in_Renamed[16 + 1];
                tmp2o = i0p12 - in_Renamed[4 + 1] * 0.34729635533386f - in_Renamed[8 + 1] * 1.8793852415718f + in_Renamed[16 + 1] * 1.532088886238f;
                tmp3o = i0p12 - in_Renamed[4 + 1] * 1.532088886238f + in_Renamed[8 + 1] * 0.34729635533386f - in_Renamed[16 + 1] * 1.8793852415718f;
                tmp4o = (in_Renamed[0 + 1] - in_Renamed[4 + 1] + in_Renamed[8 + 1] - in_Renamed[12 + 1] + in_Renamed[16 + 1]) * 0.707106781f; // Twiddled

                // 4 points on even indices
                float i6_ = in_Renamed[6 + 1] * 1.732050808f; // Sqrt[3]

                tmp0_o = in_Renamed[2 + 1] * 1.9696155060244f + i6_ + in_Renamed[10 + 1] * 1.2855752193731f + in_Renamed[14 + 1] * 0.68404028665134f;
                tmp1_o = (in_Renamed[2 + 1] - in_Renamed[10 + 1] - in_Renamed[14 + 1]) * 1.732050808f;
                tmp2_o = in_Renamed[2 + 1] * 1.2855752193731f - i6_ - in_Renamed[10 + 1] * 0.68404028665134f + in_Renamed[14 + 1] * 1.9696155060244f;
                tmp3_o = in_Renamed[2 + 1] * 0.68404028665134f - i6_ + in_Renamed[10 + 1] * 1.9696155060244f - in_Renamed[14 + 1] * 1.2855752193731f;

                // Twiddle factors on odd indices
                // and
                // Butterflies on 9 point IDCT's
                // and
                // twiddle factors for 36 point IDCT

                float e, o;
                e = tmp0 + tmp0_; o = (tmp0o + tmp0_o) * 0.501909918f; tmpf_0 = e + o; tmpf_17 = e - o;
                e = tmp1 + tmp1_; o = (tmp1o + tmp1_o) * 0.517638090f; tmpf_1 = e + o; tmpf_16 = e - o;
                e = tmp2 + tmp2_; o = (tmp2o + tmp2_o) * 0.551688959f; tmpf_2 = e + o; tmpf_15 = e - o;
                e = tmp3 + tmp3_; o = (tmp3o + tmp3_o) * 0.610387294f; tmpf_3 = e + o; tmpf_14 = e - o;
                tmpf_4 = tmp4 + tmp4o; tmpf_13 = tmp4 - tmp4o;
                e = tmp3 - tmp3_; o = (tmp3o - tmp3_o) * 0.871723397f; tmpf_5 = e + o; tmpf_12 = e - o;
                e = tmp2 - tmp2_; o = (tmp2o - tmp2_o) * 1.183100792f; tmpf_6 = e + o; tmpf_11 = e - o;
                e = tmp1 - tmp1_; o = (tmp1o - tmp1_o) * 1.931851653f; tmpf_7 = e + o; tmpf_10 = e - o;
                e = tmp0 - tmp0_; o = (tmp0o - tmp0_o) * 5.736856623f; tmpf_8 = e + o; tmpf_9 = e - o;

                // end 36 point IDCT */
                // shift to modified IDCT
                win_bt = win[block_type];

                out_Renamed[0] = - tmpf_9 * win_bt[0];
                out_Renamed[1] = - tmpf_10 * win_bt[1];
                out_Renamed[2] = - tmpf_11 * win_bt[2];
                out_Renamed[3] = - tmpf_12 * win_bt[3];
                out_Renamed[4] = - tmpf_13 * win_bt[4];
                out_Renamed[5] = - tmpf_14 * win_bt[5];
                out_Renamed[6] = - tmpf_15 * win_bt[6];
                out_Renamed[7] = - tmpf_16 * win_bt[7];
                out_Renamed[8] = - tmpf_17 * win_bt[8];
                out_Renamed[9] = tmpf_17 * win_bt[9];
                out_Renamed[10] = tmpf_16 * win_bt[10];
                out_Renamed[11] = tmpf_15 * win_bt[11];
                out_Renamed[12] = tmpf_14 * win_bt[12];
                out_Renamed[13] = tmpf_13 * win_bt[13];
                out_Renamed[14] = tmpf_12 * win_bt[14];
                out_Renamed[15] = tmpf_11 * win_bt[15];
                out_Renamed[16] = tmpf_10 * win_bt[16];
                out_Renamed[17] = tmpf_9 * win_bt[17];
                out_Renamed[18] = tmpf_8 * win_bt[18];
                out_Renamed[19] = tmpf_7 * win_bt[19];
                out_Renamed[20] = tmpf_6 * win_bt[20];
                out_Renamed[21] = tmpf_5 * win_bt[21];
                out_Renamed[22] = tmpf_4 * win_bt[22];
                out_Renamed[23] = tmpf_3 * win_bt[23];
                out_Renamed[24] = tmpf_2 * win_bt[24];
                out_Renamed[25] = tmpf_1 * win_bt[25];
                out_Renamed[26] = tmpf_0 * win_bt[26];
                out_Renamed[27] = tmpf_0 * win_bt[27];
                out_Renamed[28] = tmpf_1 * win_bt[28];
                out_Renamed[29] = tmpf_2 * win_bt[29];
                out_Renamed[30] = tmpf_3 * win_bt[30];
                out_Renamed[31] = tmpf_4 * win_bt[31];
                out_Renamed[32] = tmpf_5 * win_bt[32];
                out_Renamed[33] = tmpf_6 * win_bt[33];
                out_Renamed[34] = tmpf_7 * win_bt[34];
                out_Renamed[35] = tmpf_8 * win_bt[35];
            }
        }