一、实验原理
1.MPEG-1 Audio LayerII 编码器原理
-
心理声学模型:根据人耳的听觉阈值和听觉掩蔽特性建立的模型,可以通过这个模型消除更多的冗余数据,计算信号中不可听觉感知的部分
-
多相滤波器组(Polyphase Filter Bank):将PCM样本变换到32个子带的频域信号,如果输入的采样频率为48kHz,那么子带的频率宽度为48/(2*32)=0.75Hz
滤波器组:分出32个频带,每个频带有12个点
-
比特分配器(Bit Allocator):根据心理声学模型的计算结果,为每个子带信号分配比特数
动态比特分配:听不到的不编,听的不好的少编 -
比例因子提取:告诉ABC频带最大值
-
比例因子选择:选择4种情况中的一种
-
颗粒形成:形成码流
2.动态比特分配
信噪比:没减少一个比特,信噪比减少 6 dB
此时目标码率足够分配,如果不够分配,则分配到哪里就在哪里停止
二、实验要求
1.
- 理解程序设计的整体框架
- 理解感知音频编码的设计思想
- 两条线
时-频分析的矛盾
- 两条线
- 理解心理声学模型的实现过程
- 临界频带的概念
掩蔽值计算的思路
- 临界频带的概念
- 理解码率分配的实现思路
2.
- 输出音频的采样率和目标码率
- 选择三个不同特性的音频文件
- 噪声(持续噪声、突发噪声)
音乐
混合
- 噪声(持续噪声、突发噪声)
- 某个数据帧,输出
- 该帧所分配的比特数
该帧的比例因子
该帧的比特分配结果
- 该帧所分配的比特数
三、实验代码
1. 输出音频的采样率和目标码率
void print_config (frame_info * frame, int *psy, char *inPath,
char *outPath)
{
frame_header *header = frame->header;
if (glopts.verbosity == 0)
return;
fprintf (stderr, "--------------------------------------------\n");
fprintf (stderr, "Input File : '%s' %.1f kHz\n",
(strcmp (inPath, "-") ? inPath : "stdin"),
s_freq[header->version][header