MPEG 音频编码实验

一.实验项目名称

MPEG 音频编码实验

二.实验原理

1. MPEG-1 Audio LayerII 编码器原理
在这里插入图片描述
2. 多相滤波器组

将 PCM 样本变换到 32 个子带的频域信号:
在这里插入图片描述
3. MPEG-I 心理声学模型

  • 通过子带分析滤波器组使信号具有高的时间分辨率,确保在短暂冲击信号情况下,编码
    的声音信号具有足够高的质量
  • 又可以使信号通过 FFT 运算具有高的频率分辨率,因为掩蔽阈值是从功率谱密度推出来的
  • 在低频子带中,为了保护音调和共振峰的结构,就要求用较小的量化阶、较多的量化级数,即分配较多的位数来表示样本值。而话音中的摩擦音和类似噪声的声音,通常出现在高频子带中,对它分配较少的位数
  • MPEG I 标准定义了两个模型
    心理声学模型 1:计算复杂度低,但对假设用户听不到的部分压缩太严重
    心理声学模型 2:提供了适合 Layer III 编码的更多特征
    实际实现的模型复杂度取决所需要的压缩因子:如大的压缩因子不重要,则可以完全不用心理
    声学模型。此时位分配算法不使用 SMR( Signal Mask Ratio ),而是使用 SNR
  • 将样本变换到频域
    32 个等分的子带信号并不能精确地反映人耳的听觉特性。引入 FFT 补偿频率分辨率不足的问题。
  • 确定声压级别
    在这里插入图片描述
  • 考虑安静时阈值
    也即绝对阈值。在标准中有根据输入 PCM 信号的采样率编制的“频率、临界频带率和绝对阈值”表。此表为多位科学家经多次心理声学实验所得。
  • 将音频信号分解成“乐音 (tones)” 和“非乐音/噪声”部分
    因为两种信号的掩蔽能力不同
    在这里插入图片描述
  • 音调和非音调掩蔽成分的消除
    利用标准中给出的绝对阈值消除被掩蔽成分;考虑在每个临界频带内,小于 0.5Bark 的距离中只保留最高功率的成分
  • 单个掩蔽阈值的计算
    音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得
  • 全局掩蔽阈值的计算在这里插入图片描述
    还要考虑别的临界频带的影响。一个掩蔽信号会对其它频带上的信号产生掩蔽效应。这种掩蔽效应称为掩蔽扩散。

在这里插入图片描述

  • 每个子带的掩蔽阈值
    选择出本子带中最小的阈值作为子带阈值;
    对高频不正确——高频区的临界频带很宽,可能跨越多个子带,从而导致模型 1 将临界带宽内所有的非音调部分集中为一个代表频率,当一个子带在很宽的频带内却远离代表频率时,无法得到准确的非音调掩蔽值。但计算量低
  • 计算每个子带信号掩蔽比 (signal to mask ratio, SMR)
    SMR = 信号能量 / 掩蔽阈值,并将 SMR 传递给编码单元

4. Layer I 编码

  • 码率分配
    在调整到固定的码率之前,先确定可用于样值编码的有效比特数,这个数值取决于比例因子、比例因子选择信息、比特分配信息以及辅助数据所需比特数
    比特分配的过程:对每个子带计算掩蔽 噪声比 MNR ,是信噪比SNR-信掩比 SMR,即: MNR = SNR-SMR,NMR=SMR-SNR
    算法: 使整帧和每个子带的总噪声-掩蔽比最小,计算噪声-掩蔽比(noise-to-mask ratio, NMR)
    NMR = SMR-SNR (dB),其中 SNR 由 MPEG I 标准给定(为量化水平的函数), NMR:表示波形误差与感知测量之间的误差;循环,直到没有比特可用,最高 NMR 的子带分配比特,使获益最大的子带的量化级别增加一级,重新计算分配了更多比特子带的 NMR
    在这里插入图片描述
  • 装帧
    在这里插入图片描述

5. Layer II 编码

  • 概述
    与 Layer I 类似,但 对 Layer I 有增强:装帧、缩放因子表示、量化,缩放因子(比例因子)一般从低频子带到高频子带出现连续下降
    帧:3组/帧 x 12 个样本/子带 x 32 个子带/帧 = 1152 个样本/帧→每个样本的 overhead 更少
    缩放因子:每个子带的 3 个组尽可能共用缩放因子,Layer I 1个 /12个样本,Layer II 1个/(24/36)个样本,1/2/3 个缩放因子和缩放因子选择信息 (scale factor selection information, SCFSI)(每子带 2 比特)一起传送
  • 量化
    Layer I :每个子带从相同的量化集合中选择,每个子带取共 14 个量化器中的一个
    在这里插入图片描述
    Layer II:根据采样和码率量化,不同子带可以从不同的量化器集合中选择,对量化级别在3、5、9级时,采用“颗粒” 优化
  • 装帧
    在这里插入图片描述

三.实验关键代码

scale_factor_calc (*sb_sample, scalar, nch, frame.sblimit);
    pick_scale (scalar, &frame, max_sc);
	int sb, gr, ch;
	if (frameNum == 3)
	{
		fprintf(stderr,"Frame number :%d\n",frameNum);//输出选取的数据帧
		fprintf(stderr, "samplingrate:%.1fkhz\n", s_freq[header.version][header.sampling_frequency]);//采样率
		fprintf(stderr, "target bitrate:%dMbps\n", bitrate[header.version][header.bitrate_index]);//目标码率
		fprintf(stderr, "\nScale_Factor:\n");//比例因子
		for (ch = 0; ch < nch; ch++)
		{
			fprintf(stderr, "channel[%d]\n", ch + 1);//声道
			for (sb = 0; sb < frame.sblimit; sb++)
			{
				fprintf(stderr, "subband[%d]:   ", sb + 1);//子带
				for (gr = 0; gr < 3; gr++)
				{
					fprintf(stderr, "%d   ", scalar[ch][gr][sb]);
				}
				fprintf(stderr, "\n");
			}
		}
	}
main_bit_allocation (smr, scfsi, bit_alloc, &adb, &frame, &glopts);
	/*add by cy*/
	if (frameNum == 3)
	{
		fprintf(stderr, "\nbit_allocation:\n");//比特分配
		for (ch = 0; ch < nch; ch++)
		{
			fprintf(stderr, "channel[%d]\n", ch + 1);//声道
			for (sb = 0; sb < frame.sblimit; sb++)
			{
				fprintf(stderr, "subband[%d]:   %d\n", sb + 1, bit_alloc[ch][sb]);//子带
			}
		}
	}

四.实验结果

输出结果如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值