数据压缩第十二次作业

MPEG音频编码实验

实验要求:
1.理解感知音频编码的设计思想
2.理解心理声学模型的实现过程
3.理解码率分配的实现思路
4.理解程序设计的基本框架
5.输出音频的采样率和目标码率
6.选择某个数据帧,输出该帧所分配的比特数、该帧的比例因子、该帧的比特分配结果

一、理解感知音频编码的设计思想

在这里插入图片描述
从编码器原理图可以看出,一段PCM码流有两条处理路径:一个是通过滤波器组,将PCM样本变换到32个子带的频域信号,形成块并且通过线性量化器,形成颗粒,最终形成帧比特流。另一条是先对码流进行1024点FFT后通过心理声学模型,并且经过动态比特分配,再通过边信息编码,最终形成帧比特流。

二、理解心理声学模型的实现过程

心理声学模型是指听觉系统中存在一个听觉阈值点评,低于这个电平的声音信号就听不到。听觉阈值的大小随声音频率的变化而变化;一个人是否能听到声音取决于声音的频率,以及声音的幅度是否高于这种频域下的听觉阈值。

MPEG-I标准定义了两个模型:心理声学模型1、2.这里着重讨论心理声学模型1
步骤:
1.将样本变换到频域(采用HAnnah加权和DFT)
2.确定声压级别
在这里插入图片描述
3.考虑安静时阈值
4.将音频信号分解成“乐音”和“非乐音/噪声”部分:因为两种信号 的掩蔽能力不同
5.消除音调和非音调掩蔽成分
6.单个掩蔽阈值的计算
7.全局掩蔽阈值的计算
8.选择出本自带中最小的阈值作为子带阈值
9.计算每个子带信号掩蔽值,并将SMR传递给编码单元
SMR=信号能量/掩蔽阈值

三、理解码率分配的实现思路

1.比例因子的取值和编码
对各个子带每12个样点进行一次比例因子计算。先定出12个样点中绝对值的最大值。查比例因子表中比这个最大值大的 最小值作为比例因子。用6比特表示。
第2层的一帧对应36个子带样值,是第1层的三倍,原则上要传三个比例因子。为了降低比例因子的传输码率,采用了利用人耳时域掩蔽特性的编码策略。
每帧中每个子带的三个比例因子被一起考虑,划分成特定的几种模式。根据这些模式,1个、2个或3个比例因 子和比例因子选择信息(每子带2比特)一起被传送。如果一个比例因子和下一个只有很小的差别,就只传送大的一个,这种情况对于稳态信号经常出现。

2.比特分配及编码
对每个子带计算掩蔽-噪声比MNR,是信噪比SNR-信掩比
SMR,即:MNR = SNR – SMR
在这里插入图片描述
使整个一帧和每个子带的总噪声-掩蔽比最小。这是一个循环过程,每一次循环使获益 最大的子带的量化级别增加一级,当然所用比特数不能超过一帧所能提供的最大数目。
第1层一帧用4比特给每个子带的比特分配信息编码;而第2层只在低频段用4比特,高频段则用2比特。

3.子带样值的量化和编码
输入以12个样本为一组,每组样本经过时间-频率变换之后进行一次比特分配并记录一个比例因子(scale factor)
比特分配信息告诉解码器每个样本由几位表示,比例因子用6比特表示,解码器使用这个6比特的比例因子乘逆量化器的每个输出样本值,以恢复被量化的子带值。比例因子的作用是充分利用量化器的量化范围, 通过比特分配和比例因子相配合,可以表示动态范围超过120dB的样本 。
第2层中,量化级别的数目随子带的不同而不同,但量化等级仍然覆盖了3~65535的范围,同时子带不被分配给比特的概率增加了,没有分配给比特的子带就不被量化。低频段的量化等级有15级,中频段7级,高频段只有3级

4.数据帧包装

在这里插入图片描述
在这里插入图片描述
帧头(Header):每帧开始的头32个比特,包含有同步和状
态比特流信息,在所有层都相同,同步码字为12bit全1码
(1111,1111,1111)。
误码检测CRC:使用一种16bit奇偶校验字,可供在比特流中作检测误码用。在所有层都相同。
声音数据:由比特分配表、比例因子选择信息、比例因子和子带样值组成,其中子带样值是声音数据的最大部分。每层声音数据不同。
辅助数据:用作辅助数据比特流。

四、理解程序设计的基本框架

int main (int argc, char **argv)
{
   
  typedef double SBS[2][3][SCALE_BLOCK][SBLIMIT];
  SBS *sb_sample;
  typedef double JSBS[3][SCALE_BLOCK][SBLIMIT];
  JSBS *j_sample;
  typedef double IN[2][HAN_SIZE];
  IN *win_que;
  typedef unsigned int SUB[2][3][SCALE_BLOCK][SBLIMIT];
  SUB *subband;

  frame_info frame;
  frame_header header;
  char original_file_name[MAX_NAME_SIZE];
  char encoded_file_name[MAX_NAME_SIZE];
  short **win_buf;
  static short buffer[2][1152];
  static unsigned int bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT];
  static unsigned int scalar[2][3][SBLIMIT], j_scale[3][SBLIMIT];
  static double smr[2][SBLIMIT], lgmin[2][SBLIMIT], max_sc[2][SBLIMIT];
  // FLOAT snr32[32];
  short sam[2][1344];		/* was [1056]; */
  int model, nch, error_protection;
  static unsigned int crc;
  int sb, ch, adb;
  unsigned long frameBits, sentBits = 0;
  unsigned long num_samples;
  int lg_frame;
  int i;

  /* Used to keep the SNR values for the fast/quick psy models */
  static FLOAT smrdef[2][32];

  static int psycount = 0;
  extern int minimum;

  time_t start_time, end_time;
  int total_time;

  sb_sample = (SBS *) mem_alloc (sizeof (SBS), "sb_sample");
  j_sample = (JSBS *) mem_alloc (sizeof (JSBS), "j_sample");
  win_que = (IN *) mem_alloc (sizeof (IN), "Win_que");
  subband = (SUB *) mem_alloc (sizeof (SUB), "subband");
  win_buf = (short **) mem_alloc (sizeof (short *) * 2, "win_buf");

  /* clear buffers */
  memset ((char *) buffer, 0, sizeof (buffer));
  memset ((char *) bit_alloc, 0, sizeof (bit_alloc));
  memset ((char *) scalar, 0, sizeof (scalar));
  memset ((char *) j_scale, 0, sizeof (j_scale));
  memset ((char *) scfsi, 0, sizeof (scfsi));
  memset ((char *) smr, 0, sizeof (smr));
  memset ((char *) lgmin, 0, sizeof (lgmin));
  memset ((char *) max_sc, 0, sizeof (max_sc));
  //memset ((char *) snr32, 0, sizeof (snr32));
  memset ((char *) sam, 0, sizeof (sam));

  global_init ();
  
  header.extension = 0;
  frame.header = &header;
  frame.tab_num = -1;		/* no table loaded */
  frame.alloc = NULL
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值