数据压缩原理与应用 实验六 MPEG音频编码实验

来源:互联网 发布:淘宝买汽车配件 编辑:程序博客网 时间:2024/06/05 02:58

一、实验原理

1. MPEG-1 声音的主要性能

  • 1.1 输入为PCM 信号,采样率为32,44.1或48kHz,输出为32kbps到384kbps。
  • 1.2 三个独立的压缩层次
    • Layer1:编码器最简单,384kbps(4:1,用于小型数字盒带DCC,Compact Cassette))
    • Layer2 :编码器复杂程度中等,256kbps ~192kbps (6:1 ~8 :1,用于DAB 、CD-I 和VCD)
    • Layer3 :编码器最为复杂,64kbps ,用于ISDN ,网络音频。
      MPEG1音频压缩的数据率
  • 1.3 心理声学模型

频域掩蔽域随声压级变化曲线

  • 听觉系统中存在一个听觉阈值电平,低于这个电平的声音信号就听不到。听觉阈值的大小随声音频率的改变而改变。一个人是否听到声音取决于声音的频率,以及声音的幅度是否高于这种频率下的听觉阈值
  • 听觉掩蔽特性。即听觉阈值电平是自适应的,会随听到的不同频率声音而发生变化
  • 声音压缩算法可以确立这种特性的模型来取消更多的冗余数据

  • 人耳听觉系统
    人耳听觉系统

    • 人类听觉系统大致等效于一个在0Hz 到20KHz 频率范围内由25 个重叠的带通滤波器组成的滤波器组。
    • 人耳不能区分同一频带内同时发生的不同声音;
    • 临界频带(critical band ):当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。
    • 500Hz 以下每个临界频带的带宽大约是100Hz,从500Hz 起, 临界频带带宽线性增加
  • 掩蔽与量化
    将输入信号变换到频域,再将结果分解成一些尽量与临界频带尽可能相似的子带,然后对每个子带进行量化,量化方式应当使得量化噪声听不见

2. MPEG音频压缩

MPEG音频压缩图

  • 2.1 多相滤波器组(Polyphase Filter Bank):将PCM样本变换到32个子带的频域信号
    多相滤波器组
  • 2.2 心理声学模型(Psychoacoustic Model):计算信号中不可听觉感知的部分

    • 将样本变换到频域
      32个等分的子带信号并不能精确地反映人耳的听觉特性。
      引入FFT补偿频率分辨率不足的问题。
    • 确定声压级别
    • 考虑安静时阈值
    • 将音频信号分解成“乐音(tones)” 和“非乐音/噪声”两部分:因为两种信号的掩蔽能力不同
      乐音/非乐音
    • 音调和非音调掩蔽成分的消除
      利用标准中给出的绝对阈值消除被掩蔽成分;考虑在每个临界频带内,小于0.5Bark的距离中只保留最高功率的成分
    • 单个掩蔽阈值的计算
      音调成分和非音调成分单个掩蔽阈值根据标准中给出的算法求得。
    • 全局掩蔽阈值的计算
    • 每个子带的掩蔽阈值
      选择出本子带中最小的阈值作为子带阈值
    • 计算每个子带信号掩蔽比(signal-to-maskratio, SMR)
      SMR = 信号能量 / 掩蔽阈值,传递给编码单元
  • 2.3 比特分配器(Bit Allocator):根据心理声学模型的计算结果,为每个子带信号分配比特数
    比特分配

    • 目的:使整帧和每个子带的总噪声—掩蔽比最小
    • 计算:掩蔽-噪声比MNR = SNR – SMR (dB)
  • 2.4 装帧(Frame Creation):产生MPEG-I兼容的比特流
    装帧

二、实验要求

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

三、代码分析

#else    /*************************Add***************************/     if(frameNum==2)    {        fprintf(outinfo,"Sampling Rate:%.1fkhz\n",s_freq[header.version][header.sampling_frequency]);        fprintf(outinfo,"Target Bitrate:%dMbps\n",bitrate[header.version][header.bitrate_index]);        fprintf(outinfo,"The R-BIT of The Second Frame:%d\n",adb);     }    transmission_pattern (scalar, scfsi, &frame);    main_bit_allocation (smr, scfsi, bit_alloc, &adb, &frame, &glopts);    if (error_protection)      CRC_calc (&frame, bit_alloc, scfsi, &crc);    encode_info (&frame, &bs);    if (error_protection)      encode_CRC (crc, &bs);    encode_bit_alloc (bit_alloc, &frame, &bs);    encode_scale (bit_alloc, scfsi, scalar, &frame, &bs);    subband_quantization (scalar, *sb_sample, j_scale, *j_sample, bit_alloc,              *subband, &frame);    sample_encoding (*subband, bit_alloc, &frame, &bs);    /***********************Add*************************/     if(frameNum==2)    {        fprintf(outinfo,"Scale Factor\n");        for ( cha = 0; cha < nch; cha++ )//Sound Channel        {               fprintf(outinfo,"Sound Channel%d\n",cha);            fprintf(outinfo,"Subband\tGroup1\tGroup2\tGroup3\t\n");            for ( sbd = 0; sbd < frame.sblimit; sbd++ )//Subband            {                fprintf(outinfo,"%4d\t",sbd);                for( gro = 0; gro < 3; gro++ )//Group                {                    fprintf(outinfo,"%3d\t",scalar[cha][gro][sbd]);                }                fprintf(outinfo,"\n");            }        }        fprintf(outinfo,"Frame Bit Allocation:\n");        for ( cha = 0; cha < nch; cha++ )//Sound Channel        {            fprintf(outinfo,"Sound Channel%d\n",cha);            for ( sbd = 0; sbd < frame.sblimit; sbd++ )//Subband            {                fprintf(outinfo,"Subband%2d:\t",sbd);                   fprintf(outinfo,"%2d\n",bit_alloc[cha][sbd]);            }        }        if(outinfo)            fclose(outinfo);    /********************End******************************/    }#endif

四、实验结果

1

2

3