数据压缩实验五 MPEG音频编码

一、程序设计整体框架

 二、感知音频编码的设计思想

感知编码是利用人耳听觉的心理声学特性(频谱掩蔽特性和时间掩蔽特性),人耳对信号幅度、频率、时间的有限分辨能力,凡是人耳感受不到的成分不编码,不传送。对感觉得到的部分进行编码时,允许有较大的量化失真,并使其处于听阈以下,人耳依然感受不到。感知编码建立在人类听觉系统的心理声学原理之上,达到减少数据量又不降低音质的目的。

·两条线

上线:对信号进行子带分解,将PCM码流经多相滤波器组变换为32个子带的频域信号;

下线:对PCM信号进行FFT,由心理声学模型计算以频率为自变量的噪声掩蔽阈值,使量化噪声小于噪声掩蔽域值,同时通过信号掩蔽比SMR确定比例因子选择信息和动态比特分配,决定给子带分配多少量化比特数。最后通过装帧将量化后的子带的样本和边信息编码数据(比例因子选择信息、动态比特分配)以及辅助数据按照规定的帧格式组装成帧比特流输出。
 

·时-频分析的矛盾

时域上采样时间越短,时域分辨率越高,但同时频谱展宽频域分辨率下降,说明频域的分辨率和时域的分辨率之间存在矛盾。


感知音频编码系统的两条线,在保证音频整体质量的条件下获得最大的压缩比,其消除音频信号感知冗余的方式则是通过心理声学模获得音频信号的掩蔽阈。

三、心理声学模型的实现过程

·临界频带的概念

临界频带是指当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。通常认为从20Hz到16kHz有25个临界频带,单位为bark,1Bark = 一个临界频带的宽度。

·掩蔽值的计算思路
人们在安静环境中听一个声音,即使这个声音的声压级很低也可以听到,说明人耳对这个声音的听阈可以很低。但是, 在倾听一个声音的同时,如果存在另一个声音(掩蔽声),就会影响到人耳对所听声音的听闻效果,这时对所听声音的 听阈就要提高。这种由于某个声音的存在而使人耳对别的声音听觉灵敏度降低的现象,称为“掩蔽效应”。
1.将样本变换到频域:32个等分的子带信号并不能精确地反映人耳的听觉特性。引入FFT补偿频率分辨率不足的问题。
2.确定声压级别

 3.考虑安静时阈值:也即绝对阈值。在标准中有根据输入PCM信号的采样率编制的“频率、临界频带率和绝对阈值”表。

4.将音频信号分解成“乐音(tones)” 和“非乐音/噪声”部分:因为两种信号的掩蔽能力不同。

5.音调和非音调掩蔽成分的消除:利用标准中给出的绝对阈值消除被掩蔽成分;考虑在每个临界频带内,小于0.5Bark的距离中只保留最高功率的成分

6.单个掩蔽阈值的计算:音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。
7.全局掩蔽阈值的计算:
8.每个子带的掩蔽阈值:选择出本子带中最小的阈值作为子带阈值

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]);
		}
	}

·噪声

 ·乐音

·混合

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值