【数据压缩】MPEG音频编码

1、音频信号压缩的可能性

(1)去除声音信号中的“ 冗余 ” 部分

时域信息冗余度主要表现在幅度非均匀分布,即不同幅度的样值出现的概率不同,小幅度的样值比大幅度样值出现的概率高。

频域:功率谱的高频成分能量较低。

(2)是利用人耳的听觉特性 ,将声音中与听觉无关的“ 不相关 ”部分去除。对于人耳感觉不到的不相关部分不编码、不传送,以达到数据压缩的目的。——利用了人耳听觉的 心理声学特性

2、音频信号的压缩编码方法

(1)波形编码:PCM, DPCM, ADPCM

(2)参数编译码器:从语音波形信号中提取语音生成模型的参数,使用这些参数通过语音生成模型重构出语音。

(3)混合编码

(4)感知编码

3、音频压缩的国际标准

(1)MPEG-1 ISO/IEC—11172-3    1993年标准化

(2)MPEG-2 ISO/IEC—13818-3    1994年11月标准化,是对MPEG1的发展与扩展

(3)ISO/IEC MPEG-2 AAC (ISO/IEC 13818-7 ) 1997年4月公布

4、MPEG心理声学模型

   心理声学模型可以在主观听感劣化不多的条件下,大大降低数字音频信号传输的带宽。它主要基于人的听觉器官的生理结构和感知模式,通过对数字音频信号的相应处理,去除不可闻的信号成分。

(1)将样本变换到频域:Hann加权减少频域中的边界效应

 此变换不同于多相滤波器组,因为模型需要更精细的频率分辨率,而且计算掩蔽阈值也需要每个频率的幅值

   模型1:采用512 (Layer I) 或1024 (Layers II and III)样本窗口

 Layer I:每帧384个样本点,512个样本点足够覆盖

 Layer II 和Layer III:每帧1152个样本点,每帧两次计算,模型1选择两个信号掩蔽比(SMR)中较小的一个

 模型2:采用1024样本窗口,每帧两次计算

 每次分别计算1152个样本的前半部分和后半部分

(2)将频率分组成临界频带

心理声学模型中,根据临界频带,将频率域分组。由于人耳对低频比对高频敏感,所以这样做可以对每一组做不同的处理,能够让压缩比更大,失真更小。每个临界频带组的长度不同,低频时长度较短,随着频率的升高,每组的长度也变长。

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

模型1:根据音频频谱的局部功率最大值确定乐音成分:局部峰值为乐音,然后将本临界频带内的剩余频谱合在一起,组成一个代表噪声频率(无调成份)

模型2:计算乐音度索引( tonality index),以决定每个频率为音调的可能程度基于前两个分析窗口,如果本窗口可以用前两个分析窗口来预测,则其更可能为乐音

(4)计算每个子带信号掩蔽比(signal-to-mask ratio, SMR)

 SMR = 信号能量 / 掩蔽阈值

 并将SMR传递给编码单元计算信掩蔽SMR

(5)在时域中将每取32点进行一次滤波操作,得到32点的频谱。这样可以解决时域或频域分辨率不够的问题,但是却会扩大计算复杂度。因此每个频带上存储12个样本,即经过32x12 = 384个时域样点之后,将这些数据打包成块,称为一帧数据。将其按照子带为单位进行归一化,其归一化所乘系数称为比例因子。然后将其经过量化输出。

(6)比特分配

首先由32子带滤波后得到模型和心理声学模型所形成的临界频带两个模型进行对比,得到每个频带的掩蔽阈值。之后计算每个频带的信噪比和信掩蔽,得到掩噪比,将其送入比特分配模块,将掩噪比最小的频带给予1bit,之后重新计算掩噪比,再继续将掩噪比最小的频带给予1bit,重复此步骤直至所有频带的掩噪比大于0dB或分配的比特数达到了限制比特数。最后将分配后的结果送入输出。

5、编码过程

【数据压缩】MPEG音频编码_第1张图片

6、代码分析

实验要求输出抽样频率、限制码率、某一帧的比特分配数、比例因子、分配比特结果,我们可以使用一个txt文件来输出这些数据,如同在JPEG编解码中的操作。

(1)在common.h中定义txt文件

//define my file
FILE *c_file;
#define C_TXT 1
#define C_FILENAME "myoutput.txt"

(2)输出采样频率,阅读程序可发现采样频率是固定的数值,本身程序中就有采样率的输出,只需要找到其对应的输出位置,将其提取出来进行输出即可。

#if C_TXT
	  c_file = fopen(C_FILENAME,"w");
	  fprintf(c_file,"采样率:%d\n",samplerate);
	  fclose(c_file);
#endif
(3)输出目标码率的方法与输出抽样频率同理
//output bitrates
  c_file = fopen(C_FILENAME,"a");
  fprintf(c_file,"目标码率:%d\n",
	   (FLOAT) sentBits / (frameNum * 1152) *
	   s_freq[header.version][header.sampling_frequency]);
  fclose(c_file);

(4)提取分配比特数

adb = available_bits (&header, &glopts);
if(frameNum == 1)
	{
	c_file = fopen(C_FILENAME,"a");
	//output avilable bits
	fprintf(c_file,"分配比特数:%d\n");
	fprintf(c_file,"%d\n",adb);
	fclose(c_file);
	}

(5)提取比例因子

比例因子是存在了scalar中,而scalar为一个3维数组,其中第一维表示的是声道,第二维表示的是三帧中的第几帧,第三维表示的是子带序号。固定第二维为三帧第一帧。

if(frameNum == 1)
	{
		c_file = fopen(C_FILENAME,"a");

		//output scale factor
		fprintf(c_file,"比例因子:%d\n");
		for (i = 0; i < 32; i++)
		{
			for (k = 0; k < ((i < frame.jsbound) ? nch : 1); k++)
			{
				fprintf(c_file,"%d \t",scalar[k][0][i]);
			}
			fprintf(c_file,"\n");
		}

(6)提取比特分配结果

比特分配的数据时存在了一个bit_alloc的二维数组中,其中第一维表示声道数,第二维表示子带序号,因为三帧用的是同一个比特分配所以不需要根据帧选择比特分配参数。

fprintf(c_file,"比特分配:%d\n");
		for (i = 0; i < frame.sblimit; i++)
		{
			for (k = 0; k < ((i < frame.jsbound) ? nch : 1); k++)
			{
				fprintf(c_file,"%d \t",bit_alloc[k][i]);
			}
			fprintf(c_file,"\n");
		}
		fprintf(c_file,"\n");
		fclose(c_file);
	}

7、结果分析

输出txt文件截图

【数据压缩】MPEG音频编码_第2张图片

【数据压缩】MPEG音频编码_第3张图片







你可能感兴趣的:(课程作业)