[实验六]MPEG-1原理分析及MPEG-1编码器的调试

目录

一、实验原理

1.1 MPEG-1简介

1.2 MPEG-1编码器结构​编辑

1.3 多相滤波器组

1.4 量化和编码

1.5 心理声学模型

1.5.1 听觉阈值

1.5.2 频率掩蔽

 1.5.3 临界频带

 1.5.4 人耳听觉系统

1.5.5 掩蔽效果的叠加

1.5.6 心理声学模型

二、实验理解

2.1 程序设计框架理解

2.2 感知音频编码的设计思想

2.2.1 两条线

2.2.2 时频分析的矛盾

2.2.3 临界频带的概念

2.2.4 掩蔽值计算的思路

2.2.5 码率分配的实现思路

三、关键信息输出

3.1 输出音频采样率和目标码率

3.2 输出某帧分配的比特数

3.2 输出某帧的比例因子

四、遇坑记录

一、实验原理

1.1 MPEG-1简介

MPEG-1标准于1992年正式出版,标准的编号为ISO/IEC11172,其标题为“码率约为1.5Mb/s用于数字存贮媒体活动图像及其伴音的编码”。MPEG-1主要解决多媒体的存储问题,它的成功制定,使得以VCD和MP3为代表的MPEG-1产品迅速在世界范围内普及。

MPEG的特点是编码简单,用于数字盒式录音磁带,2声道,VCD中使用的音频压缩方案就是MPEG-1层Ⅰ。压缩方式相对时域压缩技术而言要复杂得多,同时编码效率、声音质量也大幅提高,编码延时相应增加。可以达到“完全透明”的声音质量(EBU音质标准),但对频宽要求较高。

MPEG-1编码器的输入为PCM信号,采样率为32,44.1或48kHz,输出为 32kbps到384kbps。

MPEG-1具有三个独立的压缩层次

  • Layer1:编码器最简单,384kbps(4:1,用于小型数字盒带DCC,Compact Cassette)
  • Layer2:编码器复杂程度中等,256kbps~192kbps(6:1~8:1, 用于DAB、CD-I和VCD)
  • Layer3:编码器最为复杂,64kbps,用于ISDN,网络音频

1.2 MPEG-1编码器结构

MPEG-1编码器的输入声音信号经过一个多相滤波器组,变换到多个子带。同时经过“心理声学模型”计算以频率为自变量的噪声掩蔽阈值。量化和编码部分用信掩比SMR决定分配给子带信号的量化位数,使量化噪声<掩蔽域值。最后通过数据帧包装将量化的子带样本和其它数据按照规定的帧格式组装成比特数据流。

1.3 多相滤波器组

通过多相滤波器组,MPEG-1编码器将输入的音频分为多个自带,并依据这些自带的频率特征进行各自的处理

多相滤波器组将输入的音频分成32个相等长度的子带,具有512个样本的FIFO缓存,每输入32个样本点32个自带就各自增加一个样本。

1.4 量化和编码

对各个子带每12个样点进行一次比例因子计算。先定出12个样点中绝对值的最大值。查比例因子表中比这个最大值大的最小值作为比例因子。用6比特表示。

在调整到固定的码率之前,先确定可用于样值编码的有效比特数,这个数值取决于比例因子、比例因子选择信息、比特分配信息以及辅助数据所需比特数

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

输入以12个样本为一组,每组样本经过时间-频率变换之后进行一次比特分配并记录一个比例因子(scale factor)比特分配信息告诉解码器每个样本由几位表示,比例因子用6比特表示,解码器使用这个6比特的比例因子乘逆量化器的每个输出样本值,以恢复被量化的子带值。比例因子的作用是充分利用量化器的量化范围,通过比特分配和比例因子相配合,可以表示动态范围超过120dB的样本 。

1.5 心理声学模型

1.5.1 听觉阈值

两个声音响度级相同,但强度不一定相同, 还与频率有关;声压级越高, 等响度曲线趋于平坦;人耳对3~4KHz 的声音感觉最灵敏。

1.5.2 频率掩蔽

如果有多个频率成分的复杂信号存在,那么频谱的总掩蔽阈值与频率的关系取决于各掩蔽音的强度、频率和它们之间的距离。

 1.5.3 临界频带

临界频带是指当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。通常认为从20Hz到16kHz有25个临界频带,单位为bark,1 bark = 一个临界频带的宽度

 

 1.5.4 人耳听觉系统

人类听觉系统大致等效于一个信号通过一组并联的不同中心频率的带通滤波器,中心频率与信号频率相同的滤波器具有最大响应;中心频率偏离信号频率较多的滤波器不会产生响应。在0Hz到20KHz频率范围内由25个重叠的带通滤波器组成的滤波器组 。听音者在噪声中听某一纯音信号时,只启用中心频率与信号频率相同 的那个听觉滤波器,纯音信号通过该滤波器,而噪声信号只有通带范 围内的部分信号能通过,通带以外的频率成分则被抑制,只有通过该 滤波器的噪声才对掩蔽起作用。聆听复音时启动多个听觉滤波器。听觉能够计算各滤波器输出端的信 噪比。当信噪比达到或者超过听阈因子时,即可听到该频率成分。

掩蔽声对被掩蔽声的掩蔽效应,取决于两者的频率与强度的关系

  • 噪声掩蔽纯音时,只有以纯音频率为中心的,一定频带宽度内的噪 声能量起掩蔽作用,超出该频带的噪声能量无掩蔽效应,称掩蔽的 临界带宽。掩蔽说明了频率选择性的极限。
  • 掩蔽纯音信号,理论上使用带宽范围等于其临界带宽1/3倍频程的窄 带噪声,这是因为掩蔽的临界带宽稍窄,听起来接近于纯音,患者 常常混淆纯音与掩蔽噪声,而以纯音频率为中心频率的1/3倍频程噪 声,宽度略大于临界带宽,同样可以起到很好的掩蔽效果。但实际 应用中根据IEC645规定,临床听力计上常使用约4/10倍频程的窄带噪声。

1.5.5 掩蔽效果的叠加

音乐与语音信号大都由一系列复杂的频谱分量构成 ,相应的这些多个掩蔽分量也会相互影响并最终获得一个整体的掩蔽阈值。

当两个信号重叠并落在一个临界频带中时,二者的掩蔽分量可以线性相加。对于复杂音频信号可将其频谱分割成一系列离散段,每段就是一个掩蔽信号。各掩蔽音互不重叠,即以一个临界带为单位。各掩蔽音的声压级则通过将对应的临界频带上的短时功率谱密度线性相加得到 。

1.5.6 心理声学模型

MPEG-1标准定义了两个模型:

  1. 心理声学模型1:计算复杂度低,但对假设用户听不到的部分压缩太严重
  2. 心理声学模型2:提供了适合Layer III 编码的更多特征

二、实验理解

2.1 程序设计框架理解

输入指令

m2aenc.exe -h

 查看程序的帮助信息如下

tooLAME version 0.2l (http://toolame.sourceforge.net)
MPEG Audio Layer II encoder

usage:
        D:\文档\学习\数据压缩原理与应用\实验\实验七\m2aenc\Debug\m2aenc.exe [options] <input> <output>

Options:
Input
        -s sfrq  input smpl rate in kHz   (dflt 44.1)
        -a       downmix from stereo to mono
        -x       force byte-swapping of input
        -g       swap channels of input file
Output
        -m mode  channel mode : s/d/j/m   (dflt    j)
        -p psy   psychoacoustic model 0/1/2/3 (dflt    1)
        -b br    total bitrate in kbps    (dflt 192)
        -v lev   vbr mode
        -l lev   ATH level (dflt 0)
Operation
        -q num   quick mode. only calculate psy model every num frames
Misc
        -d emp   de-emphasis n/5/c        (dflt    n)
        -c       mark as copyright
        -o       mark as original
        -e       add error protection
        -r       force padding bit/frame off
        -D len   add DAB extensions of length [len]
        -t       talkativity 0=no messages (dflt 2)Files
        input    input sound file. (WAV,AIFF,PCM or use '/dev/stdin')
        output   output bit stream of encoded audio

        Allowable bitrates for 16, 22.05 and 24kHz sample input
        8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160

        Allowable bitrates for 32, 44.1 and 48kHz sample input
        32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384

程序会对输入的音频文件按以下步骤处理:

  1. 通过多项滤波器组划分为32个子带
  2. 如果输入的音频是双通道立体声,则将左右两个通道合为一起
  3. 计算比例因子
  4. 使用选定的心理声学模型计算掩蔽电平
  5. 根据计算得到的掩蔽结果进行比特分配
  6. 若需要则加入CRC纠错码
  7. 将比特分配信息合比例因子打包
  8. 量化子带,并将结果打包

m2aenc.c文件中的main函数是整个程序的完整设计框架,其流程图大致可以表示为:

2.2 感知音频编码的设计思想

2.2.1 两条线

如图所示,整个编码的过程可以范围上下两条线同步进行,上面一条线是音频编码的主线部分,负责子带划分和量化,而下面一条线是对音频的频域分析,通过心理声学模型计算音频的掩蔽范围,为音频编码提供了比特分配的依据,实现了基于感知的压缩编码。

2.2.2 时频分析的矛盾

要确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量,就必须使信号具有较高的时域分辨率,然而时域分辨率与频率分辨率使相反的,即增加时域分辨率会导致频率分辨率的下降,从而导致频率分析出现误差,因此需要在时域分辨率和频率分辨率当中平衡选择折中处理。

2.2.3 临界频带的概念

详见1.5.3 临界频带

2.2.4 掩蔽值计算的思路

详见1.5.5 掩蔽效果的叠加

2.2.5 码率分配的实现思路

在进行比特分配前,线根据掩蔽电平计算每个子带的的掩蔽-噪声比MNR,信噪比SNR–信掩比SMR, 即:MNR = SNR–SMR

码率分配的目标是使整个一帧和每个子带的总噪声-掩蔽比最 小。这是一个循环过程,每一次循环使获益最大的子带的量化级别增加一级,当然所用比特数不能超过一帧所能提供的最大数目。

每次循环中对最高NMR的子带分配比特,使获益最大的子带的量化级别增加一级,重新计算分配了更多比特子带的NMR,再进行下一次分配,如此循环直到没有比特可用。

三、关键信息输出

3.1 输出音频采样率和目标码率

输入指令将test.wav编码为test.mp2

m2aenc.exe test.wav test.mp2

在编码过程中可以看到音频的采样率和目标码率

 

可以看到音频的采样率为44.1kHz,目标码率为192kbps

3.2 输出某帧分配的比特数

通过阅读程序代码,发现在main函数中有一个frameNum变量由于记录当前处理的帧数,同时又available_bits()函数用于为每一帧分配比特数,因此可以在main函数中添加相应的代码如下

fflush(stderr);
win_buf[0] = &buffer[0][0];
win_buf[1] = &buffer[1][0];

adb = available_bits(&header, &glopts);
/*添加内容开始*/
if (frameNum == 1) {
	printf("第一帧分配比特数:%d\n", adb);
}
/*添加内容结束*/
lg_frame = adb / 8;

 即在分配完比特数后打印显示比特数,这里以显示第一帧的比特数为例

可以看到第一帧分配的比特数为5008

3.2 输出某帧的比例因子

比例因子被存放在了scalar[][][]数组中。第一个维度为2代表输入的音频通道数;第二个维度为3代表每个子带有三个比例因子,在MPEG-Layer2中每个子带有36个样点,每12个样点会进行依次比例因子计算,因此一个子带有3个比例因子;第三个维度为32代表划分的子带数目。

在程序中scale_factor_calc()是用来计算比例因子的函数,因此在该函数下加上打印比例因子的代码如下(同样以输出第一帧的比例因子为例)

if (frameNum == 1) {
    FILE *f=fopen("scale_factor.txt","a");
    fprintf(f,"第一帧的比例因子为:\n");
    for (int i = 0; i < 2; i++) {
    	for (int j = 0; j < 32; j++) {
	    	fprintf(f, "子带%2d:%5d%5d5%5d\n", j, scalar[i][0][j], scalar[i][1][j],
                    scalar[i][2][j]);
    	}
    }
    fclose(f);
}

输出结果如下:

3.3 输出某帧的比特分配结果

比特分配结果被存放在bit_alloc[][]数组中。第一个维度为2代表输入的音频通道数;第二个维度为32代表划分的子带数目。

在程序中main_bit_allocation()是用来计算比特分配的函数,因此在该函数下加上打印比特分配结果的代码如下(同样以输出第一帧的比特分配结果为例)

if (frameNum == 1) {
	FILE* f = fopen("bit_alloc.txt", "a");
	fprintf(f, "第一帧的比特分配结果为:\n");
	for (int j = 0; j < 32; j++) {
		fprintf(f, "子带%2d:%5d5%5d\n", j, bit_alloc[0][j],bit_alloc[1][j]);
	}
	fclose(f);
}

输出结果:

 

四、遇坑记录

在运行实验程序时曾出现报错

查找相关资料,其问题是调试信息格式有误,在项目属性中修改调试信息格式为(程序数据库/Zi)即可

参考资料:解决“错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题_LYJ_viviani的博客-CSDN博客_zi和gy命令行选项不兼容https://blog.csdn.net/lyj_viviani/article/details/51487877

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值