MPEG音频编码

一、实验原理

在这里插入图片描述
MPEG-1音频编码器框架图

- 多相滤波器组(Polyphase Filter Bank):将PCM样本变换到32个子带的频域信号
      如果输入的采样频率为48kHz,那么子带的频率宽度为48/(2*32)=0.75kHz
在这里插入图片描述

  • for i=0…511,计算窗口内的样本:Z [ i ] = C [ i ] · X [ i ]
          标准中规定了分析窗口的512个系数 C[i]

  • 样本点分组,计算64个Yk的值: Y [ k ] = ∑ m = 0 7   Z [ k + 64 j ] Y[k] = \sum_{m=0} ^{7}\ {Z[k+64j]} Y[k]=m=07 Z[k+64j]

  • 计算32个子带样本: S [ i ] = ∑ k = 0 63   M [ i ] [ k ] ⋅ Y [ k ] S[i] = \sum_{k=0} ^{63}\ {M[i][k] · Y[k]} S[i]=k=063 M[i][k]Y[k]

  • 总计算公式: S [ i ] = ∑ k = 0 63 ∑ j = 0 7   M [ i ] [ k ] ( C [ k + 64 j ] X [ k + 64 j ] ) S[i] = \sum_{k=0} ^{63}\sum_{j=0} ^{7}\ {M[i][k](C[k+64j]X[k+64j])} S[i]=k=063j=07 M[i][k](C[k+64j]X[k+64j])
          其中分析矩阵:
    M [ i ] [ k ] = ( ( 2 i + 1 ) ( k − 16 ) π 64 ) M[i][k]=\left( \frac{(2i+1)(k-16)π}{64}\right) M[i][k]=(64(2i+1)(k16)π)
          共需: 512 + 32x64 = 2560 次乘法
          每个子带的带宽为π/32T ,中心为π/64T的奇数倍

  • 多相滤波器组的公式 S [ i ] = ∑ k = 0 63 ∑ j = 0 7   M [ i ] [ k ] ( C [ k + 64 j ] X [ k + 64 j ] ) S[i] = \sum_{k=0} ^{63}\sum_{j=0} ^{7}\ {M[i][k](C[k+64j]X[k+64j])} S[i]=k=063j=07 M[i][k](C[k+64j]X[k+64j])

  • 可用卷积公式代替: S t [ i ] = ∑ n = 0 511   X [ n − t ] h i [ k ] St[i] = \sum_{n=0} ^{511}\ {X[n-t]hi[k]} St[i]=n=0511 X[nt]hi[k]

  • 其中 h i [ n ] = ( h [ n ] × c o s ( 2 i + 1 ) ( n − 16 ) π 64 ) hi[n]=\left( {h[n]×cos} \frac{(2i+1)(n-16)π}{64}\right) hi[n]=(h[n]×cos64(2i+1)(n16)π)
           - 当n/64 的整数部分为奇数时,令h[n]=-C[n]
           - 反之,h[n]=C[n]
           - 每个子带有自己的带通滤波器脉冲响应
                直观但效率不高:16384次乘法和16352次加法

  • 缺点:
           - 等带宽的滤波器组与人类听觉系统的临界频带不对应
                在低频区域,单个子带会覆盖多个临界频带。在这种情况下,量化比特数不能兼每个临界频带
           - 滤波器组与其逆过程不是无失真的
                但滤波器组引入的误差差很小,且听不到
           - 子带间频率有混叠
                滤波后的相邻子带有频率混叠现象,一个子带中的信号可以影响相邻子带的输出
    在这里插入图片描述
    在这里插入图片描述

  • 混叠:一个单频正弦信号输入可能在两个子带中产生非零信号
    在这里插入图片描述

- 心理声学模型(Psychoacoustic Model):计算信号中不可听觉感知的部分
      计算噪声遮蔽效应
1、将样本变换到频域
      32个等分的子带信号并不能精确地反映人耳的听觉特性。引入FFT补偿频率分辨率不足的问题
2、确定声压级别
在这里插入图片描述
3、考虑安静时阈值
      也即绝对阈值。在标准中有根据输入PCM信号的采样率编制的“频率、临界频带率和绝对阈值”表。此表为多位科学家经多次心理声学实验所得。
4、将音频信号分解成“乐音(tones)” 和“非乐音/噪声”部分:因为两种信号的掩蔽能力不同
在这里插入图片描述
5、音调和非音调掩蔽成分的消除
      利用标准中给出的绝对阈值消除被掩蔽成分;考虑在每个临界频带内,小于0.5Bark的距离中只保留最高功率的成分
6、单个掩蔽阈值的计算
      音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。
7、全局掩蔽阈值的计算
在这里插入图片描述
      还要考虑别的临界频带的影响。一个掩蔽信号会对其它频带上的信号产生掩蔽效应。这种掩蔽效应称为掩蔽扩散。
8、每个子带的掩蔽阈值
      - 选择出本子带中最小的阈值作为子带阈值
      - 对高频不正确——高频区的临界频带很宽,可能跨越多个子带,从而导致模型1将临界带宽内所有的非音调部分集中为一个代表频率,当一个子带在很宽的频带内却远离代表频率时,无法得到准确的非音调掩蔽值。但计算
量低。
9、计算每个子带信号掩蔽比SMR,并将SMR传递给编码单元
      SMR = 信号能量 / 掩蔽阈值

- 比特分配器(Bit Allocator):根据心理声学模型的计算结果,为每个子带信号分配比特数

- 装帧(Frame Creation):产生MPEG-I兼容的比特流
在这里插入图片描述帧头
帧头

  • Sync:同步码,取值为111111111111
  • ID=1:MPEG
  • Layer:
00reserved
01layerⅢ
10layerⅡ
11layerⅠ
  • Prot. bit:置位表示有CRC校验
  • Bitrate:码率索引,表示15种固定的码率
  • Frequency:取样频率
  • Pad bit:填充指示位
  • Priv. bit:应用特定
  • Mode:通道模式
  • Mode extesion:通道模式扩展,当通道模式为联合立体声时有效

二、实验要求

  • 理解程序设计的整体框架:如上图所示

  • 理解感知音频编码的设计思想
       (1)两条线
          ①通过滤波器组后进行线性量化
          ②进行FFT,通过心理声学模型实现动态比特分配
       (2)时-频分析的矛盾:频域的频谱分辨率与时域的变化率之间的矛盾,当时域信号取得越短,频域谱线间隔越大

  • 理解心理声学模型的实现过程
          临界频带的概念:临界频带是指当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。
          掩蔽值计算的思路:
          ①单个掩蔽阈值的计算:音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。
          ②全局掩蔽阈值的计算:
    在这里插入图片描述
          ③:选择出本子带中最小的阈值作为子带阈值

  • 理解码率分配的实现思路
          算法:使整帧和每个子带的总噪声—掩蔽比最小,循环,直到没有比特可用
          计算噪声-掩蔽比: NMR = SMR – SNR (dB)
           - 对最高NMR的子带分配比特,使获益最大的子带的量化级别增加一级
           - 重新计算分配了更多比特子带的NMR
          其中SNR 由MPEG-I标准给定 (为量化水平的函数)
          NMR:表示波形误差与感知测量之间的误差

三、代码实现

* 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)
*
* 1.  Filter sliding window of data to get 32 subband
* samples per channel.
* (window_subband,filter_subband)
*
* 2.  If joint stereo mode, combine left and right channels
* for subbands above #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.
* (*_main_bit_allocation)
*
* 6.  If error protection flag is active, add redundancy for
* error protection.
* (*_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)使用心理声学模型对进行FFT后的音频信号进行处理,计算掩蔽电平
(5)采用第四步获得的掩蔽电平计算掩噪比,并迭代的为这一帧中的子带分配比特
(6)如果需要,计算循环冗余检测CRC并加入比特流
(7)将上述比特分配信息,比例因子与比例因子选择信息打包并加入比特流
(8)对子带根据比特分配信息进行量化并将他们打包加入比特流

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

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

  • 某个数据帧,输出
          该帧所分配的比特数
          该帧的比例因子
          该帧的比特分配结果

添加代码如下:

	FILE *output;
	fopen_s(&output,"音乐.txt","wb");
	...
	if (frameNum == 61)   //选择数据帧    
	{ 
		fprintf(output, "采样率:%.1f khz\n", s_freq[header.version][header.sampling_frequency]);//输出采样率  
		fprintf(output,"目标码率:%d kbps\n", bitrate[header.version][header.bitrate_index]);//输出目标码率    
		fprintf(output,"第%d帧\n",frameNum);
		fprintf(output,"可用比特数:%d\n",adb);//输出该帧的可用比特数  
		fprintf(output,"比例因子:\n");//输出该帧的比例因子  
		for (int i = 0; i < nch; i++)//声道        
		{
			fprintf(output, "通道[%d] \n", i + 1);
			for (int j = 0; j < frame.sblimit; j++) //子带    
			{
				fprintf(output, "subband[%2d]:    ", j + 1);
				for (int k = 0; k < 3; k++)
				{
					fprintf(output, "%2d\t", scalar[i][k][j]);
				}
				fprintf(output, "\n");
			}
		}
	}
	...
		if (frameNum == 61) //选择数据帧
	{
		fprintf(output, "\n分配的比特数为:\n");  //输出比特分配结果    
		for (int i = 0; i < nch; i++)
		{
			fprintf(output, "channel[%2d] \n", i + 1); //按声道分配   
			for (int j = 0; j < frame.sblimit; j++)
			{
				fprintf(output, "subband[%2d]:%2d\n", j, bit_alloc[i][j]);
			}
		}
	}

四、输出结果

音乐:

采样率:44.1 khz
目标码率:192 kbps
第61帧
可用比特数:5016
比例因子:
通道[1] 
subband[ 1]:     9	11	10	
subband[ 2]:    15	15	21	
subband[ 3]:    18	18	24	
subband[ 4]:    23	26	28	
subband[ 5]:    25	25	31	
subband[ 6]:    21	22	25	
subband[ 7]:    21	23	28	
subband[ 8]:    23	25	30	
subband[ 9]:    28	29	35	
subband[10]:    31	29	37	
subband[11]:    24	26	26	
subband[12]:    24	28	31	
subband[13]:    21	22	27	
subband[14]:    19	19	25	
subband[15]:    20	18	28	
subband[16]:    20	25	27	
subband[17]:    30	31	37	
subband[18]:    26	25	30	
subband[19]:    26	28	37	
subband[20]:    29	32	37	
subband[21]:    31	31	36	
subband[22]:    29	31	34	
subband[23]:    38	42	44	
subband[24]:    54	52	50	
subband[25]:    55	55	53	
subband[26]:    55	54	52	
subband[27]:    55	52	54	
subband[28]:    53	52	55	
subband[29]:    54	54	54	
subband[30]:    53	51	53	

分配的比特数为:
channel[ 1] 
subband[ 0]: 9
subband[ 1]: 8
subband[ 2]: 7
subband[ 3]: 8
subband[ 4]: 7
subband[ 5]: 7
subband[ 6]: 7
subband[ 7]: 6
subband[ 8]: 6
subband[ 9]: 6
subband[10]: 7
subband[11]: 7
subband[12]: 6
subband[13]: 6
subband[14]: 6
subband[15]: 6
subband[16]: 2
subband[17]: 5
subband[18]: 4
subband[19]: 4
subband[20]: 3
subband[21]: 4
subband[22]: 0
subband[23]: 0
subband[24]: 0
subband[25]: 0
subband[26]: 0
subband[27]: 0
subband[28]: 0
subband[29]: 0

噪声:

采样率:22.1 khz
目标码率:96 kbps
第61帧
可用比特数:5016
比例因子:
通道[1] 
subband[ 1]:    23	24	21	
subband[ 2]:    21	22	20	
subband[ 3]:    18	18	20	
subband[ 4]:    22	15	16	
subband[ 5]:    18	18	18	
subband[ 6]:    21	20	18	
subband[ 7]:    25	24	24	
subband[ 8]:    22	22	22	
subband[ 9]:    19	20	22	
subband[10]:    24	23	23	
subband[11]:    21	22	21	
subband[12]:    18	20	19	
subband[13]:    25	22	23	
subband[14]:    23	22	25	
subband[15]:    23	25	22	
subband[16]:    27	28	29	
subband[17]:    27	25	26	
subband[18]:    31	31	30	
subband[19]:    31	31	32	
subband[20]:    31	29	29	
subband[21]:    27	27	27	
subband[22]:    29	27	28	
subband[23]:    34	32	29	
subband[24]:    35	31	32	
subband[25]:    36	36	34	
subband[26]:    38	35	35	
subband[27]:    38	36	36	
subband[28]:    35	34	34	
subband[29]:    36	37	36	
subband[30]:    34	34	36	
通道[2] 
subband[ 1]:    24	25	21	
subband[ 2]:    21	23	20	
subband[ 3]:    18	18	20	
subband[ 4]:    22	15	16	
subband[ 5]:    18	17	18	
subband[ 6]:    20	20	18	
subband[ 7]:    25	23	23	
subband[ 8]:    22	22	22	
subband[ 9]:    19	20	22	
subband[10]:    24	23	24	
subband[11]:    21	22	21	
subband[12]:    18	20	19	
subband[13]:    25	22	23	
subband[14]:    23	22	25	
subband[15]:    23	25	22	
subband[16]:    27	28	29	
subband[17]:    27	26	25	
subband[18]:    30	31	30	
subband[19]:    31	31	32	
subband[20]:    31	29	29	
subband[21]:    27	27	27	
subband[22]:    29	27	28	
subband[23]:    34	32	29	
subband[24]:    35	31	32	
subband[25]:    36	36	34	
subband[26]:    38	35	35	
subband[27]:    38	36	36	
subband[28]:    35	34	34	
subband[29]:    36	37	36	
subband[30]:    34	34	36	

分配的比特数为:
channel[ 1] 
subband[ 0]: 4
subband[ 1]: 4
subband[ 2]: 4
subband[ 3]: 5
subband[ 4]: 3
subband[ 5]: 3
subband[ 6]: 1
subband[ 7]: 3
subband[ 8]: 3
subband[ 9]: 2
subband[10]: 2
subband[11]: 3
subband[12]: 1
subband[13]: 1
subband[14]: 1
subband[15]: 1
subband[16]: 2
subband[17]: 0
subband[18]: 0
subband[19]: 1
subband[20]: 1
subband[21]: 1
subband[22]: 1
subband[23]: 1
subband[24]: 0
subband[25]: 0
subband[26]: 0
subband[27]: 1
subband[28]: 0
subband[29]: 1
channel[ 2] 
subband[ 0]: 4
subband[ 1]: 4
subband[ 2]: 5
subband[ 3]: 5
subband[ 4]: 3
subband[ 5]: 3
subband[ 6]: 2
subband[ 7]: 3
subband[ 8]: 3
subband[ 9]: 2
subband[10]: 2
subband[11]: 3
subband[12]: 1
subband[13]: 2
subband[14]: 2
subband[15]: 1
subband[16]: 2
subband[17]: 0
subband[18]: 1
subband[19]: 1
subband[20]: 2
subband[21]: 1
subband[22]: 1
subband[23]: 1
subband[24]: 0
subband[25]: 0
subband[26]: 0
subband[27]: 1
subband[28]: 0
subband[29]: 1

混合:

采样率:48.0 khz
目标码率:192 kbps
第61帧
可用比特数:4608
比例因子:
通道[1] 
subband[ 1]:     8	11	10	
subband[ 2]:    12	12	11	
subband[ 3]:    13	15	13	
subband[ 4]:    15	18	17	
subband[ 5]:    15	17	15	
subband[ 6]:    16	16	15	
subband[ 7]:    21	20	18	
subband[ 8]:    20	20	21	
subband[ 9]:    22	25	26	
subband[10]:    24	22	24	
subband[11]:    22	21	22	
subband[12]:    22	23	22	
subband[13]:    20	22	22	
subband[14]:    19	22	23	
subband[15]:    21	21	22	
subband[16]:    28	28	28	
subband[17]:    26	25	26	
subband[18]:    31	30	31	
subband[19]:    33	31	34	
subband[20]:    31	33	33	
subband[21]:    37	36	35	
subband[22]:    56	60	56	
subband[23]:    58	58	56	
subband[24]:    58	57	58	
subband[25]:    59	58	57	
subband[26]:    59	56	58	
subband[27]:    59	55	58	
通道[2] 
subband[ 1]:     8	11	 9	
subband[ 2]:    12	12	11	
subband[ 3]:    13	14	13	
subband[ 4]:    16	18	16	
subband[ 5]:    15	16	14	
subband[ 6]:    15	15	16	
subband[ 7]:    20	21	17	
subband[ 8]:    19	21	21	
subband[ 9]:    24	26	23	
subband[10]:    22	21	23	
subband[11]:    24	23	22	
subband[12]:    21	21	23	
subband[13]:    19	22	22	
subband[14]:    22	20	24	
subband[15]:    21	21	21	
subband[16]:    29	30	27	
subband[17]:    25	26	26	
subband[18]:    32	30	31	
subband[19]:    33	34	34	
subband[20]:    32	32	32	
subband[21]:    38	37	36	
subband[22]:    57	57	56	
subband[23]:    59	59	57	
subband[24]:    59	58	57	
subband[25]:    58	58	57	
subband[26]:    58	59	59	
subband[27]:    56	59	56	

分配的比特数为:
channel[ 1] 
subband[ 0]: 6
subband[ 1]: 4
subband[ 2]: 3
subband[ 3]: 5
subband[ 4]: 4
subband[ 5]: 4
subband[ 6]: 3
subband[ 7]: 3
subband[ 8]: 4
subband[ 9]: 3
subband[10]: 4
subband[11]: 3
subband[12]: 3
subband[13]: 4
subband[14]: 2
subband[15]: 0
subband[16]: 1
subband[17]: 0
subband[18]: 0
subband[19]: 0
subband[20]: 0
subband[21]: 0
subband[22]: 0
subband[23]: 0
subband[24]: 0
subband[25]: 0
subband[26]: 0
channel[ 2] 
subband[ 0]: 6
subband[ 1]: 4
subband[ 2]: 4
subband[ 3]: 5
subband[ 4]: 5
subband[ 5]: 4
subband[ 6]: 4
subband[ 7]: 4
subband[ 8]: 3
subband[ 9]: 4
subband[10]: 4
subband[11]: 3
subband[12]: 4
subband[13]: 3
subband[14]: 2
subband[15]: 0
subband[16]: 1
subband[17]: 0
subband[18]: 0
subband[19]: 0
subband[20]: 0
subband[21]: 0
subband[22]: 0
subband[23]: 0
subband[24]: 0
subband[25]: 0
subband[26]: 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值