MPEG音频编码原理及编码器调试
一 MPEG音频编码
1 基本原理
基本思想:去掉音频信号中的冗余。其中,冗余主要来自:声音信号中本身存在的冗余;不被人耳感知的部分。
1.1 MPEG-1 Audio Layer2 编码器原理
该编码器主要采用了心理声学模型。
· 输入声音信号经过一个多相滤波器组,变换到多个子带。同时经过“心理声学模型”计算以频率为自变量的噪声掩蔽阈值。量化和编码部分用信掩比 SMR 决定分配给子带信号的量化位数,使量化噪声<掩蔽域值。最后通过数据帧包装将量化的子带样本和其它数据按照规定的帧格式组装成比特数据流。
· 通过子带分析滤波器组使信号具有高的时间分辨率,确保在短暂冲击信号情况下,编码的声音信号具有足够高的质量。
· 又可以使信号通过FFT运算具有高的频率分辨率,因为掩蔽阈值是从功率谱密度推出来的。
· 在低频子带中,为了保护音调和共振峰的结构,就要求用较小的量化阶、较多的量化级数,即分配较多的位数来表示样本值。而话音中的摩擦音和类似噪声的声音,通常出现在高频子带中,对它分配较少的位数。
1.2 听觉阈值
· 听觉系统中存在一个听觉阈值电平,低于这个电平的声音信号就听不到;
· 听觉阈值的大小随声音频率的改变而改变;
· 一个人是否听到声音取决于声音的频率,以及声音的幅度是否高于这种频率下的听觉阈值;
· 蓝线为听觉阈值,声强在蓝线以下的部分无法被听到;
1.3 频域掩蔽
· 听觉阈值电平是自适应的,会随听到的不同频率声音而发生变化。音调音的掩蔽阈的宽度随频率而变化,掩蔽曲线不对称,高频段一侧的曲线斜率缓些,低频音容易对高频音产生掩蔽。
1.4 临界频带
· 临界频带是指当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。
· 掩蔽效应在一定频率范围内不随带宽增大而改变,直至超过某个频率值。通常认为从20Hz到16kHz有25个临界频带,单位为Bark。 1 Bark = 一个临界频带的宽度。
1.5 掩蔽效果的加和计算
音乐与语音信号大都由一系列复杂的频谱分量构成,相应的这些多个掩蔽分量也会相互影响并最终获得一个整体的掩蔽阈值。对于多个掩蔽分量的综合掩蔽效果,目前有多种模型给出了描述方案 。
Lutfi 对多个掩蔽音同时存在时的综合掩蔽效果进行了研究:每个掩蔽音的掩蔽效果先独立变换然后再线性相加。
2. MPEG-2编码流程
2.1 多相滤波器组
划分子带的方式,分为线性划分和非线性划分。以下图为例,先线性划分为32个相等的子带,每个子带都可能覆盖若干个临界频带:
多相滤波器组的缺点:
· 等带宽的滤波器组与人类听觉系统的临界频带不对应(在低频区域,单个子带会覆盖多个临界频带)。
· 滤波器组与其逆过程不是无失真的(但滤波器组引入的误差很小,且听不到)。
· 子带间频率有混叠(滤波后的相邻子带有频率混叠现象,一个子带中的信号可以影响相邻子带的输出)。
2.2 量化和编码
2.2.1 比例因子的取值和编码
对各个子带每12个样点进行一次比例因子计算(查表)。
第二层中一帧对应36个子带样值,原则上要传送3个比例因子。
为了降低比例因子的传输码率,每帧中每个子带的三个比例因子被划分成特定的几种模式,根据这些模式,1个、2个或3个比例因子和比例因子选择信息(每子带2比特)一起被传送。如 果一个比例因子和下一个只有很小的差别,就只传送大的一个(这种情况在稳态信号中经常出现)。
2.2.2 比特分配及编码
比特分配:对每个子带计算掩噪比MNR (dB) = 信噪比SNR - 信掩比SMR,然后找出其中具有最低MNR的子带,并给该子带多分配一些比特,然后重新计算MNR,继续分配,重复该步骤,直至没有比特可以分配。这样可以使得在满足比特率和掩蔽要求的前提下,使MNR最小;
2.2.3 数据帧的包装
· 帧头(Header):每帧开始的头32个比特,包含有同步和状态比特流信息,在所有层都相同,同步码字为12bit全1码。
· 误码检测CRC:使用一种16bit奇偶校验字,可供在比特流中作检测误码用。
· 声音数据:由比特分配表、比例因子选择信息、比例因子和子带样值组成,其中子带样值是声音数据的最大部分。
· 辅助数据:用作辅助数据比特流
二、代码调试
先来看看本次实验代码的要求:
- 输出音频的采样率和目标码率
- 选择三个不同特性的音频文件
■ 噪声(持续噪声、突发噪声)
■ 音乐
■ 混合 - 对于某个数据帧,输出
■ 该帧所分配的比特数
■ 该帧的比例因子
■ 该帧的比特分配结果
1.
打印输入文件、输出文件、输出音频的采样率和目标码率。
#define FRAME_TRACE 1
#if FRAME_TRACEFILE* need;need = fopen("need.txt", "a");fprintf(need, "========== 基本信息 ==========\n");fprintf(need, "输入文件:%s\n", inPath);fprintf(need, "输出文件:%s\n", outPath);fprintf(need, "采样频率:%.1f kHz\n", s_freq[header->version][header->sampling_frequency]);fprintf(need, "输出文件码率:%d kbps\n", bitrate[header->version][header->bitrate_index]);fclose(need);
#endif // FRAME_TRACE
2.
输出某个数据帧的以下内容:
· 该帧所分配的比特数
· 该帧的比例因子
· 该帧的比特分配结果
#if FRAME_TRACEFILE* need;need = fopen("need.txt", "a");if (frameNum == 2) {fprintf(need, "声道数:%d\n", nch);fprintf(need, "目前观测第 %d 帧\n", frameNum);fprintf(need, "本帧比特预算:%d bits\n", adb);fprintf(need, "\n");/* 比例因子 */fprintf(need, "========== 比例因子 ==========\n");for (ch = 0; ch < nch; ch++) // 每个声道单独输出{fprintf(need, "------ 声道%2d ------\n", ch + 1);for (sb = 0; sb < frame.sblimit; sb++) // 每个子带{fprintf(need, "子带[%2d]:\t", sb + 1);for (int gr = 0; gr < 3; gr++) {fprintf(need, "%2d\t", scalar[ch][gr][sb]);}fprintf(need, "\n");}}fprintf(need, "\n");/* 比特分配表 */fprintf(need, "========== 比特分配表 ==========\n"); //输出比特分配结果for (ch = 0; ch < nch; ch++) {fprintf(need, "------ 声道%2d ------\n", ch + 1); //按声道分配for (sb = 0; sb < frame.sblimit; sb++) {fprintf(need, "子带[%2d]:\t%2d\n", sb + 1, bit_alloc[ch][sb]);}fprintf(need, "\n");}}fclose(need);
#endif // FRAME_TRACE
三 实验结果
以音频文件为例,添加代码后,可查看其中一帧:
------音频基本信息------
输入文件名:test.mp3
输出文件名:out.mp2
音频采样率:44.1 kHz
目标码率:192 kbps
----------------------------------音频信息---------
该音频声道数:2
观测第 3 帧
本帧比特预算:5016 bits
----------比例因子---------
--- 声道 1 ----
子带[ 1]: 8 9 7
子带[ 2]: 8 9 9
子带[ 3]: 8 9 9
子带[ 4]: 9 8 11
子带[ 5]: 10 9 10
子带[ 6]: 9 12 8
子带[ 7]: 12 11 9
子带[ 8]: 9 9 9
子带[ 9]: 9 10 10
子带[10]: 10 11 11
子带[11]: 8 8 10
子带[12]: 10 10 10
子带[13]: 10 10 9
子带[14]: 10 7 9
子带[15]: 9 7 9
子带[16]: 8 10 9
子带[17]: 10 9 9
子带[18]: 9 10 8
子带[19]: 9 12 9
子带[20]: 13 9 10
子带[21]: 9 7 12
子带[22]: 9 10 10
子带[23]: 9 11 8
子带[24]: 9 11 10
子带[25]: 8 9 10
子带[26]: 11 9 10
子带[27]: 9 9 11
子带[28]: 10 10 9
子带[29]: 9 10 10
子带[30]: 9 12 8
--- 声道 2 ----
子带[ 1]: 10 9 11
子带[ 2]: 9 10 10
子带[ 3]: 7 9 9
子带[ 4]: 9 9 8
子带[ 5]: 10 11 10
子带[ 6]: 9 9 9
子带[ 7]: 11 11 8
子带[ 8]: 9 8 9
子带[ 9]: 8 9 7
子带[10]: 9 8 10
子带[11]: 10 10 10
子带[12]: 10 7 9
子带[13]: 8 9 8
子带[14]: 12 10 10
子带[15]: 9 10 10
子带[16]: 8 10 9
子带[17]: 11 9 9
子带[18]: 12 11 9
子带[19]: 8 11 9
子带[20]: 10 9 9
子带[21]: 10 9 10
子带[22]: 12 9 11
子带[23]: 9 9 10
子带[24]: 11 12 10
子带[25]: 9 10 11
子带[26]: 8 10 10
子带[27]: 9 9 11
子带[28]: 9 9 8
子带[29]: 9 12 8
子带[30]: 10 11 12 --------- 比特分配表 ---------
--- 声道 1 ---
子带[ 1]: 5
子带[ 2]: 4
子带[ 3]: 3
子带[ 4]: 5
子带[ 5]: 5
子带[ 6]: 4
子带[ 7]: 5
子带[ 8]: 3
子带[ 9]: 5
子带[10]: 4
子带[11]: 3
子带[12]: 4
子带[13]: 3
子带[14]: 4
子带[15]: 4
子带[16]: 2
子带[17]: 2
子带[18]: 3
子带[19]: 2
子带[20]: 1
子带[21]: 1
子带[22]: 1
子带[23]: 2
子带[24]: 2
子带[25]: 2
子带[26]: 1
子带[27]: 1
子带[28]: 1
子带[29]: 1
子带[30]: 1--- 声道 2 ---
子带[ 1]: 4
子带[ 2]: 3
子带[ 3]: 3
子带[ 4]: 4
子带[ 5]: 5
子带[ 6]: 4
子带[ 7]: 3
子带[ 8]: 5
子带[ 9]: 5
子带[10]: 4
子带[11]: 3
子带[12]: 4
子带[13]: 3
子带[14]: 4
子带[15]: 4
子带[16]: 2
子带[17]: 2
子带[18]: 3
子带[19]: 2
子带[20]: 1
子带[21]: 1
子带[22]: 1
子带[23]: 2
子带[24]: 2
子带[25]: 2
子带[26]: 1
子带[27]: 1
子带[28]: 1
子带[29]: 1
子带[30]: 1
MPEG音频编码原理及编码器调试相关推荐
- 数据压缩(十三)——MPEG音频编码原理及编码器调试
文章目录 一.MPEG音频编码原理 1.1 基本思想 1.2 心理声学模型(Psychoacoustic model) 1.2.1 听觉阈值 1.2.2 频域掩蔽 1.3 临界频带(Critical ...
- 【实验】MPEG-1 Audio Layer II编码原理及编码器调试
目录 一.理解感知音频编码的设计思想 1.等响度曲线 2.频域掩蔽域随声压级变化曲线 二.理解心理声学模型的实现方法 1.临界频带(Critical Band) 2.掩蔽值计算的思路 三.人类听觉系统 ...
- Lab6 MPEG音频编码实验——C++代码实现
Lab6 MPEG音频编码实验--C++代码实现 一.MPEG音频编码实现框架及思路 1.MPEG音频编码实现框图: MPEG音频编码的实现主要分为上下两条线,上方红色框中的部分属于时域分析(粗细节) ...
- 实验六 MPEG音频编码
一.MPEG音频编码原理 1.1 基本思想 分析信号,去掉不能被感知的部分[声音压缩算法可以确立这种特性的模型来取消更多的冗余数据] 子带分析滤波器组:使信号具有高的时间分辨率[短暂冲击信号情况下,编 ...
- 【数据压缩】MPEG音频编码实验
一.MPEG-1 Audio LayerII编码器原理 1.MPEG-1音频编码器框架图 (1)编码流程的两条线 整个编码流程分为两条线: 第一条线是主线,输入的PCM码流经过多相滤波器组分成32个子 ...
- 【数据压缩】第八次作业——MPEG音频编码
MPEG音频编码实验 文章目录 MPEG音频编码实验 MPEG介绍 MPEG-1声音的主要性能 心理声学模型 人耳听觉特性 临界频带 掩蔽值 心理声学模型Ⅰ MPEG-1 编码原理 基本思想 整体框架 ...
- MPEG音频编码 基本原理和C语言代码分析
背景 MPEG(Moving Picture Experts Group)在汉语中译为活动图像专家组,特指活动影音压缩标准. MPEG 音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它 ...
- MPEG音频编码及分析
一.MPEG音频编码思想 1.整体概述 (1)基本思想 分析信号,去掉不能被感知的部分 (2)MPEG-1声音的主要性能 输入为PCM信号,采样率为32,44.1或48kHz,输出为32kbps到38 ...
- MPEG音频编码三十年
▲扫描图中二维码了解音视频技术大会更多信息▲ 作者:Leonardo Chiariglione 翻译:Alex 技术审校:冯建元 视 野 #011# 前言 很明显,声音信息的电子格式要早于视觉信息的电 ...
最新文章
- Linux grep 命令
- Java基础学习总结(17)——线程
- 直播预告丨B2B 企业如何高效获客增长?
- Linux入门笔记——type、switch、help、man、apropos、whatis、info
- c语言凸包算法,基于C语言的凸包算法实现
- SQL 查找是否存在,别再 count 了,很耗费时间的!
- php header jpg,php header函数输入图片IE不显示问题
- java 通过类名创建类,通过类名动态生成对象
- 浏览器管理oracle网址,浏览器用户界面 (Browser User Interface, BUI)
- 随机森林的基分类器可否由决策树替换为线性分类器或者K-NN?
- 直插式电阻电容封装与尺寸图…
- Db4o数据库:细说查询
- 流体力学matlab例题,流体力学简单计算MATLAB程式
- Android10 系统接口 设置屏幕亮度
- 华为SP核心路由器营收同比增长70% 远超Juniper
- java-面向对象高阶
- 如何用Java读取单元格的数据_Java读取Excel中的单元格数据
- C++随机生成字符串,亲测可用,简单易懂
- python基础教程:python+OpenCV实现车牌号码识别
- 八、CSS3的美化背景与边框
热门文章
- 前端下载流文件xlsx表格方法
- android nougat honr7,华为荣誉8将于2月获得带有EMUI 5.0的Android 7.0牛轧糖
- GPU视频压缩2—Multiple Layer Parallel Motion Estimation on GPU for High Efficiency Video Coding (HEVC)
- centos7 安装Zabbix3.0
- IPD解读——从核心思想分析IPD体系
- 教育培训企业:如何优雅、机智地做邮件营销?
- 博客嵌入可以自适应的b站视频
- Flask中的session简易用法教程,以及permanent通俗解释
- 11月22日训练题解
- 直流电压传感器(安科瑞-卓宋兰)