1 实验目的
- 理解感知音频编码的设计思想(两条线,时-频分析的矛盾)
- 理解心理声学模型的实现过程(临界频带的概念,掩蔽值计算的思路)
- 理解码率分配的实现思路
2 实验原理
2.1 感知音频编码原理
分为两条线,分别用红框和绿框框起来了。
- 第一条线,将输入的音频子带分解,形成32个子带。我们希望对于每个频带中的所有点使用相同的量化bit数进行量化,这就要求每个频带中的点的值不能相差太大,于是我们应将信号时间取得很短,由于语音信号的短时平稳性,每个频带中的点就比较接近了。
- 第二条线,对于输入的音频信号,我们希望找到能够表征它的性质的心理声学模型,心理声学模型的横坐标是频率,纵坐标是阈值。为了使模型与实际更为接近,我们希望频率分得越细越好,即频率分辨率越高越好,这就与第一条线中对于时域分辨率的要求相矛盾了。
几个重要模块:
1. 比例因子选择
- 对各个子带每12个样点进行一次比例因子的计算,找出12个样点中绝对值的最大值。查比例因子表中比这个最大值大的最小值作为比例因子。
- MPEG-2的一帧对应36个子带样值,是MPEG-1的3倍,原则上要传3个比例因子,但为了降低比例因子的传输码率,采用了人耳时域掩蔽特性的编码策略,每个块(12个样点)找出一个最大的作为比例因子,然后比较三个块的比例因子,如果三个块差不多,则用一个代表;若某两个块差不多,则这两个块用同一个比例因子,另一个块用一个;其余情况同理。
2. 动态比特分配
- 该模块有两个输入:(目标)码率、心理声学模型
- 目标:使整个一帧和每个子带的总噪声-掩蔽比最小
- 心理声学模型的输出为信掩比,信掩比和噪掩比有如下关系:
N M R = S M R − S N R NMR = SMR - SNR NMR=SMR−SNR
即 噪 掩 比 = 信 掩 比 − 信 噪 比 噪掩比=信掩比- 信噪比 噪掩比=信掩比−信噪比
码率分配的实现思路:初始还未分配bit时,信噪比为0,噪掩比等于信掩比。优先对噪掩比高的子带分配bit,使获益最大的子带的量化级别增加一级。量化比特数每增加1bit,信噪比会上升6dB,噪掩比会下降6dB。对该子带重新计算噪掩比,重复上述过程,直到所有子带噪掩比等于0或者bit数用完。
2.2 心理声学模型
听觉系统中存在一个听觉阈值电平,低于这个电平的声音信号就听不到。
- 听觉阈值的大小随声音频率的改变而改变
- 一个人是否听得到声音取决于声音的频率以及声音的幅度是否高于这种频率下的听觉阈值。
临界频带:临界频带是指当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带带宽。
掩蔽阈值:
- 单个掩蔽阈值的计算
音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。 - 全局掩蔽阈值的计算
还要考虑别的临界频带的影响。一个掩蔽信号会对其它频带上的信号产生掩蔽效应。这种掩蔽效应称为掩蔽扩散。
3 输出音频的采样率和目标码率
代码中已经有输出音频采样率和目标码率的语句:
我们可以先通过在命令行中键入“-h”来根据提示设定命令行参数
设定命令行参数:
运行结果:
4 对于某个数据帧,输出量化编码信息
- 该帧所分配的比特数
- 该帧的比例因子
- 该帧的比特分配结果
在m2aenc.c
中添加如下代码:
在main
函数中添加如下代码:
运行后,结果:
已成功生成txt文件:
为了使输出信息统一,我们增加如下代码,使采样频率和目标码率也输出到该txt文件中:
运行后:
5 对比不同特性的音频文件
5.1 噪声
- 持续噪声
用手机录制了一段手挠桌子的声音作为源文件。
运行后:
- 突发噪声
用手机录制了一段手拍桌子的声音作为源文件。
运行后:
5.2 音乐
仍选用之前的test.mp2文件作为源文件。
运行后: