M-PEG感知音频编码分析

M-PEG压缩编码框图

M-PEG感知音频编码分析_第1张图片
在音频编码上,首先我们采用滤波器组来分解信号,从而使编码更灵活压缩效率更高,同时多相滤波器组得到的子带信号拥有了很高的时间分辨力,以此来应对各种的突发信号。
而对于每个子带的信号,如何进行比特分配呢?我们知道在时频分析上,时间和频率的分辨力存在着矛盾,虽然MPEG32个子带编码有着很高的时域分辨力,但是在频率上每个子带的带宽为750Hz,前两个子带几乎包含了所有的低频信号,因此在bit分配上想要利用人的心理声学模型进行更好的压缩,这么宽的频率分辨力使不行的,因此引入了下面一条1024点FFT的线,从心理声学模型得到及其细致的频率掩蔽曲线,进行更细致的比特分配,以此达到更好的压缩比,以及在相同码率下得到最大的信号信噪比。
M-PEG感知音频编码分析_第2张图片

MPEG编码程序分析

重要结构体

对于音频编码而言,整个编码的层次,最主要的就是音频帧的结构了。对于音频帧定义了两个结构体frame_header与frame_info。
info包含了header和比特分配表,header内容是hi帧的各种信息。

typedef struct
{
  frame_header *header;  /* raw header information */
  int actual_mode;  /* when writing IS, may forget if 0 chs */
  al_table *alloc;  /* bit allocation table read in */
  int tab_num;   /* number of table as loaded */
  int nch;   /* num channels: 1 for mono, 2 for stereo */
  int jsbound;   /* first band of joint stereo coding */
  int sblimit;   /* total number of sub bands */
}
frame_info;
typedef struct
{
  int version;
  int lay;
  int error_protection;
  int dab_extension;
  int dab_length;
  int bitrate_index;
  int sampling_frequency;
  int padding;
  int extension;
  int mode;
  int mode_ext;
  int copyright;
  int original;
  int emphasis;
}
frame_header;

除了上两个关于帧的结构体,帧的上层使比特流
M-PEG感知音频编码分析_第3张图片
除此之外是比特分配信息的结构体
M-PEG感知音频编码分析_第4张图片
需要注意的是,在结构体中保存的很多变量并不是真实值而是索引值,例如想要输出sample_frequency,需要从header的version和sampling_frequency得到索引,然后再common.c的结构体中找到。

输出音频帧信息

首先输出音频你信号的采样率、目标码率以及某一帧的可用比特信息。
M-PEG感知音频编码分析_第5张图片
再输出子带比例因子
M-PEG感知音频编码分析_第6张图片
M-PEG感知音频编码分析_第7张图片
最后输出比特分配结果以及比特选择信息
M-PEG感知音频编码分析_第8张图片
得到
M-PEG感知音频编码分析_第9张图片
以上为音乐信号的输出结果,可以看出基本上比特分配都在低频区域,超过16子带过后几乎不怎么分配比特了。

噪音信号的比特分配结果

M-PEG感知音频编码分析_第10张图片
可以看出比例因子很相似,且时间上突发情况,时域很不平稳。
M-PEG感知音频编码分析_第11张图片
可以看出在各个子带上都有比特分配且很均等。

你可能感兴趣的:(M-PEG感知音频编码分析)