一、程序设计整体框架
二、感知音频编码的设计思想
感知编码是利用人耳听觉的心理声学特性(频谱掩蔽特性和时间掩蔽特性),人耳对信号幅度、频率、时间的有限分辨能力,凡是人耳感受不到的成分不编码,不传送。对感觉得到的部分进行编码时,允许有较大的量化失真,并使其处于听阈以下,人耳依然感受不到。感知编码建立在人类听觉系统的心理声学原理之上,达到减少数据量又不降低音质的目的。
·两条线
上线:对信号进行子带分解,将PCM码流经多相滤波器组变换为32个子带的频域信号;
下线:对PCM信号进行FFT,由心理声学模型计算以频率为自变量的噪声掩蔽阈值,使量化噪声小于噪声掩蔽域值,同时通过信号掩蔽比SMR确定比例因子选择信息和动态比特分配,决定给子带分配多少量化比特数。最后通过装帧将量化后的子带的样本和边信息编码数据(比例因子选择信息、动态比特分配)以及辅助数据按照规定的帧格式组装成帧比特流输出。
·时-频分析的矛盾
时域上采样时间越短,时域分辨率越高,但同时频谱展宽频域分辨率下降,说明频域的分辨率和时域的分辨率之间存在矛盾。
感知音频编码系统的两条线,在保证音频整体质量的条件下获得最大的压缩比,其消除音频信号感知冗余的方式则是通过心理声学模获得音频信号的掩蔽阈。
三、心理声学模型的实现过程
·临界频带的概念
临界频带是指当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。通常认为从20Hz到16kHz有25个临界频带,单位为bark,1Bark = 一个临界频带的宽度。
3.考虑安静时阈值:也即绝对阈值。在标准中有根据输入PCM信号的采样率编制的“频率、临界频带率和绝对阈值”表。
4.将音频信号分解成“乐音(tones)” 和“非乐音/噪声”部分:因为两种信号的掩蔽能力不同。
5.音调和非音调掩蔽成分的消除:利用标准中给出的绝对阈值消除被掩蔽成分;考虑在每个临界频带内,小于0.5Bark的距离中只保留最高功率的成分
9.计算每个子带信号掩蔽比:SMR = 信号能量 / 掩蔽阈值
四、码率分配的实现思路
在调整到固定的码率之前,先确定可用于样值编码的有效比特数 这个数值取决于比例因子、比例因子选择信息、比特分配信息以及辅助数据所需比特数。对每个子带计算掩蔽-噪声比MNR,是信噪比SNR–信掩比SMR,即:MNR = SNR–SMR。为了使整帧和每个子带的总噪声—掩蔽比最小,使用循环算法:NMR = SMR– SNR (dB) 对最高NMR的子带分配比特,使获益最大的子带的量化级别增加一级 重新计算分配了更多比特子带的NMR,直到没有比特可用。
五、实验内容
5.1 输出音频的采样率和目标码率
5.2 选择三个不同特性的音频文件某个数据帧,输出该帧所分配的比特数、该帧的比例因子、该帧的比特分配结果
(1)输出分配比特数
if (frameNum == 1)
{
//输出可用比特数
fprintf(result, "可用比特数:%d\n", adb);
}
(2)输出比例因子
if (frameNum == 1)
{
//输出比例因子
fprintf(result, "\n比例因子:\n");
for (int i = 0; i < SBLIMIT; i++)
{
fprintf(result, "子带%d:\t", i);
for (int j = 0; j < 3; j++)
{
fprintf(result, "%d\t", scalar[k][j][i]);
}
fprintf(result, "\n");
}
}
(3)输出比特分配结果
if (frameNum == 1)
{
//输出比特分配结果
fprintf(result, "\n比特分配\n");
for (int i = 0; i < SBLIMIT; i++)
{
fprintf(result, "子带%d:\t", i);
fprintf(result, "%d\n", bit_alloc[k][i]);
}
}
·噪声
·乐音
·混合