一、实验原理
编码器说明:
如上框图所示,输入声音信号分两条线进行处理。
输入信号经过多想滤波器组,变换到多个自带。同时经过心理声学模型计算以频率为自变量的噪声掩蔽阈值。量化和编码部分用信掩比SMR决定分配给自带信号的量化比特数,使量化噪声小于掩蔽阈值。最后通过数据帧包装将量化的子带样本和其他数据按照规定帧格式组装成比特数据流。
1、多相滤波器组:将频带划分为32个相等的子带。
2、比例因子的取值和编码
对各个子带每12个样点进行一次比例因子计算。先定出12个样点中绝对值的最大值。查比例因子表中比这个最大值大的最小值作为比例因子。用6比特表示。
- 第2层的一帧对应36个子带样值,是第1层的三倍,原则上要传三个比例因子。为了降低比例因子的传输码率,采用了利用人耳时域掩蔽特性的编码策略。
- 每帧中每个子带的三个比例因子被一起考虑,划分成特定的几种模式。根据这些模式,1个、2个或3个比例因子和比例因子选择信息(每子带2比特)一起被传送。如果一个比例因子和下一个只有很小的差别,就只传送大的一个,这种情况对于稳态信号经常出现。
- 使用这一算法后,和第1层相比,第2层传输的比例因子平均减少了2个,即传输码率由22.5Kb/s降低到了7.5Kb/s。
3、比特分配及编码
对每个子带计算掩蔽-噪声比MNR,是信噪比SNR –信掩比SMR,即:MNR = SNR –SMR
通俗而言,比特分配类似于分配食物,饭量大的分的多,饭量小的分的少。对于音频信号来说,比特分配过程:
- 使整个一帧和每个子带的总噪声-掩蔽比最小。这是一个循环过程,每一次循环使获益最大的子带的量化级别增加一级,当然所用比特数不能超过一帧所能提供的最大数目
- 第1层一帧用4比特给每个子带的比特分配信息编码;而第2层只在低频段用4比特,高频段则用2比特
3、子带样值的量化和编码
- 输入以12个样本为一组,每组样本经过时间-频率变换之后进行一次比特分配并记录一个比例因子(scale factor)
- 比特分配信息告诉解码器每个样本由几位表示,比例因子用6比特表示,解码器使用这个6比特的比例因子乘逆量化器的每个输出样本值,以恢复被量化的子带值。比例因子的作用是充分利用量化器的量化范围,通过比特分配和比例因子相配合,可以表示动态范围超过120dB的样本。
- 第2层中,量化级别的数目随子带的不同而不同,但量化等级仍然覆盖了3~65535的范围,同时子带不被分配给比特的概率增加了,没有分配给比特的子带就不被量化。低频段的量化等级有15级,中频段7级,高频段只有3级
4、心理声学模型
32个等分的子带信号并不能精确地反映人耳的听觉特性。引入FFT补偿频率分辨率不足的问题。
本实验中,每帧1152个样本点,每帧两次1024点的FFT计算,选择两个信号掩蔽比(SMR)中较小的一个,将SMR传递给编码单元。
二、实验流程
1、输出音频的采样率和目标码率
2、选择某个数据帧,输出
2、选择某个数据帧,输出
- 该帧所分配的比特数
- 该帧的比例因子
- 该帧的比特分配结果
三、核心代码
FILE *output=NULL; //开文件用于输出
output=fopen("output.txt","w");
if(frameNum==100)
{
int k,t,i;
fprintf(output,"sample_rate=%.1f khz\n",s_freq[header.version][header.sampling_frequency]);///输出采样率
fprintf(output,"bitrate=%d kbps\n", bitrate[header.version][header.bitrate_index]);///输出目标码率
fprintf(output,"frameNum=%d\n",frameNum);
fprintf(output,"available_bits=%d\n",adb);///输出该帧的可用比特数
fprintf(output,"scale_factors:\n");///输出该帧的比例因子
for(k=0;k<nch;k++)
{
fprintf(output,"channel[%d]\n",k);
for(i=0;i<frame.sblimit;i++)
{
fprintf(output,"subband[%d]:",i);
for(t=0;t<3;t++)
{
fprintf(output,"%d\t",scalar[k][t][i]);
}
fprintf(output,"\n");
}
}
}
if(frameNum==100)
{
int k,i;
fprintf(output,"bit_allocation:\n");///输出该帧的比特分配结果
for(k=0;k<nch;k++)
{
fprintf(output,"channel[%d]\n",k);
for(i=0;i<frame.sblimit;i++)
{
fprintf(output,"subband[%d]:%d\n",i,bit_alloc[k][i]);
}
}
}
四、实验结果
分析:
由输出的比特分配可知,低频子带分配比特数多,高频比特少。
人耳对低频敏感对高频不敏感,所以低频比例因子小,高频大,从而实现压缩。