MPEG音频编码实验

本文详细介绍了音频压缩编码的实验目的和原理,包括多相滤波器组、心理声学模型、掩蔽效应以及量化编码。实验中选取了噪声、音乐和混合音频进行分析,展示了不同音频类型的编码细节,如比例因子和比特分配。通过对第6帧的分析,揭示了音频压缩中的关键参数和处理步骤。
摘要由CSDN通过智能技术生成

一、实验目的

1.输出音频的采样率和目标码率
2.选择三个不同特性的音频文件(噪声、音乐、混合)
3.某个数据帧,输出该帧所分配的比特数、该帧的比例因子、该帧的比特分配结果

二、实验原理

在这里插入图片描述
大致分为两条线:
第一条线,上面一条线利用多相滤波器组将PCM样本变换到32个子带的频域信号。我们希望对于每个频带中的所有点使用相同的量化bit数进行量化,这就要求每个频带中的点的值不能相差太大,于是我们应将信号时间取得很短,由于语音信号的短时平稳性,每个频带中的点就比较接近了。
第二条线,对于输入的音频信号,我们希望找到能够表征它的性质的心理声学模型,心理声学模型的横坐标是频率,纵坐标是阈值。为了使模型与实际更为接近,我们希望频率分得越细越好,即频率分辨率越高越好,这就与第一条线中对于时域分辨率的要求相矛盾了。
式,1个、2个或3个比例因 子和比例因子选择信息一起被传送。
2.时-频分析的矛盾
短时傅里叶变换通过时间窗内的一段信号来表示某一时刻的信号特征。在短时傅里叶变换过程中,窗的长度决定频谱图的时间分辨率和频率分辨率,窗长越长,截取的信号越长,信号越长,傅里叶变换后频率分辨率越高,时间分辨率越差;相反,窗长越短,截取的信号就越短,频率分辨率越差,时间分辨率越好。框图上支路时间分辨率高,频率分辨率低;框图下支路频率分辨率高,时间分辨率低。通过子带分析滤波器组使信号具有高的时间分辨率, 确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量。下支路又可以使信号通过FFT运算具有高的频率分辨率, 因为掩蔽阈值是从功率谱密度推出来的。32个等分的子带信号并不能精确地反映人耳的听觉特性,引入FFT补偿频率分辨率不足的问题。为使上下两支路互补,上支路向下提供比例因子信息,下支路向上提供基于心理声学模型的动态比特分配。
3.心理声学模型
1)将样本变换到频域
32个等分的子带信号并不能精确地反映人耳的听觉特性。
引入FFT补偿频率分辨率不足的问题。
2)确定声压级别
在这里插入图片描述
3)考虑安静时阈值
也即绝对阈值。在标准中有根据输入PCM信号的采
样率编制的“频率、临界频带率和绝对阈值”表。
此表为多位科学家经多次心理声学实验所得
4)将音频信号分解成“乐音(tones)” 和“非乐音/噪声”
部分:因为两种信号的掩蔽能力不同
在这里插入图片描述
4)将音频信号分解成“乐音(tones)” 和“非乐音/噪声”
部分:因为两种信号的掩蔽能力不同
模型1:根据音频频谱的局部功率最大值确定乐音成分
局部峰值为乐音,然后将本临界频带内的剩余频谱合在一
起,组成一个代表噪声频率(无调成份)
要列出谱线x(k)的有调和无调,需执行下面三个步骤:
(1)标明局部最大。如果x(k)比相邻的两个谱线都大,则
x(k)为局部最大值;
(2)列出有调成份,计算声压级。如果x(k)-x(k+j)>=7dB,则
x(k)列为有调成份。j随谱线的位置不同。
(3)列出无调成分,计算功率。在每个临界频带内将所有余
留谱线的功率加起来形成临界频带内无调成分的声压级。并
列出以下参数:最接近临界频带几何平均值的谱线标记k,声
压级以及无调指示。
5)音调和非音调掩蔽成分的消除
利用标准中给出的绝对阈值消除被掩蔽成分;
考虑在每个临界频带内,小于0.5Bark的距离
中只保留最高功率的成分
6)单个掩蔽阈值的计算
音调成分和非音调成分单个掩蔽阈值根据标
准中给出的算法求得。
7)全局掩蔽阈值的计算
在这里插入图片描述
在这里插入图片描述
8)选择子带中最小的阈值作为子带阈值
9)计算每个子带信号掩蔽比(signal-to-mask ratio, SMR),SMR = 信号能量 / 掩蔽阈值,并将SMR传递给编码单元
4.量化编码
对每个子带进行量化,量化方式应当使得量化噪声听不见。量化时注意只需发送掩蔽水平以上的能量。
比特分配的过程:
对每个子带计算掩蔽-噪声比MNR,MNR = SNR–SMR,每一次对最高NMR的子带分配比特,使整帧和每个子带的总噪声—掩蔽比最小,循环,直到没有比特可用。

三、实验步骤

音乐
在这里插入图片描述

在这里插入图片描述
压缩成功
在这里插入图片描述

添加此代码
输出的是第6帧的相关信息

  if (frameNum == 6) {
	  printf("采样率:%lfkhz\n", s_freq[header.version][header.sampling_frequency]);
	  printf("目标码率:%dMbps\n", bitrate[header.version][header.bitrate_index]);
	  printf("该帧所分配的比特数:%d\n", lg_frame * 8);
	  for (i = 0; i < nch; i++)
	  {
		  printf("声道%d\n", i);
		  for (j = 0; j < SBLIMIT; j++) {
			  printf("子带%d\t", j + 1);
			  printf("比例因子:");
			  switch (scfsi[i][j]) {
			  case 0:
				  for (k = 0; k < 3; k++) 
					  printf("%3d ", scalar[i][k][j]);
				  break;
			  case 1:
				  printf("%3d ", scalar[i][0][j]);
				  printf("%3d ", scalar[i][0][j]);
				  printf("%3d ", scalar[i][2][j]);
				  break;
			  case 2:
				  printf("%3d ", scalar[i][0][j]);
				  printf("%3d ", scalar[i][0][j]);
				  printf("%3d ", scalar[i][0][j]);
				  break;
			  case 3:
				  printf("%3d ", scalar[i][0][j]);
				  printf("%3d ", scalar[i][2][j]);
				  printf("%3d ", scalar[i][2][j]);
				  break;
			  }
			  printf("	比特分配结果: ");
			  printf("%3d\n", bit_alloc[i][j]);
		  }
	  }
  }

输出结果
在这里插入图片描述
噪声
此处录了一个塑料袋摩擦的声音作为噪声
输出结果如下
在这里插入图片描述
在这里插入图片描述
混合声

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值