数据压缩9 | MPEG音频编码

一 实验原理

1.1 人类听觉系统的感知特性

频域掩蔽特性

频域掩蔽域随声压级变化曲线

一个高强度纯音会使得该频率附近的最小可听阈曲线提升,掩蔽掉在其下的(原本能听到的)声音。这个纯音称为掩蔽声,掩蔽声存在时,音调音刚刚能被听到时的阈值称为掩蔽阈值。因此在编码时,可以去除掩蔽阈值以下的信号分量,并忽略可能会被掩蔽的量化噪声

  • 听觉阈值电平 听觉系统中存在一个听觉阈值电平,低于这个电平的声 音信号就听不到 。听觉阈值的大小随声音频率的改变而改变,一个人是否听到声音取决于声音的频率,以及声音 的幅度是否高于这种频率下的听觉阈值 。
  • 听觉掩蔽特性 听觉阈值电平是自适应的,会随听到的不同频率声音而发生变化

临界频带

临界频带具有两种等价的定义:

    定义一:当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度;

    定义二:如果增大掩蔽信号覆盖的频率范围,超过到某个值后掩蔽效应不再随着带宽的增大而增强,这个临界的带宽就称为临界频带。

其单位为Bark,代表一个临界频带的宽度。

通常认为,在20 Hz—16 kHz的范围内有25个临界频带(500 Hz以下每个临界频带的带宽大约是100 Hz,500 Hz以上的临界频带带宽逐渐增加)。

人类听觉系统

人类听觉系统可以大致等效为在0 Hz—20 kHz范围内的25个重叠的带通滤波器组。

    人耳在噪声中听某一纯音信号时,只启用中心频率与信号频率相同的那个听觉滤波器,且只有纯音信号和在通带范围内的部分信号可通过该滤波器。只有通过该滤波器的噪声才对掩蔽起作用;

    聆听复音时启动多个听觉滤波器。听觉能够计算各滤波器输出端的信噪比。当信噪比达到或者超过听阈因子时,即可听到该频率成分。

1.2 MPEG音频编码流程

三个独立的压缩层次:

  • Layer1采用每声道192kbit/s,每帧384个样本,32个等宽子带,固定分割数据块。子带编码用DCT(离散余弦变换)和(快速傅立叶变换)计算子带信号量化bit数。采用基于频域掩蔽效应的心理声学模型,使量化噪声低于掩蔽值。量化采用带死区的线性量化器,主要用于数字盒式磁带(DCC)。较为简单
  • Layer2采用每声道128kbit/s,每帧1152个样本,32个子带,属不同分帧方式。采用共同频域和时域掩蔽效应的心理声学模型,并对高、中,低频段的比特分配进行限制,并对比特分配、比例因子,取样进行附加编码。Layer2 广泛用于数字电视,CD-ROM,CD-I和VCD等。比较复杂
  • Layer3采用每声道64kbit/s,用混合滤波器组提高频率分辨率,按信号分辨率分成6X32或18X32个子带,克服平均32个子带的Layer1,Layer2在中低频段分辨率偏低的缺点。采用心理声学模型2,增设不均匀量化器,量化值进行熵编码。主要用于ISDN(综合业务数字网)音频编码。最为复杂

MPEG-1 Audio Layer II编码器框图:

 

多项滤波器

数字音频信号通过一个多相滤波器组,变换成32个等宽频带子带,使得信号具有较高的时间分辨率,确保在短暂冲击信号的情况下,编码的声音信号具有足够高的质量。

但需要说明的是,高时域分辨率和高频域分辨率是不可兼得的,我们需要做出权衡。

滤波器组的输出是临界频带经过量化的系数样值。若一个子带覆盖多个临界频带,则选择具有最小NMR的临界频带来计算分配给子带的比特数。
 

心理声学模型

心理声学模型决定了各个子带中允许的最大量化噪声,小于它的量化噪声都会被掩蔽。若子带内的信号功率小于掩蔽阈值,则不进行编码;否则,确定要编码的系数所需的比特数,使量化引起的噪声低于掩蔽效应

  • 32 个等分的子带信号并不能精确地反映人耳的听觉特性。引入 FFT 补偿频率分辨率不足的问题。
  • 确定声压级别
  • 考虑安静时阈值。 也即绝对阈值。在标准中有根据输入 PCM 信号的采 样率编制的“频率、临界频带率和绝对阈值”表。
  • 因为两种信号的掩蔽能力不同,将音频信号分解成“乐音(tones)” 和“非乐音/噪声” 。

  • 音调和非音调掩蔽成分的消除。 利用标准中给出的绝对阈值消除被掩蔽成分; 考虑在每个临界频带内,小于 0.5Bark 的距离 中只保留最高功率的成分。
  • 单个掩蔽阈值的计算。 音调成分和非音调成分单个掩蔽阈值根据标 准中给出的算法求得。
  • 全局掩蔽阈值的计算。

     

  •  计算每个子带信号掩蔽比(signal-to-mask ratio, SMR) SMR = 信号能量 / 掩蔽阈值,并将SMR传递给编码单元

量化编码

(1)码率分配

过程:

  1. 对每个子带计算掩蔽-噪声比MNR,是信噪比SNR –信掩比SMR,即:MNR = SNR –SMR
  2. 循环计算,使整个一帧和每个子带的总噪声-掩蔽比最小。每一次循环使获益最大的子带的量化级别增加一级,当然所用比特数不能超过一帧所能提供的最大数目。

(2)计算比例因子

  • 对各个子带每36个样点(Layer I为12个样点)进行一次比例因子的计算,先确定12个连续样值中的最大值,查Layer II、Layer I比例因子表中比这它大的最小值作为量化比例因子;
  • 每12个样值计算出一个比例因子,Layer II中将每个子带分为3组,每组各有12个取样值,因此36个样值具有3个比例因子;
  • 比例因子以使得比较准确地计算出子带的声压级;
  • 一般比例因子从低频子带到高频子带连续下降;

帧比特流形成

其中每个子带中前后相邻的连续36个样值(3组12个样值)共用在这个子带比特分配值,36个样值中的同一组样值共用该组的比例因子;同一时刻的32个子带样值放在一起;Layer II每帧包含1152个PCM样值(为Layer I的三倍);若取样频率为48 kHz,一帧相当于1152 / 48k = 24 ms的声音样值,因此Layer II的精确度为24 ms(为Layer I的三倍,因而更精确)。

二 实验代码

根据实验要求,补充代码

m2aenc.c中声明全局变量

#define InfoTrace 1
FILE* TraceInfoFp;

trace用法可见上期博客

main()函数中添加

pick_scale (scalar, &frame, max_sc);

-----

#if InfoTrace
	TraceInfoFp=fopen("TraceInfo.txt", "w");
	if (frameNum == 2)
	{
		/* 比例因子 */
		fprintf(TraceInfoFp, "========== 比例因子 ==========\n");
		for (ch = 0; ch < nch; ch++)	// 每个声道单独输出, ch 为当前声道,nch 为总声道数
		{
			fprintf(TraceInfoFp, "------ 声道%d ------\n", ch + 1);
			for (sb = 0; sb < frame.sblimit; sb++)	// sb 为每个子带,sblimit 为总子带数
			{
				fprintf(TraceInfoFp, "子带[%d]:\t", sb + 1);
				for (int gr = 0; gr < 3; gr++)  //gr 为三个分组
				{
					fprintf(TraceInfoFp, "%d\t", scalar[ch][gr][sb]);
				}
				fprintf(TraceInfoFp, "\n");
			}
		}
		fprintf(TraceInfoFp, "\n");

		/* 比特分配表 */
		fprintf(TraceInfoFp, "========== 比特分配表 ==========\n");  //输出比特分配结果
		for (ch = 0; ch < nch; ch++)
		{
			fprintf(TraceInfoFp, "------ 声道%d ------\n", ch + 1); //按声道分配
			for (sb = 0; sb < frame.sblimit; sb++)
			{
				fprintf(TraceInfoFp, "子带[%d]:\t%d\n", sb + 1, bit_alloc[ch][sb]);
			}
			fprintf(TraceInfoFp, "\n");
		}
	}

#endif 

----

if (frame.actual_mode == MPG_MD_JOINT_STEREO) {

乐声输出TraceInfo.txt

========== 比例因子 ==========
------ 声道1 ------
子带[1]:	11	10	10	
子带[2]:	14	15	13	
子带[3]:	19	17	17	
子带[4]:	16	16	18	
子带[5]:	22	18	18	
子带[6]:	21	20	20	
子带[7]:	25	23	24	
子带[8]:	22	26	24	
子带[9]:	23	25	26	
子带[10]:	26	25	27	
子带[11]:	29	27	27	
子带[12]:	26	27	26	
子带[13]:	27	27	28	
子带[14]:	29	29	27	
子带[15]:	31	32	29	
子带[16]:	31	33	31	
子带[17]:	33	30	31	
子带[18]:	33	32	33	
子带[19]:	33	35	34	
子带[20]:	35	35	36	
子带[21]:	36	39	38	
子带[22]:	37	38	37	
子带[23]:	36	38	40	
子带[24]:	36	36	36	
子带[25]:	35	35	34	
子带[26]:	36	36	35	
子带[27]:	38	34	35	
------ 声道2 ------
子带[1]:	11	10	10	
子带[2]:	14	15	13	
子带[3]:	19	17	18	
子带[4]:	16	17	18	
子带[5]:	22	18	18	
子带[6]:	22	20	20	
子带[7]:	24	23	22	
子带[8]:	23	24	23	
子带[9]:	24	25	25	
子带[10]:	27	26	28	
子带[11]:	30	27	27	
子带[12]:	27	29	27	
子带[13]:	28	26	28	
子带[14]:	29	27	30	
子带[15]:	31	31	28	
子带[16]:	31	32	32	
子带[17]:	35	30	32	
子带[18]:	33	32	33	
子带[19]:	34	33	33	
子带[20]:	34	35	36	
子带[21]:	36	39	36	
子带[22]:	36	41	37	
子带[23]:	37	37	39	
子带[24]:	34	38	37	
子带[25]:	36	34	34	
子带[26]:	36	35	35	
子带[27]:	38	36	35	

========== 比特分配表 ==========
------ 声道1 ------
子带[1]:	5
子带[2]:	3
子带[3]:	3
子带[4]:	5
子带[5]:	4
子带[6]:	3
子带[7]:	3
子带[8]:	3
子带[9]:	3
子带[10]:	3
子带[11]:	2
子带[12]:	3
子带[13]:	3
子带[14]:	2
子带[15]:	1
子带[16]:	1
子带[17]:	2
子带[18]:	2
子带[19]:	0
子带[20]:	0
子带[21]:	0
子带[22]:	0
子带[23]:	0
子带[24]:	0
子带[25]:	0
子带[26]:	0
子带[27]:	0

------ 声道2 ------
子带[1]:	5
子带[2]:	3
子带[3]:	3
子带[4]:	5
子带[5]:	4
子带[6]:	3
子带[7]:	3
子带[8]:	3
子带[9]:	3
子带[10]:	3
子带[11]:	2
子带[12]:	3
子带[13]:	3
子带[14]:	2
子带[15]:	1
子带[16]:	2
子带[17]:	2
子带[18]:	1
子带[19]:	1
子带[20]:	0
子带[21]:	0
子带[22]:	0
子带[23]:	0
子带[24]:	0
子带[25]:	0
子带[26]:	0
子带[27]:	0

噪声:

========== 比例因子 ==========
------ 声道1 ------
子带[1]:	11	9	9	
子带[2]:	9	10	7	
子带[3]:	12	9	10	
子带[4]:	9	11	9	
子带[5]:	9	10	9	
子带[6]:	11	9	8	
子带[7]:	9	10	9	
子带[8]:	8	10	14	
子带[9]:	9	9	9	
子带[10]:	10	11	9	
子带[11]:	11	8	11	
子带[12]:	8	9	8	
子带[13]:	9	9	11	
子带[14]:	9	10	9	
子带[15]:	8	10	9	
子带[16]:	8	8	10	
子带[17]:	11	8	10	
子带[18]:	10	10	11	
子带[19]:	9	11	8	
子带[20]:	8	9	8	
子带[21]:	11	11	11	
子带[22]:	9	11	10	
子带[23]:	10	9	10	
子带[24]:	8	8	8	
子带[25]:	12	10	10	
子带[26]:	11	11	8	
子带[27]:	10	10	9	
子带[28]:	9	10	11	
子带[29]:	8	9	9	
子带[30]:	7	11	9	
------ 声道2 ------
子带[1]:	10	10	9	
子带[2]:	10	8	9	
子带[3]:	10	11	10	
子带[4]:	9	10	10	
子带[5]:	10	9	11	
子带[6]:	10	8	10	
子带[7]:	10	9	10	
子带[8]:	8	9	10	
子带[9]:	8	11	10	
子带[10]:	10	8	10	
子带[11]:	10	8	8	
子带[12]:	10	7	9	
子带[13]:	10	9	10	
子带[14]:	10	9	8	
子带[15]:	9	11	9	
子带[16]:	8	8	10	
子带[17]:	11	9	9	
子带[18]:	9	10	11	
子带[19]:	10	10	11	
子带[20]:	11	11	7	
子带[21]:	10	9	9	
子带[22]:	8	11	10	
子带[23]:	10	9	9	
子带[24]:	10	10	10	
子带[25]:	9	9	10	
子带[26]:	13	11	11	
子带[27]:	10	11	11	
子带[28]:	10	9	6	
子带[29]:	8	10	9	
子带[30]:	10	11	9	

========== 比特分配表 ==========
------ 声道1 ------
子带[1]:	4
子带[2]:	3
子带[3]:	3
子带[4]:	4
子带[5]:	4
子带[6]:	3
子带[7]:	3
子带[8]:	3
子带[9]:	3
子带[10]:	3
子带[11]:	2
子带[12]:	3
子带[13]:	2
子带[14]:	3
子带[15]:	3
子带[16]:	1
子带[17]:	3
子带[18]:	2
子带[19]:	2
子带[20]:	2
子带[21]:	1
子带[22]:	1
子带[23]:	2
子带[24]:	1
子带[25]:	1
子带[26]:	1
子带[27]:	1
子带[28]:	0
子带[29]:	1
子带[30]:	1

------ 声道2 ------
子带[1]:	4
子带[2]:	4
子带[3]:	3
子带[4]:	4
子带[5]:	4
子带[6]:	4
子带[7]:	3
子带[8]:	3
子带[9]:	3
子带[10]:	4
子带[11]:	3
子带[12]:	3
子带[13]:	2
子带[14]:	3
子带[15]:	3
子带[16]:	1
子带[17]:	3
子带[18]:	2
子带[19]:	2
子带[20]:	2
子带[21]:	1
子带[22]:	1
子带[23]:	2
子带[24]:	1
子带[25]:	1
子带[26]:	1
子带[27]:	1
子带[28]:	0
子带[29]:	1
子带[30]:	1

混音:

========== 比例因子 ==========
------ 声道1 ------
子带[1]:	9	10	10	
子带[2]:	9	10	9	
子带[3]:	8	7	12	
子带[4]:	12	11	10	
子带[5]:	10	10	10	
子带[6]:	11	11	10	
子带[7]:	10	9	9	
子带[8]:	10	9	10	
子带[9]:	9	10	10	
子带[10]:	8	11	10	
子带[11]:	10	8	9	
子带[12]:	8	10	10	
子带[13]:	10	11	10	
子带[14]:	8	10	9	
子带[15]:	9	8	9	
子带[16]:	12	10	11	
子带[17]:	12	10	11	
子带[18]:	11	10	8	
子带[19]:	9	9	10	
子带[20]:	9	8	8	
子带[21]:	8	10	9	
子带[22]:	10	9	9	
子带[23]:	11	10	8	
子带[24]:	9	11	9	
子带[25]:	10	10	8	
子带[26]:	10	10	9	
子带[27]:	9	12	10	
子带[28]:	8	10	10	
子带[29]:	10	11	9	
子带[30]:	9	9	9	
------ 声道2 ------
子带[1]:	11	9	10	
子带[2]:	10	10	10	
子带[3]:	9	9	9	
子带[4]:	10	11	9	
子带[5]:	10	10	9	
子带[6]:	12	10	10	
子带[7]:	9	10	10	
子带[8]:	11	10	9	
子带[9]:	9	9	11	
子带[10]:	9	9	9	
子带[11]:	9	11	10	
子带[12]:	9	9	10	
子带[13]:	10	12	9	
子带[14]:	9	10	10	
子带[15]:	8	8	9	
子带[16]:	10	10	11	
子带[17]:	11	10	7	
子带[18]:	10	11	11	
子带[19]:	9	9	10	
子带[20]:	11	10	8	
子带[21]:	11	11	10	
子带[22]:	10	8	10	
子带[23]:	10	10	8	
子带[24]:	8	8	10	
子带[25]:	8	9	10	
子带[26]:	11	8	10	
子带[27]:	9	9	10	
子带[28]:	9	10	9	
子带[29]:	12	10	10	
子带[30]:	11	9	12	

========== 比特分配表 ==========
------ 声道1 ------
子带[1]:	5
子带[2]:	3
子带[3]:	3
子带[4]:	5
子带[5]:	5
子带[6]:	3
子带[7]:	4
子带[8]:	4
子带[9]:	4
子带[10]:	3
子带[11]:	4
子带[12]:	4
子带[13]:	3
子带[14]:	4
子带[15]:	4
子带[16]:	3
子带[17]:	2
子带[18]:	3
子带[19]:	3
子带[20]:	1
子带[21]:	2
子带[22]:	1
子带[23]:	2
子带[24]:	1
子带[25]:	1
子带[26]:	1
子带[27]:	1
子带[28]:	1
子带[29]:	1
子带[30]:	1

------ 声道2 ------
子带[1]:	5
子带[2]:	4
子带[3]:	3
子带[4]:	5
子带[5]:	4
子带[6]:	4
子带[7]:	4
子带[8]:	3
子带[9]:	4
子带[10]:	3
子带[11]:	4
子带[12]:	4
子带[13]:	3
子带[14]:	4
子带[15]:	4
子带[16]:	3
子带[17]:	2
子带[18]:	3
子带[19]:	3
子带[20]:	1
子带[21]:	2
子带[22]:	1
子带[23]:	2
子带[24]:	1
子带[25]:	1
子带[26]:	1
子带[27]:	1
子带[28]:	1
子带[29]:	1
子带[30]:	1

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值