MPEG编码

MPEG编码原理解释

两条主线

在这里插入图片描述
第一条线:通过子带分析滤波器组使信号具有高的时间分辨率,确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量。
第二条线:使信号通过FFT运算具有高的频率分辨率,计算信号中不可听觉感知的部分,即计算信号的掩蔽阈值,信掩比SMR,第二条线是重点。

矛盾点

在这里插入图片描述频域分解力分得很细,但到了子带却映射到很粗的范围上,即按临界频带去分析,在临界频带内分析,每个临界频带得到掩蔽阈值,最后又要返回到32个子带中去,一个子带又可能跨越好几个临界频域。

临界频带

临界频带表征了人类最主要的听觉特性,在纯音对窄带噪声掩蔽量的规律中,掩蔽量刚开始时随着噪声带宽的加宽而增大,但带宽超过某一定值后,掩蔽量就不再增加,这一带宽就称为临界频带。

掩蔽值的计算

音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得,每个子带再选出本子带中最小的阈值作为子带阈值,再计算每个子带信掩比SMR,将SMR传给编码单元进行码率分配。
在这里插入图片描述

码率分配

为了使整帧和每个子带的总噪声—掩蔽比(NMR)最小,其中NMR = SMR – SNR,循环此过程:计算NMR,为NMR较大的子带分配更多比特,使获益最大的子带的量化级别增加一级。直到没有多余的bit可分配

程序修改

我们仿照上一个实验,在m2aenc.h文件中添加一个trace。
在这里插入图片描述在主函数中进行变量的追踪查看

#if TRACE
  if (frameNum == 64) {
	  fprintf(p_trace, "采样率:%.1f kHz\n", s_freq[header.version][header.sampling_frequency]);
	  fprintf(p_trace, "目标码率:%d kbps\n", bitrate[header.version][header.bitrate_index]);
	  // 所分配的比特数
	  fprintf(p_trace, "该帧分配的比特数为:%d\n", adb);
	  fprintf(p_trace, "-------------------------------------------------------------\n");
	  // 比例因子
	  fprintf(p_trace, "比例因子\n");
	  fprintf(p_trace, "-------------------------------------------------------------\n");
	  for (ch = 0; ch < 2; ch++) {
		  fprintf(p_trace, "声道%d:\n", ch + 1);
		  for (sb = 0; sb < 32; sb++) {
			  fprintf(p_trace, "子带%d: %d %d %d\n", sb + 1, scalar[ch][0][sb], scalar[ch][1][sb], scalar[ch][2][sb]);
		  }
		  fprintf(p_trace, "-------------------------------------------------------------\n");
	  }
	  // 比特分配
	  fprintf(p_trace, "比特分配\n");
	  fprintf(p_trace, "-------------------------------------------------------------\n");
	  for (ch = 0; ch < 2; ch++) {
		  fprintf(p_trace, "声道%d:\n", ch + 1);
		  for (sb = 0; sb < 32; sb++) {
			  fprintf(p_trace, "子带%2d: %d\n", sb + 1, bit_alloc[ch][sb]);
			
		  }
		  fprintf(p_trace, "-------------------------------------------------------------\n");
	  }
	
	  
	  fflush(p_trace);

  }
#endif
乐音

在这里插入图片描述在这里插入图片描述

噪音

我们由matlab产生噪音,噪音和乐音的混合

clear
clc
%% 读取音频信号
[audio,fs] = audioread("D:\D3xia_experiment\shujuyasuo\START.wav");
audio = audio(:,1);%取单声道
%% 生成白噪声
noise = randn(1,length(audio));
%% 输出白噪声
audiowrite('noise.wav',noise,fs);
%% 输出混合音频
mix = awgn(audio,40);
audiowrite('mix.wav',mix,fs);

在这里插入图片描述在这里插入图片描述

噪声和乐音混合

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MPEG编码是一种用于视频压缩的标准,可将高分辨率视频转化为较低比特率的视频,以节省存储空间和传输带宽。在Matlab中,可以使用一些工具箱和函数来进行MPEG编码的仿真。 首先,我们需要使用Matlab中的视频处理工具箱来读取和处理视频文件。可以使用`VideoReader`函数来读取视频文件,并使用`imresize`函数对视频进行缩放以适应编码要求。 接下来,我们可以使用`MPEG-2编码器`对视频进行编码MPEG-2是一种常用的视频编码标准,它使用了两种主要的编码技术:运动补偿和离散余弦变换(DCT)。在Matlab中,可以使用`vision.VideoFileReader`函数来读取视频片段,并使用`vision.VideoFileWriter`函数来写入编码后的视频文件。 在MPEG编码中,首先对视频帧进行运动估计,以找到每个帧之间的运动向量。然后,使用DCT将帧转换为频域,减少冗余信息。最后,使用量化和熵编码技术对频域系数进行编码。在Matlab中,我们可以使用视频处理工具箱中的`videomotion`和`videocodec`函数来进行这些操作。 最后,可以使用`vision.VideoFileReader`和`vision.VideoFileWriter`对编码后的视频文件进行解码和重组。使用`implay`函数可以播放解码后的视频文件,并使用`imwrite`函数将视频帧保存为图像文件。 通过在Matlab中进行MPEG编码的仿真,可以调整编码参数和算法来获得最佳的压缩效果和视频质量。这种仿真方法可以帮助我们更好地了解MPEG编码的原理和过程,并优化编码算法,以满足不同应用领域的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值