长窗型MDCT转换过程
对指定次频带的36个样本点进行 Long Window MDCT 的过程
假令: 36个次频带信号输入为 double *in, 18个MDCT输出为 double *out
注 解
长分析窗 Long Window
// ------------- 长分析窗伪代码-------------
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个频谱系数
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
* domain.
* FUNC : 对一个指定次频带的信号进行MDCT
*
* 计算长窗(block_type 0,1,3)MDCT
* 时域36输入(同一个次频带的36个样本), 频域18输出.
* 将同一个次频带的36个样本转换为18频谱系数
*
* 关于block_type
* MP3在MDCT变换时一共有四种窗
* 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];
}
}
}