长窗型MDCT转换过程

时间:2022-01-02 11:56:32

长窗型MDCT转换过程

 

 

对指定次频带的36个样本点进行 Long Window MDCT 的过程

 

假令: 36个次频带信号输入为 double *in, 18MDCT输出为 double *out

 

 

 

 

 

  长窗型MDCT转换过程

 

长分析窗 Long Window

  长窗型MDCT转换过程

// ------------- 长分析窗伪代码-------------

 

double win[ 36 ];

double z[ 36 ];

 

for(i=36; i--; )

{

    win[i] = sin( (PI/36) * (i+1/2) ); // 计算sin部分

}

for(i=36; i--; )

{

    z[i] = in[i] * win[i];   // 对输入加长窗

}

 

 

MDCT运算式

其中xr[i]表示第i个频谱系数

  长窗型MDCT转换过程

cos函数的伪代码为 :

double cos_l[18][36];

// N = 36;

for (i = 0; i < 18; i++ )   // for i=0 to (N/2 – 1)

{

    for (k = 0; k < 36; k++ )   // for k=0 to N-1

     {

        cos_l[i][k] = cos( (PI/(2*36)) * (2*k+1+(36/2)) * (2*i+1) ) / (9);

}

}

/* 18个频谱系数 */

for(i=18; i--; )

{

    out[i] = 0.0;

    for(k=35; k--)

    {

       out[i] += z[k] * cos_l[i][k];

       /*

       其中z[k] = in[k] * win[k]; :

out[i] += (in[k] * win[k]) * cos_l[i][k];

        */

    }

}

 

 

Shine实现

// --------------------- shine MDCT ---------------------

/**

 * Function: Calculation of the MDCT                              

 * In the case of long blocks ( block_type 0,1,3 ) there are      

 * 36 coefficents in the time domain and 18 in the frequency      

 * domain.

 * FUNC : 对一个指定次频带的信号进行MDCT

*

 * 计算长窗(block_type 0,1,3)MDCT

 * 时域36输入(同一个次频带的36个样本), 频域18输出.

 * 将同一个次频带的36个样本转换为18频谱系数

 *

 * 关于block_type

 * MP3MDCT变换时一共有四种窗

 * 0 Long Window

 * 1 Long-Short Window

 * 2 Short Window

 * 3 Short-Long Window

 *

 * in  --- 处于同一次频带的36个样本点. 其中前18个为颗粒1内的, 18个为颗粒2内的

 * out --- 18个频谱系数

 */

static void mdct( double *in, double *out )

{

    int k, m;

   

    /* 18个频谱系数 */

    for(m=18; m--; )

{

    /* 这里无法理解啊 */

        out[m] = win[35] * in[35] * cos_l[m][35];

        for(k=35; k--; )

       {

            out[m] += win[k] * in[k] * cos_l[m][k];

        }

    }

}