MATLAB代做|MATLAB代写|MATLAB有偿编程 - MATLAB代做
FPGA代做|FPGA代写|FPGA有偿编程 - FPGA代做
QQ: 1224848052
前提说明:
*.cda格式,就是CD音轨。标准CD格式也就是44.1K的采样频率,速率88K/秒,16位量化位数,因为CD音轨可以说是近似无损的,因此它的声音基本上是忠于原声的,因此如果你如果是一个音响发烧友的话,CD是你的首选。CD光盘可以在CD唱机中播放,也能用电脑里的各种播放软件来重放。一个CD音频文件是一个*.cda文件,这只是一个索引信息,并不是真正的包含声音信息,所以不论CD音乐的长短,在电脑上看到的“*.cda文件”都是44字节长。不能直接的复制CD格式的*.cda文件到硬盘上播放,需要使用象EAC这样的抓音轨软件把CD格式的文件转换成WAV,这个转换过程如果光盘驱动器质量过关而且EAC的参数设置得当的话,可以说是基本上无损抓音频。
也就说,CD唱片中的文件,我们必须通过抓轨软件来获取其中的音频文件,仿真电脑上,然后我们才能进行后面的转换操作。那么也就是说,我们需要将CD中提取的音乐转换为AAC格式的音乐,然后在FPGA上进行播放,而在FPGA中播放,即对AAC进行解码。
所以,这个课题的主要工作,有如下几个方面:
·CD唱片的音频提取,CD音乐本质是一种无损音乐,所以可以认为是原始的音乐信号。
·由音乐格式文件转换为AAC格式的音乐文件,然后发送到FPGA中进行播放。
通常情况下,CD中的信号一般情况下理解为无损音乐,通常为WAV音频信号。
使用MATLAB得到AAC音频——方案的验证:
我们首先通过MATLAB进行方案的验证,即如何从CD文件得到AAC文件的一个流程。那么,这个情况下,我们的系统的框图如下所示:
通过MATLAB的仿真可知,由原始的WAV文件(CD抓轨得到),转换为AAC,同时播放,他们的音效基本相同,然后看体积:
体积只有原来的1/9,但音质基本不变。
使用FPGA实现CD转AAC播放的功能
为了方便的验证FPGA将CD文件转换为AAC文件的正确性,我在这里提供了一套AAC的编码译码的MATLAB程序,用他来验证我们的FPGA程序的正确性。具体的验证流程图如下所示:
以上就是整个程序设计的流程图。
注意,由于CD表示的一种无损的音频信号,所以,在这里,我们使用WAV作为最后的抓轨后的数据来表示无损信号。
上面的测试图,对于MATLAB部分,我们直接使用

进行仿真,验证,最后还得到了原始音频,AAC音频以及还原后的音频的部分波形图。
下面进行FPGA的设计,即实现AAC音频文件的解码播放。
在仿真验证阶段,我们主要通过读取WAV的文件的数据,进行AAC转换得到AAC音频数据,然后仿真的时候,将AAC音频数据的结果保存到文件中,再通过MATLAB中的

这个文件,进行还原,从而验证AAC音频文件的正确性。
然后仿真验证正确之后,我们需要设计一个接口,将电脑上的WAV文件发送到板子上,然后实时的转换为AAC音频文件。
下面介绍一下,如何在FPGA中实现AAC解码播放。AAC解码的流程见本说明最后附录。
由于AAC所有解码工具都是用的话,系统非常复杂,这里,我们使用较常用的几种,所以这里,我们设计的AAC音频解码结构如下图所示:
其中,上图中的黑色部分是通常情况下AAC解码锁需要的模块,这里,我们就这对这几个模型进行设计。
这里,主要需要设计的是哈弗曼解码,反量化,尺度因子调整,TNS和IDMCT这几个模块。
这里,我们的代码结构如下所示:
整个系统的构架如下所示:
即,整个系统的工作,我们通过NIOSII软核进行控制。
程序操作方法如下所示:
这里,说明一下如何使用这个代码:
具体的操作如下所示:
一般将,音频信号导入到FPGA有两种方法,一种是通过USB接口进行数据的发送,一种是将音频保存到SD卡中,然后将SD卡插入到FPGA,一开始说用USB发送,但是考虑到使用USB发送的话,我们还需要在电脑上编写USB发送软件,这样就比较麻烦了,这里我们使用SD卡进行传输,这样,我们就不要编写软件了。
关于各个模块的设计方法,具体,我们提供了两篇硕士论文,如下所示:
首先AAC音频解码的基本流程如下所示:
在主控模块开始运行后,主控模块将AAC比特流的一部分放入输入缓冲区,通过查找同步字得到一帧的起始,找到后,根据ISO/IEC 13818-7所述的语法开始进行Noisless Decoding(无噪解码),通过反量化(Dequantize)、联合立体声(Joint Stereo),知觉噪声替换(PNS),瞬时噪声整形(TNS),反离散余弦变换(IMDCT),频段复制(SBR)这几个模块之后,得出左右声道的PCM码流,再由主控模块将其放入输出缓冲区输出到声音播放设备。
★无噪声解码
无噪编码就是哈夫曼编码,它的作用在于进一步减少尺度因子和量化后频谱的冗余,即将尺度因子和量化后的频谱信息进行哈夫曼编码。
全局增益编码成一个8位的无符号整数,第一个尺度因子与全局增益值进行差分编码后再使用尺度因子编码表进行哈夫曼编码。后续的各尺度因子都与前一个尺度因子进行差分编码。量化频谱的无噪编码有两个频谱系数的划分。其一为4元组和2元组的划分,另一个为节划分。对前一个划分来说,确定了一次哈夫曼表查找出的数值是4个还是2个。对后一个划分来说,确定了应该用哪一个哈夫曼表,一节中含有若干的尺度因子带并且每节只用一个哈夫曼表。
分段
无噪声编码将输入的1024个量化频谱系数分为几个段(section),段内的各点均使用同一个哈夫曼表,考虑到编码效率,每一段的边界最好同尺度因子带的边界重合。所以每一段必段传送信息应该有:段长度,所在的尺度因子带,使用的哈夫曼表。
分组和交替
分组是指忽略频谱系数所在窗,将连续的,具有相同尺度因子带的频谱系数分为一组放在一起,共享一个尺度因子从而得到更好的编码效率。这样做必然会引起交替,即本来是以
c[组][窗][尺度因子带][系数索引]
为顺序的系数排列,变为将尺度因子带同的系数放在一起:
c[组][尺度因子带][窗][系数索引]
这样就引起了相同窗的系数的交替。
大量化值的处理
大量化值在AAC中有两种处理方法:在哈夫曼编码表中使用escape标志或使用脉冲escape方法。前者跟mp3编码方法相似,在许多大量化值出现时采用专门的哈夫曼表,这个表暗示了它的使用将会在哈夫曼编码后面跟跟一对escape值及对值的符号。在用脉冲escape方法时,大数值被减去一个差值变为小数值,然后使用哈夫曼表编码,后面会跟一个脉冲结构来帮助差值的还原。
★尺度因子解码及逆量化
在aac编码中,逆量化频谱系数是由一个非均匀量化器来实现的,在解码中需进行其逆运算。即保持符号并进行4/3次幂运算。
在频域调整量化噪声的基本方法就是用尺度因子来进行噪声整形。尺度因子就是一个用来改变在一个尺度因子带的所有的频谱系数的振幅增益值。使用尺度因子这种机制是为了使用非均匀量化器在频域中改变量化噪声的比特分配。
尺度因子带(scalefactor-band)
频率线根据人耳的听觉特性被分成多个组,每个组对应若干个尺度因子,这些组就叫做尺度因子带。为了减少信息含有短窗的边信息,连续的短窗可能会被分为一组,即将若干个短窗当成一个窗口一起传送,然后尺度因子将会作用到所有分组后的窗口去。
反量化公式:
x_invquant = sign(x_quant) * | x_quant| ^(4/3)
其中
x_invquant表示反量化的结果
sign (x)表示取x的符号
^表示幂运算
应用尺度因子公式:
x_rescal = x_invquant * gain
gain = 2 ^ (0.25 * (sf – SF_OFFSET))
其中
x_rescal为应用了尺度因子公式之后的值
gain 为一个增益
sf为尺度因子值
SF_OFFSET为一个常数,设为100
★联合立体声解码
联合立体声有两种,M/S stereo(中间旁道立体声)和intensity stereo(强度立体声)
Intensity stereo
在强度立体声模式中,左声道传的是幅值,右声道的scalefactor传的是立体声的位置is_pos。如果仅在一个指定了common_window为1的CPE中的右通道中指定哈夫曼表为INTENSITY_HCB或INTENSITY_HCB2,则解码时使用强度立体声模式。其计算公式如下:
is_pos += dpcm_is_pos
scale = invert_intensity * 0.5 ^(0.25 * ispos)
r_spec = scale * l_spec
从完全备份中还原
从完全备份中还原数据库非常简单,在
is_pos是右声道传送的scalefactor
dpcm_is_pos是上一个is_pos,初值为0
scale为强度因子
invert_intensity为是否反转哈夫曼表(表14和表15)这个变量由ms_used指定,关系为:invert_intensity = 1 – 2 * ms_used,另外,当ms_mask_present为0时,invert_intensity恒为1。
★PNS
PNS(Perceptual Noise Substitution)知觉噪声替换模块是一种以参数编码的方式模拟噪声的模块。在判别出音频值中的噪声后,将些噪声不进行量化编码,而是采用一些参数告诉解码器端这是某种噪声,然后解码器端将会对这些噪声用一些随机的编码来制造出这一类型的噪声。
在具体操作上,PNS模块对每个尺度因子带侦测频率4kHz以下的信号成分。如果这个信号既不是音调,在时间上也无强烈的能量变动,就被认为是噪声信号。其信号的音调及能量变化都在心理声学模型中算出。
在解码中,如果发现使用了哈夫曼表13(NOISE_HCB),则表明使用了PNS。由于M/S立体声解码与PNS解码互斥,故可以用参数ms_used来表明是否两个声道都用同样的PNS。如果ms_used参数为1,则两个声道会用同样的随机向量来生成噪声信号。
PNS的能量信号用noise_nrg来表示,如果使用了PNS,则能量信号将会代替各自的尺度因子来传送。
噪声能量编码同尺度因子一样,采用差分编码的方式。第一个值同样为全局增益值。它同强度立体声位置值及尺度因子交替地放在一起,但对差分解码来说又彼此忽略。即下一个噪声能量值以上一个噪声能量值而不是强度立体声位置或尺度因子为标准差分解码。随机能量将会在一个尺度因子带内产生noise_nrg所计算出的平均能量分布。
★TNS
TNS瞬态噪声整形用于控制一个转换窗口内的瞬时噪声形态。它是用一个对单个通道的滤波过程来实现的。
传统的变换编码方案常常遇到信号在时域变化非常剧烈的问题,特别是语音信号,这个问题是因为量化后的噪声分布虽然在频率域上得到控制,但在时域上却以一个常数分布在一个转换块内。如果这种块中信号变化得很剧烈却又不转向一个短块去,那这个常数分布的噪声将会被听到。
TNS的原理利用了时域和频域的二元性和LPC(线性预测编码)的时频对称性,即在其中的任意一个域上做编码与在另一域上做预测编码等效,也就是说,在一个域内做预测编码可以在另一域内增加其解析度。量化噪声产生是在频域产生的,降低了时域的解析度,故在这里是在频域上做预测编码。
在AACplus中,由于基于AAC profile LC,故TNS的滤波器阶数被限制在12阶以内。