MPEG音频编码实验

实验原理

MPEG-1 Audio LayerII编码器原理

这里写图片描述

(1)多相滤波器组

先分成32个相等的子带。
这里写图片描述

(2)量化和编码

比例因子的取值和编码

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

比特分配及编码

在调整到固定的码率之前 ,先确定可用于样值编码的有效比特数,这个数值取决于比例因子、比例因子选择信息、比特分配信息 以及辅助数据所需比特数
比特分配的过程
对每个子带计算掩蔽-噪声比MNR,是信噪比SNR – 信掩比 SMR,即:MNR = SNR – SMR
使整个一帧和每个子带的总噪声-掩蔽比最小。这是一个循环过程,每一次循环使获益 最大的子带的量化级别增加一级,当然所用 比特数不能超过一帧所能提供的最大数目。
第1层一帧用4比特给每个子带的比特分配信 息编码;而第2层只在低频段用4比特,高频段则用2比特。

子带样值的量化和编码

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

实验流程

理解感知音频编码的设计思想
两条线
时-频分析的矛盾!
理解心理声学模型的实现过程
临界频带的概念
掩蔽值计算的思路
理解码率分配的实现思路
输出音频的采样率和目标码率
选择某个数据帧,输出**
该帧所分配的比特数
该帧的比例因子
该帧的比特分配结果

关键代码

采样率的输出

    if (frameNum == 25)
    {
#if YTXT
        fprintf(p_ytxt, "采样率:%.1f kHz\n", s_freq[header.version][header.sampling_frequency]);
        fflush(p_ytxt);
#endif

目标码率的输出

#if YTXT
        fprintf(p_ytxt, "目标码率:%d kbps ", bitrate[header.version][header.bitrate_index]);
        fflush(p_ytxt);
#endif
    }

该帧所分配的比特数

#if YTXT
    if (frameNum == 25) { fprintf(p_ytxt,"该帧所分配的比特数=%d\n", adb); }//add by ying
    fflush(p_ytxt);
#endif

该帧的比例因子

if (frameNum == 25)
    {
        int i, j, k;
        for (i = 0; i < nch; i++)
            for (j = 0; j < frame.sblimit; j++)
                for (k = 0; k < 3; k++)
                {
                    #if YTXT
                    fprintf(p_ytxt,"Channel%d:\t%d\t%d\t%d\n", i + 1,scalar[i][0][j], scalar[i][1][j], scalar[i][2][j]);
                    fflush(p_ytxt);
                     #endif
                }
    }

比特分配结果

    if (frameNum == 25)//add by ying
    {
        int i, j;
        for(i=0;i<2;i++)
            for (j = 0; j < frame.sblimit; j++)
            {
                #if YTXT
                fprintf(p_ytxt,"比特分配结果:Channel[%d]sblimit[%d]:%dbit\n", i + 1, j + 1, bit_alloc[i][j]);
                fflush(p_ytxt);
                #endif
            }
    }

实验结果

这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值