MPEG音频编码实验

MPEG-1 Audio LayerII编码器原理

在这里插入图片描述
◼ 多相滤波器组(Polyphase Filter Bank):将 PCM样本变换到32个子带的频域信号
在这里插入图片描述
如果输入的采样频率为48kHz,那么子带的频率 宽度为48/(2*32)=0.75Hz ◼ 心理声学模型(Psychoacoustic Model):计算 信号中不可听觉感知的部分 计算噪声遮蔽效应
◼ 比特分配器(Bit Allocator):根据心理声学模 型的计算结果,为每个子带信号分配比特数
◼ 装帧(Frame Creation):产生MPEG-I兼容的 比特流

MPEG-I 心理声学模型

◼ 通过子带分析滤波器组使信号具有高的时间 分辨率,确保在短暂冲击信号情况下,编码 的声音信号具有足够高的质量
◼ 又可以使信号通过FFT运算具有高的频率分 辨率,因为掩蔽阈值是从功率谱密度推出来 的。
◼ 在低频子带中,为了保护音调和共振峰的结 构,就要求用较小的量化阶、较多的量化级 数,即分配较多的位数来表示样本值。而话 音中的摩擦音和类似噪声的声音,通常出现 在高频子带中,对它分配较少的位数

【几个概念】
听觉阈值
在这里插入图片描述
频域掩蔽域
在这里插入图片描述
临界频带
临界频带是指当某个纯音被以它为中心频率、且具有一定带 宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等 于这一频带内的噪声功率,这个带宽为临界频带宽度。

人耳听觉系统
在这里插入图片描述
1.掩蔽声对被掩蔽声的掩蔽效应,取决于两者的频率与强度的关系
2.掩蔽言语声和短声等宽频谱信号,则常用白噪声。因此,在 听觉诱发反应测试中,往往在健侧耳施加白噪声作为掩蔽噪 声。

MPEG-I 标准定义了两个模型
◼ 心理声学模型1:
计算复杂度低
但对假设用户听不到的部分压缩太严重
◼ 心理声学模型2 :
提供了适合Layer III编码的更多特征

编码
码率分配
计算噪声-掩蔽比(NMR): NMR = SMR – SNR (dB)
在这里插入图片描述
装帧
在这里插入图片描述

实验要求

理解程序设计的整体框架


/************************************************************************
*
* main
*
* PURPOSE:  MPEG II Encoder with
* psychoacoustic models 1 (MUSICAM) and 2 (AT&T)//心理声学模型
*
* SEMANTICS:  One overlapping frame of audio of up to 2 channels are
* processed at a time in the following order:
* (associated routines are in parentheses)//最多按以下顺序一次处理最多2个通道的一个重叠音频帧
*
* 1.  Filter sliding window of data to get 32 subband
* samples per channel.
* (window_subband,filter_subband)//过滤数据滑动窗口以获取每个通道32个子带样本
*
* 2.  If joint stereo mode, combine left and right channels
* for subbands above #jsbound#.//如果是联合立体声模式,请为#jsbound#以上的子带组合左右声道
* (combine_LR)
*
* 3.  Calculate scalefactors for the frame, and 
* also calculate scalefactor select information.//计算比例因子,并计算比例因子选择信息。
* (*_scale_factor_calc)
*
* 4.  Calculate psychoacoustic masking levels using selected
* psychoacoustic model.//使用选定的心理声学模型计算心理声学掩蔽电平。
* (psycho_i, psycho_ii)
*
* 5.  Perform iterative bit allocation for subbands with low
* mask_to_noise ratios using masking levels from step 4.//使用步骤4中的掩蔽电平,对具有低掩蔽比的子带执行迭代位分配。
* (*_main_bit_allocation)
*
* 6.  If error protection flag is active, add redundancy for
* error protection.//若是需要,就添加CRC纠错
* (*_CRC_calc)
*
* 7.  Pack bit allocation, scalefactors, and scalefactor select
*headerrmation onto bitstream.//将比特分配,比例因子和比例因子打包到比特流中。
* (*_encode_bit_alloc,*_encode_scale,transmission_pattern)
*
* 8.  Quantize subbands and pack them into bitstream//量化子带并将其打包成比特流
* (*_subband_quantization, *_sample_encoding)
*
************************************************************************/



具体思路代码已经给出得很详细,具体:
1.对滑动窗口内的音频信号进行了32子带滤波;
2.如果有立体声,就分别加入左右声道;
3.计算这一帧的比例因子及比例因子选择信息
4.使用选定的心理声学模型计算心理声学掩蔽水平;
5.使用步骤4中的掩蔽电平,对具有低掩蔽比的子带执行迭代位分配;
6.如果需要的话,就添加CRC纠错(误码检测CRC:使用一种16bit奇偶校验字,可供在比特流 中作检测误码用。在所有层都相同);
7.将比特分配,比例因子和比例因子信息打包到比特流中;
8.量化子带并将其打包成比特流

理解感知音频编码的设计思想
两条线
MPEG音频编码分为上下两条线。上面一条线是音频编码的主线部分,下面一条线是计算线性量化器的量化比特数,应用了心理声学模型。

时-频分析的矛盾!
增加时域的分辨力,会对频域的分辨力有所限制。

理解心理声学模型的实现过程
临界频带的概念
已经在上面给出

掩蔽值计算的思路
#单个掩蔽阈值的计算
音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。
#全局掩蔽阈值的计算
还要考虑别的临界频带的影响。一个掩蔽信号会对其它频带上的信号产生掩蔽效应。这种掩蔽效应称为掩蔽扩散。
#每个子带的掩蔽阈值
选择出本子带中最小的阈值作为子带阈值。
对高频不正确——高频区的临界频带很宽,可能跨越多个子带,从而导致模型1将临界带宽内所有的非音调部分集中为一个代表频率,当一个子带在很宽的频带内却远离代表频率时,无法得到准确的非音调掩蔽值。但计算量低。
#计算每个子带信号掩蔽比
SMR = 信号能量 / 掩蔽阈值,并将SMR传递给编码单元。

◼ 理解码率分配的实现思路
本实验使用的比特分配的函数是a_bit_allocation

◼ 输出音频的采样率和目标码率

◼ 选择三个不同特性的音频文件
噪声(持续噪声、突发噪声)
音乐
混合

◼ 某个数据帧,输出
该帧所分配的比特数

int main (int argc, char **argv)
{
   、、、
   int i,j,k;
   、、、
   FILE* OUTFile;
   OUTFile = fopen("outfile.txt","w");
   、、、
   if(frameNum==6)
   {
   	fprintf(OUTFile, "第 %d 帧\n", frameNum);
   	fprintf(OUTFile,"可用比特数:%d\n",adb);
   }
}

该帧的比例因子

if(frameNum==6)
  {
  	fprintf(OUTFile,"比例因子为:\n");
  	for(i=0;i < nch ; i++)
  	{
  		
  		fprintf(OUTFile,"声道[%d]:\n",i+1);
  		for(j=0;j<frame.sblimit;j++)
  		{
  			fprintf(OUTFile,"子带[%d]: ",j+1);
  			for(k=0;k<3;k++)
  			{
  				fprintf(OUTFile,"%d\t",scalar[i][k][j]);
  			}
  			fprintf(OUTFile,"\n");
  		}
  	}
  }

该帧的比特分配结果


if(frameNum==6)
		{
	   		fprintf(OUTFile, "\n比特分配\n");
	   		for (k = 0; k < nch; k++)//声道
	   			{
	   				 fprintf(OUTFile, "声道[%d]:\n", k + 1);
	    			for (i = 0; i < frame.sblimit; i++)//每个子带有一个比特分配结果
	    				{
						    fprintf(OUTFile, "子带[%d]:\t", i);
	     					fprintf(OUTFile, "%d\n", bit_alloc[k][i]);
	    				}
	   			}
	   	}

【实验结果】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值