MPEG音频编码实验

原理理解

①上线(主干):子带分解

以1152个样本为单位,输入到滤波器组中进行32个子带的分解,即以32个样本为一个时间窗口,做36次自带分解,形成36个样本,形成以12个样本为单位的3个块(以12个样本为观察组,之间的差别不大),以此进行比例因子的提取和选择,通过频域分析线路的辅助,进行后续的量化等工作。

②下线(辅助):频域分析

通过1024点的FFT输出FFT结果,和比例因子共同输入到心理声学模型中,输出SMR并生成听阈曲线,再结合码率限制进行动态比特分配,使整帧和每个子带的总噪声-掩蔽比最小,最终结合主干线路进行装帧。
 

心理声学模型的实现过程

1.临界频带的概念

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

2.掩蔽值计算的思路

音频信号可以分解为乐音和噪声,两者共有四种掩蔽组合,即“乐音-乐音”、“乐音-噪声”、“噪声-乐音”、“噪声-噪声”。另有安静时的阈值为绝对阈值。

某一频率点i的总掩蔽阈值可通过该点的绝对掩蔽阈值与单独掩蔽阈值相加获得。

第一项为绝对阈值、第二项为乐音掩蔽、第三项为噪音掩蔽。

码率分配的实现思路

对每个子带计算掩蔽-噪声比MNR,即信噪比SNR-信掩比SMR,即MNR=SNR-SMR

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

在m2aenc.c中增加代码:

  fprintf(out_txt, "该音频声道数:%d\n", nch);
  fprintf(out_txt, "观测第 %d 帧\n", frameNum);
  fprintf(out_txt, "本帧所分配比特:%d bits\n", adb);
  fprintf(out_txt, "该帧比例因子和比特分配结果如下:\n");
  for (ch = 0; ch < nch; ch++)
  {
	  fprintf(out_txt, "--- 声道%2d ----\n", ch + 1);
	  for (sb = 0; sb < frame.sblimit; sb++)
	  {
		  fprintf(out_txt, "子带[%2d]比例因子:\t", sb + 1);
		  for (gr = 0; gr < 3; gr++)
		  {
			  fprintf(out_txt, "%2d\t", scalar[ch][gr][sb]);
		  }
		  fprintf(out_txt, "\n");
		  fprintf(out_txt, "子带[%2d]比特分配表:\t%2d\n", sb + 1, bit_alloc[ch][sb]);
		  fprintf(out_txt, "\n");
	  }
  }

 在int main()内增加代码:

int gr;
FILE* out_txt = NULL;
unsigned char* outTXT = NULL;
out_txt = fopen("output.txt", "w");

噪声:

通道信息:
 

选取音乐+噪音混合mix.wav:

通道信息:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值