音频cs算法
❶ 音频信号的采集方式
电台等由于其自办频道的广告、新闻、广播剧、歌曲和转播节目等音频信号电平大小不一,导致节目播出时,音频信号忽大忽小,严重影响用户的收听效果。在转播时,由于传输距离等原因,在信号的输出端也存在信号大小不一的现象。过去,对大音频信号采用限幅方式,即对大信号进行限幅输出,小信号不予处理。这样,仍然存在音频信号过小时,用户自行调节音量,也会影响用户的收听效果。随着电子技术,计算机技术和通信技术的迅猛发展,数字信号处理技术已广泛地深入到人们生活等各个领域。其中语音处理是数字信号处理最活跃的研究方向之一,在IP电话和多媒体通信中得到广泛应用。语音处理可采用通用数字信号处理器DSP和现场可编程门阵列(FPGA) 实现,其中DSP实现方法具有实现简便、程序可移植行强、处理速度快等优点,特别是TI公司TMS320C54X系列在音频处理方面有很好的性价比,能够解决复杂的算法设计和满足系统的实时性要求,在许多领域得到广泛应用。在DSP的基础上对音频信号做AGC算法处理可以使输出电平保持在一定范围内,能够解决不同节目音频不均衡等问题。
TI公司DSP芯片TMS320VC5402具有独特的6总线哈佛结构,使其能够6条流水线同时工作,工作频率达到100MHZ。利用VC5402的2个多通道缓冲串行口(McBSP0和McBSP1)来实现与AIC23的无缝连接。VC5402的多通道带缓冲的串行口在标准串口的基础上加了一个2K的缓冲区。每次串口发送数据时,CPU自动将发送缓冲中的数据送出;而当接收数据时,CPU自动将收到的数据写入接收缓存。在自动缓冲方式下,不需每传送一个字就发一次中断,而是每通过一次缓冲器的边界,才产生中断至CPU,从而减少频繁中断对CPU的影响。
音频芯片采用TLV320 AIC23,它是TI公司的一款高性能立体声音频A/D,D/A放大电路。AIC23的模数转换和数模转换部件高度集成在芯片内部,采用了先进的过采样技术。AIC23的外部硬件接口分为模拟口和数字口。模拟口是用来输入输出音频信号的,支持线路输入和麦克风输入;有两组数字接口,其一是由/CS、SDIN、SCLK和MODE构成的数字控制接口。AIC23是一块可编程的音频芯片,通过数字控制口将芯片的控制字写入AIC23内部的寄存器,如采样率设置,工作方式设置等,共有12个寄存器。音频控制口与DSP的通信主要由多通道缓冲串行口McBSP1来实现。
AIC23通过数字音频口与DSP的McBSP0完成数据的通信,DSP做主机,AIC23做从机。主机提供发送时钟信号BCLKX0和发送帧同步信号BFSX0。在这种工作方式下,接收时种信号BCLKR0和接收帧同步信号BFSR0实际上都是由主机提供的。图1是AIC23与VC5402的接口连接。
AIC23的数字音频接口支持S(通用音顿格式)模式,也支持DSP模式(专与TIDSP连接模式),在此采用DSP模式。DSP模式工作时,它的帧宽度可以为一个bit长。图2是音频信号采集的具体电路图。
电路的设计和布线是信号采集过程中一个很重要的环节,它的效果直接关系到后期信号处理的质量。对于DSP达类高速器件,外部晶体经过内部的PLL倍频以后可达上百兆。这就要求信号线走等长线和绘制多层电路板来消除电磁干扰和信号的反射。在两层板的前提下,可以采取顶层与底层走交叉线、尽量加宽电源线和地线的宽度、电源线成树杈型、模拟区和数字区分开等原则,可以达到比较好的效果。
❷ 音频算法入门-变音项目
本文主要是基于一个变音项目带大家入门音频算法。项目用到了波形相似叠加算法(Waveform similarity Overlap-Add WSOLA)和重采样算法。wsola能做到变时不变调,重采样是变时也变调,两者结合就能做到变调不变时。项目地址在文章末尾给出。
该算法属于时域法,能做到音频的变时不变调(改变语速但不改变语调)。时域法的基本思路是将音频切分成很小的若干等份,然后每份都去删减一截或者复制一截数据,来减少或增加音频数据,这样就不会改变音频波形,也就不影响音调,最后把每份重新合成播放就达到了变时不变调的目的。但如果只是这么做的话播放出来的声音是有瑕疵的。例如想要加快播放速度,也就是对每份数据删减一截,问题会出在合成的时候,前后两份音频的波形会出现断横,如果是想要减缓播放速度,也就是每份复制一截数据,问题会出在复制后的数据拼接到原数据末尾的时候,拼接处会出现断横。波形相似度叠加算法就是为了优化这个断横问题而提出的。横断如下图所示。
首先介绍几个概念,分别为有效帧,分析帧、搜索窗、重叠区域,合成帧、搜索窗可移动距离。
有效帧:把音频切分成很小的若干等份,每份数据就叫做有效帧。
分析帧:实际分析和处理的时候,仅仅有有效帧是不够的,需要把上个分析帧末尾的一段数据复制并拼接到当前分析帧的头部,这样的一份数据被称为分析帧。分析帧的组成为:analysisFrameLength(分析帧长度) = (有效帧长度)+plicateLengthInAnalysisFrame(重复数据长度)
搜索窗:通过波形相似查找算法在分析帧里截取出的一段数据,数据长度为搜索窗长度,但搜索窗数据并不是直接用于拼接成最终的音频,因为搜索窗里包含重叠区域。
重叠区域:搜索窗数据在处理成最终音频的时候,每个搜索窗数据都会被下一个搜索窗数据重叠一块区域,这块区域叫做重叠区域。
合成帧:由于每个搜索窗数据都会被下一个搜索窗数据重叠一块区域,所以真正用于合成拼接的数据=搜索窗数据-重叠区域,这段数据叫做合成帧。所以播放速度=有效帧/合成帧
搜索窗可移动距离:用上一个搜索窗尾部重叠区域大小的数据(波形数据)作为参考,从当前分析帧头部开始往后平移寻找最相似的数据(相似的波形数据),可平移的最大距离就是搜索窗可移动距离。所以分析帧必须要比搜索窗+搜索窗可移动距离大才行。
熟悉了上面介绍的概念后再来看下面的波形相似度叠加算法示意图,图中展示了两个分析帧变成两个合成帧的完整过程。具体实现细节就看项目吧,主要涉及的操作就是计算波形相似度和叠加这两个相似波形。
重采样分为上采样和下采样,上采样就是增加数据,带来的效果是语速变慢且音调降低,下采样就是减少数据,带来的效果是语速变快且音调提高。所以配合波形相似叠加算法能做到变时不变调。下采样会造成混叠,上采样会造成镜像,想要了解的更细,需要先了解香浓采样定理,然后我推荐一个网址,讲的是上采样和下采样的内容https://www.cnblogs.com/TaigaCon/p/8512219.html。为了让重采样不出现混叠和镜像,本项目用的是窗函数(凯泽窗)设计的sinc低通滤波器进行重采样操作。
低通滤波的目的就是把低频信号保留,把高频信号除去,这相当于把一段音频的频域信号点乘sinc函数傅里叶变换后的频谱函数(该函数的形状请看上图的sinc函数频谱图)。频域点乘又相当于时域卷积,所以又相当于把一段音频时域信号和sinc函数做卷积,但是由于sinc函数在时域上是从负无穷到正无穷的,这就导致没法做卷积,我们观察一下这个sinc函数会发现,离坐标原点越远,曲线上下波动就越小,y值也越接近0,就表示信息量就越少,这时候有人肯定会想到那就裁剪一下,把接近坐标原点的中间这块裁剪下来做卷积。卷积后的结果如下图所示。
看上图会发现不再是标准的矩形函数,两边会有长长的拖尾,而且拖尾的y值还挺大的,这种现象叫做泄露,这不是我们想要的效果,我们还是希望能尽量的接近原来的矩形窗,这就引出了窗函数,对这个sinc函数进行加窗操作(就是裁剪并和窗函数点乘)就可以减少泄露。下面这图就是加了凯泽窗后的sinc函数频谱图
看上图会发现拖尾虽然还是存在,但是拖尾的y值变得更小了,这个效果虽然不是最理想的,但比原来好多了。所以用这个加了窗的sinc函数进行卷积就可以实现低通滤波。那么怎么用这个低通滤波器进行插值呢?请看下图。
为了方便项目的理解,可以先看看这个项目的简单介绍,该项目是先定义了搜索窗大小,搜索窗可移动距离大小和重叠区域大小,然后通过播放速度计算出其他的参数,包括合成帧大小,分析帧大小,有效帧大小和分析帧的重复区域大小。公式如下:
合成帧 = 搜索窗可移动距离重叠区域
有效帧 = 播放速度*(搜索窗-重叠区域)
分析帧 = Math.max(有效帧+重叠区域,搜索窗)+搜索窗可移动距离
分析帧的重复区域 = 分析帧-有效帧
今天春节,是新一年的开端,祝大家在新的一年里付出的努力都能有所收获,年牛大吉!
❸ 数字音频压缩的主要基本算法有哪些
WAV:无损
是微软公司开发的一种声音文件格式,它符合 PIFFResource Interchange File Format 文件规范,用于保存WINDOWS平台的音频信息资源,被WINDOWS平台及其应用程序所支持。“*.WAV”格式支持MSADPCM、CCITT A LAW等多种压缩算法,支持多种音频位数、采样频率和声道,标准格式的WAV文件和CD格式一样,也是44.1K的采样频率,速率88K/秒,16位量化位数,看到了吧,WAV格式的声音文件质量和CD相差无几,也是目前PC机上广为流行的声音文件格式,几乎所有的音频编辑软件都“认识”WAV格式。
这里顺便提一下由苹果公司开发的AIFF(Audio Interchange File Format)格式和为UNIX系统开发的AU格式,它们都和和WAV非常相像,在大多数的音频编辑软件中也都支持它们这几种常见的音乐格式。
MP3:流行
MP3格式诞生于八十年代的德国,所谓的MP3也就是指的是MPEG标准中的音频部分,也就是MPEG音频层。根据压缩质量和编码处理的不同分为3层,分别对应 “*.mp1"/“*.mp2”/“*.mp3”这3种声音文件。需要提醒大家注意的地方是:MPEG音频文件的压缩是一种有损压缩,MPEG3音频编码具有10:1~12:1的高压缩率,同时基本保持低音频部分不失真,但是牺牲了声音文件中12KHz到16KHz高音频这部分的质量来换取文件的尺寸,相同长度的音乐文件,用*.mp3格式来储存,一般只有*.wav文件的1/10,而音质要次于CD格式或WAV格式的声音文件。由于其文件尺寸小,音质好;所以在它问世之初还没有什么别的音频格式可以与之匹敌,因而为*.mp3格式的发展提供了良好的条件。直到现在,这种格式还是风靡一时,作为主流音频格式的地位难以被撼动。但是树大招风,MP3音乐的版权问题也一直是找不到办法解决,因为MP3没有版权保护技术,说白了也就是谁都可以用。
MP3格式压缩音乐的采样频率有很多种,可以用64Kbps或更低的采样频率节省空间,也可以用320Kbps的标准达到极高的音质。我们用装有Fraunhofer IIS Mpeg Lyaer3的 MP3编码器(现在效果最好的编码器)MusicMatch Jukebox 6.0在128Kbps的频率下编码一首3分钟的歌曲,得到2.82MB的MP3文件。采用缺省的CBR(固定采样频率)技术可以以固定的频率采样一首歌曲,而VBR(可变采样频率)则可以在音乐“忙”的时候加大采样的频率获取更高的音质,不过产生的MP3文件可能在某些播放器上无法播放。我们把VBR的级别设定成为与前面的CBR文件的音质基本一样,生成的VBR MP3文件为2.9MB。
MIDI:作曲家最爱
经常玩音乐的人应该常听到MIDI(Musical Instrument Digital Interface)这个词,MIDI允许数字合成器和其他设备交换数据。MID文件格式由MIDI继承而来。MID文件并不是一段录制好的声音,而是记录声音的信息,然后在告诉声卡如何再现音乐的一组指令。这样一个MIDI文件每存1分钟的音乐只用大约5~10KB。今天,MID文件主要用于原始乐器作品,流行歌曲的业余表演,游戏音轨以及电子贺卡等。*.mid文件重放的效果完全依赖声卡的档次。*.mid格式的最大用处是在电脑作曲领域。*.mid文件可以用作曲软件写出,也可以通过声卡的 MIDI口把外接音序器演奏的乐曲输入电脑里,制成*.mid文件。
WMA:最具实力
WMA (Windows Media Audio) 格式是来自于微软的重量级选手,后台强硬,音质要强于MP3格式,更远胜于RA格式,它和日本YAMAHA公司开发的VQF格式一样,是以减少数据流量但保持音质的方法来达到比MP3压缩率更高的目的,WMA的压缩率一般都可以达到1:18左右,WMA的另一个优点是内容提供商可以通过DRM(Digital Rights Management)方案如Windows Media Rights Manager 7加入防拷贝保护。这种内置了版权保护技术可以限制播放时间和播放次数甚至于播放的机器等等,这对被盗版搅得焦头乱额的音乐公司来说可是一个福音,另外 WMA还支持音频流(Stream) 技术,适合在网络上在线播放,作为微软抢占网络音乐的开路先锋可以说是技术领先、风头强劲,更方便的是不用象MP3那样需要安装额外的播放器,而 Windows操作系统和Windows Media Player的无缝捆绑让你只要安装了windows操作系统就可以直接播放WMA音乐,新版本的Windows Media Player7.0更是增加了直接把CD光盘转换为WMA声音格式的功能,在新出品的操作系统Windows XP中,WMA是默认的编码格式,大家知道Netscape的遭遇,现在“狼”又来了。WMA这种格式在录制时可以对音质进行调节。同一格式,音质好的可与CD媲美,压缩率较高的可用于网络广播。虽然现在网络上还不是很流行,但是在微软的大规模推广下已经是得到了越来越多站点的承认和大力支持,在网络音乐领域中直逼*.mp3,在网络广播方面,也正在瓜分Real打下的天下。因此,几乎所有的音频格式都感受到了WMA格式的压力。
RealAudio:流动旋律
RealAudio主要适用于在网络上的在线音乐欣赏,现在大多数的用户仍然在使用56Kbps或更低速率的Modem,所以典型的回放并非最好的音质。有的下载站点会提示你根据你的Modem速率选择最佳的Real文件。现在real的的文件格式主要有这么几种:有RA(RealAudio)、 RM(RealMedia,RealAudio G2)、RMX(RealAudio Secured),还有更多。这些格式的特点是可以随网络带宽的不同而改变声音的质量,在保证大多数人听到流畅声音的前提下,令带宽较富裕的听众获得较好的音质。
近来随着网络带宽的普遍改善,Real公司正推出用于网络广播的、达到CD音质的格式。如果你的RealPlayer软件不能处理这种格式,它就会提醒你下载一个免费的升级包。许多音乐网站 提供了歌曲的Real格式的试听版本。现在最新的版本是RealPlayer 11。
VQF:无人问津
雅马哈公司另一种格式是*.vqf,它的核心是减少数据流量但保持音质的方法来达到更高的压缩比,可以说技术上也是很先进的,但是由于宣传不力,这种格式难有用武之地。*.vqf可以用雅马哈的播放器播放。同时雅马哈也提供从*.wav文件转换到*.vqf文件的软件。 此文件缺少特点外加缺乏宣传,现在几乎已经宣布死刑了。
OGG:新生代音频格式
ogg格式完全开源,完全免费, 和mp3不相上下的新格式。 与MP3类似,OGGVorbis也是对音频进行有损压缩编码,但通过使用更加先进的声学模型去减少损失,因此,相同码率编码的OGGVorbis比MP3音质更好一些,文件也更小一些。另外,MP3格式是受专利保护的。发布或者销售MP3编码器、MP3解码器、MP3格式音乐作品,都需要付专利使用费。而OGGVorbis就完全没有这个问题。目前,OGGVorbis虽然还不普及,但在音乐软件、游戏音效、便携播放器、网络浏览器上都得到广泛支持。
FLAC:自由无损音频格式
FLAC即是Free Lossless Audio Codec的缩写,中文可解为无损音频压缩编码。FLAC是一套着名的自由音频压缩编码,其特点是无损压缩。不同于其他有损压缩编码如MP3 及AAC,它不会破坏任何原有的音频资讯,所以可以还原音乐光盘音质。现在它已被很多软件及硬件音频产品所支持。FLAC是免费的并且支持大多数的操作系统,包括 Windows,基于Unix内核而开发的系统 (Linux, *BSD,Solaris,OSX,IRIX),BeOS,OS/2,Amiga。并且FLAC提供了在开发工具 autotools,MSVC,Watcom C,ProjectBuilder上的build系统。
APE:最有前途的网络无损格式
APE是目前流行的数字音乐文件格式之一。与MP3这类有损压缩方式不同,APE是一种无损压缩音频技术,也就是说当你将从音频CD上读取的音频数据文件压缩成APE格式后,你还可以再将APE格式的文件还原,而还原后的音频文件与压缩前的一模一样,没有任何损失。APE的文件大小大概为CD的一半,但是随着宽带的普及,APE格式受到了许多音乐爱好者的喜爱,特别是对于希望通过网络传输音频CD的朋友来说,APE可以帮助他们节约大量的资源。
作为数字音乐文件格式的标准,WAV格式容量过大,因而使用起来很不方便。因此,一般情况下我们把它压缩为MP3或 WMA 格式。压缩方法有无损压缩,有损压缩,以及混成压缩。MPEG, JPEG就属于混成压缩,如果把压缩的数据还原回去,数据其实是不一样的。当然,人耳是无法分辨的。因此,如果把 MP3, OGG格式从压缩的状态还原回去的话,就会产生损失。
然而APE压缩格式即使还原,也能毫无损失地保留原有音质。所以,APE可以无损失高音质地压缩和还原。当然,目前只能把音乐CD中的曲目和未压缩的WAV文件转换成APE格式,MP3文件还无法转换为APE格式。事实上APE的压缩率并不高,虽然音质保持得很好,但是压缩后的容量也没小多少。一个34MB的WAV文件,压缩为APE格式后,仍有17MB左右。对于一整张CD来说,压缩省下来的容量还是可观的。
APE的本质,其实它是一种无损压缩音频格式。庞大的WAV音频文件可以通过Monkey's Audio这个软件压缩为APE。很多时候它被用做网络音频文件传输,因为被压缩后的APE文件容量要比WAV源文件小一半多,可以节约传输所用的时间。更重要的是,通过Monkey's Audio解压缩还原以后得到的WAV文件可以做到与压缩前的源文件完全一致。所以APE被誉为“无损音频压缩格式”,Monkey''s Audio被誉为“无损音频压缩软件”。与采用WinZip或者WinRAR这类专业数据压缩软件来压缩音频文件不同,压缩之后的APE音频文件是可以直接被播放的。Monkey's Audio会向Winamp中安装一个“in_APE.dll”插件,从而使Winamp也具备播放APE文件的能力。同样foobar2000,以及千千静听也能支持APE的播放。
❹ 基础篇_8.音频编码MP3\AAC
学习整理的相关章节链接:
基础篇_1.音视频学习框架
基础篇_2. 颜色空间模型 RBG、YUV、HSV
基础篇_3.图像编码之Bmp
基础篇_4.音频基础概念
基础篇_5.音频数据采集
基础篇_6.音频编码PCM
基础篇_7.音频编码WAV
基础篇_8.音频编码MP3AAC
mp3编码详细信息参考如下链接
https://www.jianshu.com/p/58df71a19901
AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出台,AAC重新集成了其它技术(PS,SBR),为区别于传统的MPEG-2 AAC,故含有SBR或PS特性的AAC又称为MPEG-4 AAC。
AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三种主要的编码,LC-AAC就是比较传统的AAC,相对而言,主要用于中高码率(>=80Kbps),HE-AAC(相当于AAC+SBR)主要用于中低码(<=80Kbps),而新近推出的HE-AACv2(相当于AAC+SBR+PS)主要用于低码率(<=48Kbps),事实上大部分编码器设成<=48Kbps自动启用PS技术,而>48Kbps就不加PS,就相当于普通的HE-AAC
AAC共有9种规格,以适应不同的场合的需要:
MPEG-2 AAC LC 低复杂度规格(Low Complexity)--比较简单,没有增益控制,但提高了编码效率,在中等码率的编码效率以及音质方面,都能找到平衡点
MPEG-2 AAC Main 主规格
MPEG-2 AAC SSR 可变采样率规格(Scaleable Sample Rate)
MPEG-4 AAC LC 低复杂度规格(Low Complexity)------现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件
MPEG-4 AAC Main 主规格 ------包含了除增益控制之外的全部功能,其音质最好
MPEG-4 AAC SSR 可变采样率规格(Scaleable Sample Rate)
MPEG-4 AAC LTP 长时期预测规格(Long Term Predicition)
MPEG-4 AAC LD 低延迟规格(Low Delay)
MPEG-4 AAC HE 高效率规格(High Efficiency)-----这种规格适合用于低码率编码,有
Nero ACC 编码器支持
目前使用最多的是 LC和HE(适合低码率) 。流行的Nero AAC编码程序只支持LC,HE,HEv2这三种规格,编码后的AAC音频,规格显示都是LC。 HE其实就是AAC(LC)+SBR技术,HEv2就是AAC(LC)+SBR+PS技术;
** Hev1和HEv2用此图简单表示:**
** (图中AAC即指的是原来的AAC-LC)**
** HE:“High Efficiency”(高效性)。 HE-AAC v1(又称AACPlusV1,SBR),用容器的方法实现了AAC(LC)+SBR技术。 SBR其实代表的是Spectral Band Replication(频段复制)**。简要叙述一下,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了音质。如果对整个频段编码,若是为了保护高频就会造成低频段编码过细以致文件巨大;若是保存了低频的主要成分而失去高频成分就会丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了音质,完美的化解这一矛盾。
** HEv2:**用容器的方法包含了HE-AAC v1和PS技术。PS指“parametric stereo”(参数立体声)。原来的立体声文件文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方
(1)AAC是一种 高压缩比 的音频压缩算法,但它的 压缩比要远超过较老的音频压缩算法,如AC-3、MP3 等。并且其 质量可以同未压缩的CD音质相媲美 。
(2)同其他类似的音频编码算法一样,AAC也是采用了变换编码算法,但AAC使用了分辨率更高的滤波器组,因此它可以达到更高的压缩比。
(3)AAC使用了 临时噪声重整、后向自适应线性预测、联合立体声技术和量化哈夫曼编码 等最新技术,这些新技术的使用都使压缩比得到进一步的提高。
(4)AAC支持 更多种采样率和比特率、支持1个到48个音轨、支持多达15个低频音轨、具有多种语言的兼容能力、还有多达15个内嵌数据流 。
(5)AAC支持 更宽的声音频率范围,最高可达到96kHz,最低可达8KHz ,远宽于MP3的16KHz-48kHz的范围。
(6)不同于MP3及WMA, AAC几乎不损失声音频率中的甚高、甚低频率成分 ,并且比WMA在频谱结构上更接近于原始音频,因而声音的保真度更好。专业评测中表明, AAC比WMA声音更清晰,而且更接近原音 。
(7)AAC采用优化的算法达到了 更高的解码效率 ,解码时只需较少的处理能力。
ADIF : Audio Data Interchange Format 音频数据交换格式 。这种格式的特征是 可以确定的找到这个音频数据的开始 ,不需进行在音频数据流中间开始的解码,即 它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中 。
ADTS : Audio Data Transport Stream 音频数据传输流 。这种格式的特征是它 是一个有同步字的比特流,解码可以在这个流中任何位置开始 。它的特征类似于mp3数据流格式。
简单说,ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,目前一般编码后的和抽取出的都是ADTS格式的音频流。两者具体的组织结构如下所示:
AAC的ADIF格式见下图:
AAC的ADTS的一般格式见下图:
图中表示出了ADTS一帧的简明结构,其两边的空白矩形表示一帧前后的数据。
ADIF 的头信息:
ADIF头信息位于AAC文件的起始处,接下来就是连续的 raw data blocks。
组成ADIF头信息的各个域如下所示:
ADTS 的固定头信息:
ADTS的可变头信息:
(1) 帧同步目的在于找出帧头在比特流中的位置 ,13818-7规定,aac ADTS格式的帧头同步字为12比特的“1111 1111 1111”.
(2)ADTS的头信息为两部分组成,其一为固定头信息,紧接着是可变头信息。固定头信息中的数据每一帧都相同,而可变头信息则在帧与帧之间可变。
在AAC中,原始数据块的组成可能有六种不同的元素:
SCE: Single Channel Element单通道元素 。单通道元素基本上只由一个ICS组成。一个原始数据块最可能由16个SCE组成。
CPE: Channel Pair Element 双通道元素 ,由两个可能共享边信息的ICS和一些联合立体声编码信息组成。
CCE: Coupling Channel Element 藕合通道元素 。代表一个块的多通道联合立体声信息或者多语种程序的对话信息。
LFE: Low Frequency Element 低频元素 。包含了一个加强低采样频率的通道。
DSE: Data Stream Element 数据流元素 ,包含了一些并不属于音频的附加信息。
PCE: Program Config Element 程序配置元素 。包含了声道的配置信息。它可能出现在ADIF 头部信息中。
FIL: Fill Element 填充元素 。包含了一些扩展信息。如SBR,动态范围控制信息等。
AAC解码流程
[图片上传失败...(image-eaf24c-1543569949388)]
如图:
在主控模块开始运行后,主控模块将AAC比特流的一部分放入输入缓冲区,通过 查找同步字得到一帧的起始 ,找到后,根据ISO/IEC 13818-7所述的语法 开始进行Noisless Decoding(无噪解码),无噪解码实际上就是哈夫曼解码,通过反量化(Dequantize)、联合立体声(Joint Stereo),知觉噪声替换(PNS),瞬时噪声整形(TNS),反离散余弦变换(IMDCT),频段复制 (SBR)这几个模块之后,得出左右声道的PCM码流 ,再由主控模块将其放入输出缓冲区输出到声音播放设备。
技术解析:
1.主控模块:
所谓的主控模块,它的主要任务是操作输入输出缓冲区,调用其它各模块协同工作。
其中,输入输出缓冲区均由DSP控制模块提供接口。输出缓冲区中将存放的数据为解码出来的PCM数据,代表了声音的振幅。它由一块固定长度的缓冲区构成,通过调用DSP控制模块的接口函数,得到头指针,在完成输出缓冲区的填充后,调用中断处理输出至I2S接口所连接的音频ADC芯片(立体声音频DAC和DirectDrive耳机放大器)输出模拟声音。
2.Noisless Decoding(无噪解码):
无噪编码就是哈夫曼编码,它的作用在于进一步减少尺度因子和量化后频谱的冗余,
即将尺度因子和量化后的频谱信息进行哈夫曼编码。全局增益编码成一个8位的无符号整数,第一个尺度因子与全局增益值进行差分编码后再使用尺度因子编码表进行哈夫曼编码。后续的各尺度因子都与前一个尺度因子进行差分编码。量化频谱的无噪编码有两个频谱系数的划分。其一为4元组和2元组的划分,另一个为节划分。对前一个划分来说,确定了一次哈夫曼表查找出的数值是4个还是2个。对后一个划分来说,确定了应该用哪一个哈夫曼表,一节中含有若干的尺度因子带并且每节只用一个哈夫曼表。
——分段
无噪声编码将输入的1024个量化频谱系数分为几个段(section),段内的各点均使用
同一个哈夫曼表,考虑到编码效率,每一段的边界最好同尺度因子带的边界重合。所以每一段必段传送信息应该有:段长度,所在的尺度因子带,使用的哈夫曼表。
——分组和交替
分组是指忽略频谱系数所在窗,将连续的,具有相同尺度因子带的频谱系数分为一组放在
一起,共享一个尺度因子从而得到更好的编码效率。这样做必然会引起交替,即本来是以
c[组][窗][尺度因子带][ 系数索引]为顺序的系数排列,变为将尺度因子带同的系数放在一起: c[组][尺度因子带][窗][ 系数索引]
这样就引起了相同窗的系数的交替。
——大量化值的处理
大量化值在AAC中有两种处理方法:在哈夫曼编码表中使用escape标志或使用脉冲
escape方法。前者跟mp3编码方法相似,在许多大量化值出现时采用专门的哈夫曼表,这个表暗示了它的使用将会在哈夫曼编码后面跟跟一对escape值及对值的符号。在用脉冲escape方法时,大数值被减去一个差值变为小数值,然后使用哈夫曼表编码,后面会跟一个脉冲结构来帮助差值的还原.
3.尺度因子解码及逆量化
在AAC编码中,逆量化频谱系数是由一个非均匀量化器来实现的,在解码中需进行其逆运算。即保持符号并进行4/3次幂运算。在频域调整量化噪声的基本方法就是用尺度因子来进行噪声整形。尺度因子就是一个用来改变在一个尺度因子带的所有的频谱系数的振幅增益值。使用尺度因子这种机制是为了使用非均匀量化器在频域中改变量化噪声的比特分配。
——尺度因子带(scalefactor-band)
频率线根据人耳的听觉特性被分成多个组,每个组对应若干个尺度因子,这些组就叫做尺度因子带。为了减少信息含有短窗的边信息,连续的短窗可能会被分为一组,即将若干个短窗当成一个窗口一起传送,然后尺度因子将会作用到所有分组后的窗口去。
4.联合立体声(Joint Stereo)
联合立体声的是对原来的取样进行的一定的渲染工作,使声音更”好听”些。
5.知觉噪声替换(PNS)
知觉噪声替换模块是一种以参数编码的方式模拟噪声的模块。在判别出音频值中的噪
声后,将这些噪声不进行量化编码,而是采用一些参数告诉解码器端这是某种噪声,然后解码器端将会对这些噪声用一些随机的编码来制造出这一类型的噪声。
在具体操作上,PNS模块对每个尺度因子带侦测频率4kHz以下的信号成分。如果这个
信号既不是音调,在时间上也无强烈的能量变动,就被认为是噪声信号。其信号的音调及能量变化都在心理声学模型中算出。
在解码中,如果发现使用了哈夫曼表13(NOISE_HCB),则表明使用了PNS。由于M/S立体声解码与PNS解码互斥,故可以用参数ms_used来表明是否两个声道都用同样的PNS。如果 ms_used参数为1,则两个声道会用同样的随机向量来生成噪声信号。PNS的能量信号用noise_nrg来表示,如果使用了PNS,则能量信号将会代替各自的尺度因子来传送。噪声能量编码同尺度因子一样,采用差分编码的方式。第一个值同样为全局增益值。它同强度立体声位置值及尺度因子交替地放在一起,但对差分解码来说又彼此忽略。即下一个噪声能量值以上一个噪声能量值而不是强度立体声位置或尺度因子为标准差分解码。随机能量将会在一个尺度因子带内产生noise_nrg所计算出的平均能量分布。此项技术只有在MPEG-4 AAC中才会使用。
6.瞬时噪声整形(TNS)
这项神奇的技术可以通过在频率域上的预测,来修整时域上的量化噪音的分布。在一
些特殊的语音和剧烈变化信号的量化上,TNS技术对音质的提高贡献巨大!TNS瞬态噪声整形用于控制一个转换窗口内的瞬时噪声形态。它是用一个对单个通道的滤波过程来实现的。传统的变换编码方案常常遇到信号在时域变化非常剧烈的问题,特别是语音信号,这个问题是因为量化后的噪声分布虽然在频率域上得到控制,但在时域上却以一个常数分布在一个转换块内。如果这种块中信号变化得很剧烈却又不转向一个短块去,那这个常数分布的噪声将会被听到。TNS的原理利用了时域和频域的二元性和LPC(线性预测编码)的时频对称性,即在其中的任意一个域上做编码与在另一域上做预测编码等效,也就是说,在一个域内做预测编码可以在另一域内增加其分辨率。量化噪声产生是在频域产生的,降低了时域的分辨率,故在这里是在频域上做预测编码。在AACplus中,由于基于AAC profile LC,故TNS的滤波器阶数被限制在 12阶以内。
7.反离散余弦变换(IMDCT)
将音频数据从频域转换到时域的过程主要是由将频域数据填入一组IMDCT滤波器来实现的。在进行IMDCT变换后,输出数值经过加窗,叠加,最后得到时域数值。
8.频段复制(SBR)
简要叙述,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了
音质。如果对整个频段编码,若是为了保护高频就会造成低频段编码过细以致文件巨大;若是保存了低频的主要成分而失去高频成分就会丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了
音质,完美的化解这一矛盾。
9.参数立体声(PS)
对于之前的立体声文件来说,其文件大小是单声道的两倍,但是两个声道的声音存在
某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,之后,用很少的字节当作参数来描述另一个声道和它不同的地方。
❺ 怎样从音音频号中采集节拍信号
音频信号采集
音频信号采集
TI公司DSP芯片TMS320V
C5402具有独特的6总线 哈佛结构,使其能够6条流水线同时工作,工作频率达到100MHz。利用VC5402的2个多通道缓冲串行口(McBSP0和McBSP1)来实现与 AIC23的无缝连接。VC5402的多通道带缓冲的串行口在标准串口的基础上加了一个2K的缓冲区。每次串口发送数据时,CPU自动将发送缓冲中的数据 送出;而当接收数据时,CPU自动将收到的数据写入接收缓存。在自动缓冲方式下,不需每传送一个字就发一次中断,而是每通过一次缓冲器的边界,才产生中断 至CPU,从而减少频繁中断对CPU的影响。
音频芯片采用TLV320 AIC23,它是TI公司的一款高性能立体声音频A/D,D/A放大电路。AIC23的模数转换和数模转换部件高度集成在芯片内部,采用了先进的过采样技 术。AIC23的外部硬件接口分为模拟口和数字口。模拟口是用来输入输出音频信号的,支持线路输入和麦克风输入;有两组数字接口,其一是由/CS、 SDIN、SCLK和MODE构成的数字控制接口。AIC23是一块可编程的音频芯片,通过数字控制口将芯片的控制字写入AIC23内部的寄存器,如采样 率设置,工作方式设置等,共有12个寄存器。音频控制口与DSP的通信主要由多通道缓冲串行口McBSP1来实现。
AIC23通过数字音频口与DSP的McBSP0完成数据的通信,DSP做主 机,AIC23做从机。主机提供发送时钟信号BCLKX0和发送帧同步信号BFSX0。在这种工作方式下,接收时种信号BCLKR0和接收帧同步信号 BFSR0实际上都是由主机提供的。图1是AIC23与VC5402的接口连接。
AIC23的数字音频接口支持S(通用音顿格式)模式,也支持DSP模式(专与TIDSP连接模式),在此采用DSP模式。DSP模式工作时,它的帧宽度可以为一个bit长。
图2是音频信号采集的具体电路图。
电路的设计和布线是信号采集过程中一个很重要的环节,它的效果直接关系到后期信号处理的 质量。对于DSP达类高速器件,外部晶体经过内部的PLL倍频以后可达上百兆。这就要求信号线走等长线和绘制多层电路板来消除电磁干扰和信号的反射。在两 层板的前提下,可以采取顶层与底层走交叉线、尽量加宽电源线和地线的宽度、电源线成"树杈型"、模拟区和数字区分开等原则,可以达到比较好的效果。
音频AGC算法的实现
AGC算法
使放大电路的增益随信号强度的变化而自动调整的控制方法,就是AGC-自动增益控制。实现AGC可以是硬件电路,即AGC闭环电子电路,也可以是软件算法。本文主要讨论用软件算法来实现音频信号的AGC。
音频AGC是音频自动增益控制算法,更为准确的说是峰值自动增益控制算法,是一种根据输 入音频信号水平自动动态地调整增益的机制。当音量(无论是捕捉到的音量还是再现的音量)超过某一门限值,信号就会被限幅。限幅指的是音频设备的输出不再随 着输入而变化,输出实质上变成了最大音量位置上的一条水平线;当检测到音频增益达到了某一门限时,它会自动减小增益来避免限幅的发生。另一方面,如果捕捉 到的音量太低时,系统将自动提高增益。当然,增益的调整不会使音量超过用户在调节向导中设置的值。图3是音频AGC算法的结构框图。
AGC算法的实现过程
首先从串口获取音频数据,它是16位的整型数,一般来说,这些数都是比较小的,通过 AGC算法将输入的音频数据投影在一个固定区间内,从而使得不论输入的数据点数值大小都会等比例地向这个空间映射。一方面将获得的音频数据最大值与原来的 峰值进行比较,如果有新的峰值出现就计算新的增益系数;另一方面在一定的时间周期内获取一个新的峰值,这个峰值就具有检测性能,又与原峰值比较,然后就计 算新的增益系数。这个增益系数是相对稳定的。当音量加大时,信号峰值会自动增加,从而增益系数自动下降;当音量减小时,新的峰值会减小并且取代原来的峰 值,从而使峰值下降,使增益系数上升。最后输出的数据乘以新增益系数后映射到音频信号输入的投影区间内。
图4是音频信号AGC算法的程序流程图。
AGC_Coff是初始增益系数,初始值为1;maxAGC_in是增益峰值,初始值为0;time是采样点计数,门限值为4096;AGC_in是新的音频数据,MAXArrIn是新的音频增益峰值;映射区间【-20000,20000】。
整个系统的软件部分为5人模块。系统主函数main( )、CMD文件、中断向量表、DSP5402头文件和专为c语言开发的库函数rtdx.lib。其中主函数部分是核心,主要包括:DSP器件初始化、 MCBSP1初始化、MCBSP0初始化、AIC23初始化(内部12个可编程寄存器设置)及算法程序等。
在CCS2.0集成开发环境下,采用*.c语言和*.asm语言
相结合的方式编写程序。将编写的程序*.c、*.asm和链接程序*.cmd文件编译链接后生成执行目标文件*.out,通过仿真器将执行目标文件*.out下载到系统板上,经过调试、编译并运行,以音乐作为音频信号源输入到系统板上。
❻ 音频算法入门-傅里叶变换
上一篇文章中讲了一个时域处理的算法wsola,接下来会学习频域处理算法,在这之前必须得对频域有所了解,这就不得不提傅里叶变换了,本文的目的是让大家学会用傅里叶变换公式和傅里叶逆变换公式进行计算。数学公式是人们对世界中的现象的描述,我们学习数学公式也不该只停留在使用公式来解决问题的层次,得明白公式到底在描述什么现象,从这些天才数学家的角度来看世界。懂的地方可跳过。项目地址在文章末尾给出。
我直接说结论,傅里叶级数公式包含了傅里叶变换和傅里叶逆变换(不严谨的说就是这么回事)。
先简单说下具体关系,法国数学家傅里叶发现,任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示,这种表示方式就是傅里叶级数。假如有个波形比较复杂的周期函数,那么找出能用来构成这个周期函数的正弦函数和余弦函数的频率的方法就叫做傅里叶变换,用这些频率的正弦函数和余弦函数叠加起来表示这个周期函数的方法就叫做傅里叶逆变换。
再从公式中看下他们的关系,首先介绍傅里叶级数到底是什么,首先级数是指将数列的项依次用加号连接起来的函数。这么说可能大家还不理解,举个例子:e^x=1+x/1!+x^2/2!+...x^n/n!....,等号左边是指数函数,等号右边就是级数。傅里叶级数公式如下:
我们主要看这个指数形式的傅里叶级数公式,把求和符号去掉,展开一下就是f(t)=Fa*e^jaω0t+Fb*e^jbω0t+Fc*e^jcω0t+Fd*e^jdω0.....。现在看下面的周期函数叠加效果图,图中显示的是3个周期函数分别在坐标轴(横轴时间,纵轴幅度)的图像,写成傅里叶级数形式就是f(t)=fa(t)+fb(t)+0+0....,这就是傅里叶级数公式要描述的现象。其中Fa*e^jaω0t=fa(t),Fb*e^jbω0t=fb(t),Fc*e^jcω0t=0....。
看下图的傅里叶变换和逆变换公式,你会发现傅里叶逆变换公式和傅里叶级数公式极其相似,而傅里叶级数系数公式Fn又和傅里叶变换公式极其相似。所以对一个周期函数进行傅里叶级数展开的过程可以认为是先做傅里叶变换再做傅里叶逆变换的过程。
上图就是傅里叶变换公式也叫连续傅里叶变换公式,有个很重要的事情,就是傅里叶变换公式和逆变换公式一定要一起给出,不然就会让人误解,你们在网上会看到各种各样的写法,但这些写法都是对的,常见的如下图所示。
为了方便后面的讲解我把角频率ω换成2πf,如上图所示,ω是希腊字母读作Omega,大写是Ω,小写是ω,以后这两个字母会经常看到,都是等于2πf。不要和电学中的电阻单位搞混了,要明白字母只不过是一个符号而已,在不同学科领域都是混着用的,只要不和自己公式中其他字母冲突就行,例如上图傅里叶变换公式中的j其实就是虚数单位i,一般时候我们会把虚数单位写成i,但因为傅立叶变换经常用于电学解决一些问题,为了不和电流符号i混淆,所以公式就把i写成j 。
要想了解傅里叶变换公式,首先要了解欧拉公式e^ix=cosx+isinx在图像中的含义。以实部的值cosx作为横坐标值,虚部sinx的值作为纵坐标值,x的取值从负无穷到正无穷,画出所有的e^ix点后,你会发现这些点会形成一个周期为2π的圆。如下图1所示(如果不理解,建议看3Blue1Brown的视频,视频连接:https://www.bilibili.com/video/BV1pW411J7s8)
所以欧拉公式e^ix其实就是随着x的增大而在坐标系上逆时针画圆的过程,那么e^-ix就表示顺时针画圆,e^-i2πx就表示画圆的速度提高2π倍,也就是说x从0到1的过程就是顺时针画出一个完整圆的过程(当然x从1到2或者2到3等等,都能画出一个完整的圆),把x换成t后,e^-i2πt表示每秒都会顺时针画出一个圆。e^-i2πft表示每秒都会顺时针画出f个圆。f(t)表示t时刻的振幅,f(t)函数画出来就是时域波形图。f(t)*e^-i2πft表示每经过1秒会顺时针画出f个圆,并在画圆的同时,t时刻的圆半径要乘上t时刻的振幅,其实就是以每秒的音频振幅数据绕f圈的速度进行旋转缠绕(为了方便理解,没有用复杂的音频数据,用的是一个频率为3的正弦波音频做的实验,请看下图2,图的上半部分是时域波形图,图的左下角是f等于0.4的时候,用公式f(t)*e^-i2πft在实部和虚部构成的坐标系画的图,图的右下角是频谱图,频谱图的横坐标是频率,纵坐标是振幅,振幅的值就是左下角图中数据形成的图案的质心(图中的红点)到坐标系原点的距离的2倍)。当改变f的值,你会发现数据大多数时候是和我们想的一样,以坐标系原点为圆心环绕着,也就是振幅一直都是0,但是当f的值,也就每秒的圈数等于该音频数据的频率时,你会发现一个神奇的现象,那就是所有的数据会在实部或虚部坐标轴的一侧形成一个圆(如下图3所示,如此一来就知道这段音频数据包含了一个频率为3振幅为0.5的正弦波)。所以将多个正弦波叠加的音频数据用傅里叶公式,f从负无穷到正无穷遍历一遍,就可以把这个音频数据里包含的正弦波都一一找出来。(如果不理解,建议看3Blue1Brown的视频,视频连接:https://www.bilibili.com/video/BV1pW411J7s8)
平时我们说的对音频进行傅里叶变换处理,其实说的是短时离散傅里叶变换。短时离散傅里叶变换的公式(也可以直接叫做离散傅里叶变换公式)如下。
下面将教大家如何理解这个公式。上面说的连续傅里叶变换公式中有两个原因导致我们无法使用,第一点要求是音频数据的时间从负无穷到正无穷,第二点要求是任意时间t都要有幅度值x(t)才能代入公式进行计算。所以为了解决这两个问题,把公式变为短时且离散的傅里叶变换公式,这个公式可以把一段时间(时间假设为Ts秒)的离散音频数据(有N个采样数据)进行傅里叶变换。你可以把离散傅里叶变换公式理解成连续傅里叶变换的变形,最重要的一点是连续傅里叶变换公式的f和离散傅里叶变换公式的k不是一个意思,他们的关系是k=f*Ts。所以离散傅里叶变换公式也可以写成F(f)=1/n*∑f(t)*e^-j2πf*Ts*n/N,其中的Ts*n/N对应的就是连续傅里叶变换公式的t,只不过这个t没办法取任意时间了,t的取值也就随着n的取值成为了离散的时间点,所以前面的系数由1/2π变为1/N。这样这两个公式就对应起来了。下面将进一步详细介绍这个公式。
上一段说了k=f*Ts,这段我来解释下为什么,其实离散傅里叶变换公式中k表示的是这段Ts秒的音频数据环绕坐标系原点的圈数,所以k并不是连续傅里叶变换公式里的频率f,而频率f指的是1秒钟震荡的次数,在这个公式中频率f也对应着1秒的音频数据环绕的圈数,所以真正的频率f=k/Ts。
有人可能会好奇,那为什么不把离散傅里叶变换公式的自变量k换成f呢,这样不是更好理解吗?是会更好理解,但是没有必要,用f的话还要做一次无用的换算。因为采样点只有N个的原因,k的取值范围就被限制住了,k的取值范围只能是0~N-1的整数,这也是为什么用k来做自变量而不是用f的原因。
还有人可能会好奇,傅里叶逆变换到底是怎么把频域的信息还原回时域的,其实公式计算出来的F(k)是一个复数,这个复数包含了这个频率的周期函数的振幅和相位的信息,假设F(k)=a+ib,,F(k)的模|F(k)|=(a^2+b^2)^1/2,频率f=k/Ts时的振幅为|F(k)|*2(因为求出来的值相当于圆心,但实际上振幅是圆离圆心最远点到坐标原点的距离,所以要乘2),频率f=k/Ts时的相位为arctan(b/a)。所以如果你知道一个周期函数包含了哪些频率的周期函数,并且你这到这些周期函数的振幅和相位,你就可以像下图一样把fa(t)和fb(t)叠加在一起还原回f(t)。傅里叶逆变换的做法略有不同,但意思就是这么个意思,理解了离散傅里叶变换公式的计算,逆变换其实也是差不多代入数值计算就是了。(如果不理解怎么用离散傅里叶变换公式计算,建议看视频,视频里有离散傅里叶变换完整的计算过程,视频连接:https://www.hu.com/zvideo/1276595628009377792)
快速傅里叶变换推荐看下面两个视频
https://www.bilibili.com/video/BV1za411F76U
https://www.bilibili.com/video/BV1Jh411d7CN
下面是我用java实现的离散傅里叶变换及逆变换和快速傅里叶变换及逆变换,从他们的运行时间就可以看出来快速傅里叶变换快得多。(学完快速傅里叶变换再想想频谱为何Y轴对称?为何N/2对称?)