[原创]桓泽学音频编解码(1):MPEG1 MP3 系统算法分析

[原创]桓泽学音频编解码(2):AC3/Dolby Digital 系统算法分析

[原创]桓泽学音频编解码(3):AAC 系统算法分析

[原创]桓泽学音频编解码(4):MP3 和 AAC 中反量化原理,优化设计与参考代码中实现

[原创]桓泽学音频编解码(5):MP3 和 AAC 中IMDCT算法的原理,优化设计与参考代码中实现

[原创]桓泽学音频编解码(6):MP3 无损解码模块算法分析

[原创]桓泽学音频编解码(7):MP3 和 AAC 中huffman解码原理,优化设计与参考代码中实现

[原创]桓泽学音频编解码(8):关于MP3和AAC量化器设计的研究

[原创]桓泽学音频编解码(9):MP3 多相滤波器组算法分析

[原创]桓泽学音频编解码(10):AAC 无损解码模块算法分析

[原创]桓泽学音频编解码(11):AC3 exponent(指数部分)模块解码算法分析

[原创]桓泽学音频编解码(12):AC3 Mantissa(小数部分)模块算法分析

[原创]桓泽学音频编解码(13):AC3 位分配模块算法分析

1 时频转换算法概述

AC-3 采用了MDCT来把时间域上的讯号样本转换到频率域上。MDCT是TDAC(time domain aliasing cancellation) filter的一种实现,可以由频率域上的讯号完美地重建成原来空间域上的讯号,且其输入的 PCM 讯号事先会经过一个变换窗序列,标准中直接给出了窗系数的表,而长度则由块选择模型来决定为512或256点。

α =  –1 用于第一个短块变换

0 用于长块变换

+1 用于第二个短块变换

x[n]是作了窗处理的时域系数

N=512 或 256

进入变换之前,先使用标准中给出的窗系数对512个PCM数据加窗。然后,在进行长块变换时,整个512个数据统一进行,产生256个频域系数。当进行短块变换时,512个采样要分成2个部分,前一半和后一般分开进行变换。每个半块变换操作后产生128个频域系数,再把2个半块的数据交织到一起构成一个具有256个频域系数的块。这个块的量化和发送与长块一致。

每个块的标志会通过blksw[ch]标志传送给解码器,解码器根据这个标志去对短块数据进行解交织。

2 AC3 时频转换算法原理

AC3的TDAC反变换要经过3个处理过程,第一步是IMDCT处理使频域数据变成时域数据。第二步是加窗。第三步是交叠相加过程。这个部分的输入输出如下

输入:blksw[i]:标记块是长块还是短块。‘0’是长块,‘1’是短块。频域信号 32位浮点

输出:时域信号 32位浮点

2.1 IMDCT

IMDCT的公式如下

Xk 是输入频域数据。Xi是输出时域数据

⑴  AC3 长块的反变换 N=512

⑵ AC3 第一个短块的反变换 N=256

⑶ AC3 第二个短块的反变换 N=256

2.2 加窗

AC3标准中使用KBD窗对时域系数进行加窗处理。窗系数如标准中相关表格。

2.3 交叠相加

与AAC和mp3标准类似。AC3的交叠相加处理也是将加窗块的前一半和上一块的后一半互相重叠产生PCM样本。其中输入512个数据,输出256个PCM样本。如图

M=256

3 优化算法

对时频反变换的算法,AC3在标准中直接给出了快速算法(radix-4的FFT算法),过程如下。

3.1 长块执行步骤

Step1

定义变换系数 X[k], k = 0, 1,...N/2–1.

Step2 Pre-IFFT 复数乘部分

计算N/4点的复数乘,Z[k], k = 0, 1,...N/4–1:

for(k=0; k<N/4; k++)

{

/* Z[k] = (X[N/2-2*k-1] + j * X[2*k]) * (xcos1[k] + j * xsin1[k]) ; */

Z[k]=(X[N/2-2*k-1]*xcos1[k]-X[2*k]*xsin1[k])+j*(X[2*k]*xcos1[k]+X[N/2-2*k-1]*xsin1[k]);

}

在这里

xcos1[k] = –cos (2 p * (8 * k + 1)/(8 * N))

xsin1[k] = –sin (2 p * (8 * k + 1)/(8 * N))

Step3: IFFT

for(n=0; n<N/4; n++)

{

z[n] = 0 ;

for(k=0; k<N/4; k++)

{

z[n] + = Z[k] * (cos(8*π*k*n/N) + j * sin(8*π*k*n/N)) ;

}

}

Step4:Post-IFFT复数乘

计算N/4点复数乘,产生y(n), n = 0, 1,...N/4–1

for(n=0; n<N/4; n++)

{

/* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */

y[n] = (zr[n] * xcos1[n] - zi[n] * xsin1[n]) + j * (zi[n] * xcos1[n] + zr[n] * xsin1[n]) ;

}

zr[n] = real(z[n])

zi[n] = imag(z[n])

xcos1[n] = –cos (2 p * (8 * n + 1)/(8 * N))

xsin1[n] = –sin (2 p * (8 * n + 1)/(8 * N))

Step5:加窗和去交织

计算时域信号x[n]:

for(n=0; n<N/8; n++)

{

x[2*n] = -yi[N/8+n] * w[2*n] ;

x[2*n+1] = yr[N/8-n-1] * w[2*n+1] ;

x[N/4+2*n] = -yr[n] * w[N/4+2*n] ;

x[N/4+2*n+1] = yi[N/4-n-1] * w[N/4+2*n+1] ;

x[N/2+2*n] = -yr[N/8+n] * w[N/2-2*n-1] ;

x[N/2+2*n+1] = yi[N/8-n-1] * w[N/2-2*n-2] ;

x[3*N/4+2*n] = yi[n] * w[N/4-2*n-1] ;

x[3*N/4+2*n+1] = -yr[N/4-n-1] * w[N/4-2*n-2] ;

}

yr[n] = real(y[n])

yi[n] = imag(y[n])

w[n] 是窗系数,见AC3表7.33

Step6 交叠加

for(n=0; n<N/2; n++)

{

pcm[n] = 2 * (x[n] + delay[n]) ;

delay[n] = x[N/2+n) ;

}

3.2 短块执行步骤

Step1

定义变换系数 X[k], k = 0, 1,...N/2–1.

for(k=0; k<N/4; k++)

{

X1[k] = X[2*k] ;

X2[k] = X[2*k+1] ;

}

Step2

N/8-point 复数乘产生Z1(k) 和 Z2(k), k = 0, 1,...N/8–1.

for(k=0; k<N/8; k++)

{

/* Z1[k] = (X1[N/4-2*k-1] + j * X1[2*k]) * (xcos2[k] + j * xsin2[k]); */

Z1[k]=(X1[N/4-2*k-1]*xcos2[k]-X1[2k]*xsin2[k])+j*(X1[2*k]*xcos2[k]+X1[N/4-2*k-1]*xsin2[k]) ;

/* Z2[k] = (X2[N/4-2*k-1] + j * X2[2*k]) * (xcos2[k] + j * xsin2[k]) ; */

Z2[k]=(X2[N/4-2*k-1]*xcos2[k]-X2[2*k]*xsin2[k])+j*(X2[2*k]*xcos2[k]+X2[N/4-2*k-1]*xsin2[k]) ;

}

在这里

xcos2[k] = -cos(2p*(8*k+1)/(4*N)), xsin2(k) = -sin(2p*(8*k+1)/(4*N))

Step3

计算N/8点的IFFT得到复数值序列z1[n],z2[n]

for(n=0; n<N/8; n++)

{

z1[n] = 0. ;

z2[n] = 0. ;

for(k=0; k<N/8; k++)

{

z1[n] + = Z1[k] * (cos(16*π*k*n/N) + j * sin(16*π*k*n/N)) ;

z2[n] + = Z2[k] * (cos(16*π*k*n/N) + j * sin(16*π*k*n/N)) ;

}

}

Step4

计算N/8点的复数乘产生y1[n] and y2[n], n = 0, 1,...N/8–1.

for(n=0; n<N/8; n++)

{

/* y1[n] = z1[n] * (xcos2[n] + j * xsin2[n]) ; */

y1[n] = (zr1[n] * xcos2[n] - zi1[n] * xsin2[n]) + j * (zi1[n] * xcos2[n] + zr1[n] * xsin2[n]) ;

/* y2[n] = z2[n] * (xcos2[n] + j * xsin2[n]) ; */

y2[n] = (zr2[n] * xcos2[n] - zi2[n] * xsin2[n]) + j * (zi2[n] * xcos2[n] + zr2[n] * xsin2[n]) ;

}

Step5

计算加窗的时域信号x[n].

for(n=0; n<N/8; n++)

{

x[2*n] = -yi1[n] * w[2*n] ;

x[2*n+1] = yr1[N/8-n-1] * w[2*n+1] ;

x[N/4+2*n] = -yr1[n] * w[N/4+2*n] ;

x[N/4+2*n+1] = yi1[N/8-n-1] * w[N/4+2*n+1] ;

x[N/2+2*n] = -yr2[n] * w[N/2-2*n-1] ;

x[N/2+2*n+1] = yi2[N/8-n-1] * w[N/2-2*n-2] ;

x[3N/4+2*n] = yi2[n] * w[N/4-2*n-1] ;

x[3N/4+2*n+1] = -yr2[N/8-n-1] * w[N/4-2*n-2] ;

}

其中

yr1[n] = real(y1[n])

yi1[n] = imag(y1[n])

yr2[n] = real(y2[n])

yi2[n] = imag(y2[n])

w[n]是窗函数

Step6 交叠加

当前块的前半部分数据和前一个块的后半部分数据相加

for(n=0; n<N/2; n++)

{

pcm[n] = 2 * (x[n] + delay[n]) ;

delay[n] = x[N/2+n] ;

}

4 参考代码

AC3的参考代码部分实现方法与快速算法的伪代码几乎完全一致。故略去。

转载于:https://www.cnblogs.com/gaozehua/archive/2012/05/21/2511076.html

[原创]桓泽学音频编解码(14):AC3 时频转换模块算法分析相关推荐

  1. [原创]桓泽学音频编解码(3):AAC 系统算法分析

    wikipeida链接 http://zh.wikipedia.org/wiki/AAC 摘录: 进阶音讯编码(英语:Advanced Audio Coding,AAC),出现于1997年,基于 MP ...

  2. [原创]桓泽学音频编解码(7):MP3 和 AAC 中huffman解码原理,优化设计与参考代码中实现...

    1 不同标准中的huffman解码原理 1.1标准MP3的huffman解码原理 在MP3即mpeg-1 audio标准中,无噪声编码模块的输入是一组576个己量化的频谱数据.无噪声编码首先对频谱进行 ...

  3. [原创]桓泽学音频编解码(2):AC3/Dolby Digital 系统算法分析

    (这个文档也是07年做项目时总结的,今天共享出来) 1         AC3标准概述 AC-3技术起源于为高清晰度电视HDTV提供高质量声音.由于电影业对声音技术的要求越来越高,AC-3系统被要求具 ...

  4. 视音频编解码学习工程:FLV封装格式分析器

    ===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...

  5. 基于 CoreAudio 的音频编解码(二):音频编码

    系列文章目录 基于 CoreAudio 的音频编解码(一):音频解码 基于 CoreAudio 的音频编解码(二):音频编码 前言 在 基于 CoreAudio 的音频编解码(一):音频解码 中,我们 ...

  6. 音视频开发(5)---FFMPEG视音频编解码零基础学习方法

    FFMPEG视音频编解码零基础学习方法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/leixiaohua1020/article/details/ ...

  7. 详解音频编解码的原理、演进和应用选型等

    本文来自网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack根据演讲内容整理而成(本次演讲PPT文稿,请从文末附件下载). 1 ...

  8. Androidpcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住说话的demo

    pcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住播放的demo 效果:   -------------- 代码: MainActivity ...

  9. FFMPEG视音频编解码学习(一)

    目录 目录 前言 背景知识 FFmpeg官方说明 FFmpeg库 for developers 为什么需要ffmpeg 手动获取rtsp视频流保存到本地 视音频编解码技术学习 视频播放器原理 流媒体协 ...

  10. 视音频编解码基本术语及解释

    整理了一些基本视音频术语,用于入门和查询使用. H264: H264是视频的标准,是MPEG4-10,基于内容的高效编码方式. H.264/MPEG-4第10部分,或称AVC(AdvancedVide ...

最新文章

  1. WP7基础---补充
  2. 财务需要学python-财务人要学Python吗?
  3. Win7下用IIS发布网站
  4. hdu 3879(最小割模型求解最大权闭合图)
  5. 深度解读 | ElasticDL 深度学习框架简化编程,提升集群利用率和研发效率的秘诀...
  6. hbase工作 架构原理
  7. 智慧园区系统设计方案
  8. 报错 SocketTimeoutException: null
  9. Qt5Core上的CMake错误
  10. win10台式计算机调亮度,Win10系统台式机怎么调节亮度
  11. 今天的我又来到阳台上的玩耍
  12. 动态图 vs 静态图
  13. 第二届Stata中国用户大会暨“计量经济方法及应用研讨会”会议通知
  14. mac下安装使用switchyomega
  15. 解密阿里巴巴加密技术: 爬虫JS逆向实践-1688 【JS混淆加密解析】
  16. 怎么理解无界队列和有界队列
  17. apt-get: command not found
  18. 区块链革命来临,这些事儿你必须知道
  19. vue3.0引入字体样式ttf文件
  20. python调用mysql数据库工具类

热门文章

  1. url采集工具_爬山虎采集实战-站长之家网站排行榜
  2. android 预优化oat_Android内存优化大盘点
  3. python-opencv 角点检测的 FAST 算法
  4. QML Math详解 生成随机数
  5. Linux下使用Netfilter强制清除IPv4 DF标志
  6. import/export win7中电源计划
  7. 浅析MyBatis执行器原理
  8. 宿主机进程挂载到容器内_微服务架构之 容器技术
  9. matlab在数学教学,Matlab在数学函数教学中的应用
  10. ATF DSP PC-Tool(电脑调音软件)v3.20官方版