test_06:MPEG 音频压缩

实验原理

下图为MPEG音频编码layerII流程图:

32个子带滤波器组:

通过子带分析滤波器组使信号具有高的时间分辨率,确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量。

将PCM样本变换到32个子带的频域信号:如果输入的采样频率为48kHz ,那么子带的频率宽度为48/ (2*32 )=0.75Hz
该多相滤波器组为如下图:


心理声学模型:

计算信号中不可听觉感知的部分。
时频分析的矛盾:
1、通过子带分析滤波器组使信号具有高的时间分辨率,确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量
2、又可以使信号通过FFT运算具有高的频率分辨率,因为掩蔽阈值是从功率谱密度推出来的。

在低频子带中,为了保护音调和共振峰的结构,就要求用较小的量化阶、较多的量化级数,即分配较多的位数来表示样本值。而话音中的摩擦音和类似噪声的声音,通常出现在高频子带中,对它分配较少的位数。

步骤:

将样本变换到频域->确定声压级别->考虑安静时阈值->将音频信号分解成“乐音(tones)” 和“非乐音/噪声”部分:因为两种信号的掩蔽能力不同->音调和非音调掩蔽成分的消除->单个掩蔽阈值的计算->全局掩蔽阈值的计算->每个子带的掩蔽阈值->计算每个子带信号掩蔽比(signal-to-maskratio, SMR)

比特分配过程:

使整帧和每个子带的总噪声—掩蔽比最小。
算法:循环,直到没有比特可用:
1、对每个子带计算掩蔽-噪声比MNR,MNR = SNR –SMR (dB)
2、对最低MNR的子带分配比特,使获益最大的子带的量化级别增加一级
3、重新计算分配了更多比特子带的MNR

实验流程

理解程序设计的整体框架
理解感知音频编码的设计思想
两条线
时-频分析的矛盾!
理解心理声学模型的实现过程
临界频带的概念
掩蔽值计算的思路
理解码率分配的实现思路

输出音频的采样率和目标码率
选择某个数据帧,输出
该帧所分配的比特数
该帧的比例因子
该帧的比特分配结果

关键代码

[csharp]  view plain  copy
  1. #ifdef NEWENCODE  
  2.     sf_transmission_pattern (scalar, scfsi, &frame);  
  3.     main_bit_allocation_new (smr, scfsi, bit_alloc, &adb, &frame, &glopts);  
  4.     //main_bit_allocation (smr, scfsi, bit_alloc, &adb, &frame, &glopts);  
  5.   
  6.     if (error_protection)  
  7.       CRC_calc (&frame, bit_alloc, scfsi, &crc);  
  8.   
  9.     write_header (&frame, &bs);  
  10.     //encode_info (&frame, &bs);  
  11.     if (error_protection)  
  12.       putbits (&bs, crc, 16);  
  13.     write_bit_alloc (bit_alloc, &frame, &bs);  
  14.     //encode_bit_alloc (bit_alloc, &frame, &bs);  
  15.     write_scalefactors(bit_alloc, scfsi, scalar, &frame, &bs);  
  16.     //encode_scale (bit_alloc, scfsi, scalar, &frame, &bs);  
  17.     subband_quantization_new (scalar, *sb_sample, j_scale, *j_sample, bit_alloc,  
  18.                   *subband, &frame);  
  19.     //subband_quantization (scalar, *sb_sample, j_scale, *j_sample, bit_alloc,  
  20.     //    *subband, &frame);  
  21.     write_samples_new(*subband, bit_alloc, &frame, &bs);  
  22.     //sample_encoding (*subband, bit_alloc, &frame, &bs);  
  23. #else  
  24. /*add by yangyulan*/  
  25. if(frameNum==200)  
  26. {  
  27.     int k,t,i;  
  28.     fprintf(result,"采样率=%.1f khz\n",s_freq[header.version][header.sampling_frequency]);  
  29.     fprintf(result,"目标码率=%d kbps\n", bitrate[header.version][header.bitrate_index]);  
  30.     fprintf(result,"第%d帧\n",frameNum);  
  31.     fprintf(result,"可用比特数=%d\n",adb);  
  32.     fprintf(result,"比例因子:\n");  
  33.     for(k=0;k<nch;k++)  
  34.     {  
  35.         fprintf(result,"声道[%d]\n",k);  
  36.         for(i=0;i<frame.sblimit;i++)  
  37.         {  
  38.             fprintf(result,"子带[%d]:",i);  
  39.             for(t=0;t<3;t++)  
  40.             {  
  41.                 fprintf(result,"%d\t",scalar[k][t][i]);  
  42.             }  
  43.             fprintf(result,"\n");  
  44.         }  
  45.     }  
  46.   
  47. }  
  48. /*end by yangyulan*/  
  49.     transmission_pattern (scalar, scfsi, &frame);  
  50.     main_bit_allocation (smr, scfsi, bit_alloc, &adb, &frame, &glopts);  
  51. /*add by yangyulan*/  
  52. if(frameNum==200)  
  53. {  
  54.     int k,i;  
  55.     fprintf(result,"比特分配:\n");  
  56.     for(k=0;k<nch;k++)  
  57.     {  
  58.         fprintf(result,"声道[%d]\n",k);  
  59.         for(i=0;i<frame.sblimit;i++)  
  60.         {  
  61.             fprintf(result,"子带[%d]:%d\n",i,bit_alloc[k][i]);  
  62.               
  63.         }  
  64.     }  
  65. }  
  66. /*end by yangyulan*/  
  67.     if (error_protection)  
  68.       CRC_calc (&frame, bit_alloc, scfsi, &crc);  
  69.     encode_info (&frame, &bs);  
  70.     if (error_protection)  
  71.       encode_CRC (crc, &bs);  
  72.     encode_bit_alloc (bit_alloc, &frame, &bs);  
  73.     encode_scale (bit_alloc, scfsi, scalar, &frame, &bs);  
  74.     subband_quantization (scalar, *sb_sample, j_scale, *j_sample, bit_alloc,  
  75.               *subband, &frame);  
  76.     sample_encoding (*subband, bit_alloc, &frame, &bs);  
  77.  
  78. #endif  


实验结果及其分析





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值