ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:201.24KB ,
资源ID:10740745      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10740745.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(语音信ADPCM编解码实现.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

语音信ADPCM编解码实现.docx

1、语音信ADPCM编解码实现课程设计报告设计课题: ADPCM编解码器的实现 姓 名: XXX 专 业: 集成电路设计与集成系统 学 号: 04 日 期 2015年1月17日 指导教师: XXX 国立华侨大学信息科学与工程学院一:课程设计任务与要求。ADPCM编解码器的实现。m转为Verilog,使用Matlab和Modesim联合仿真验证二:系统设计原理。 脉冲编码调制PCM脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程9。 抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号

2、变成时间上离散的信号,抽样必须遵循奈奎斯特抽样定理。该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号。它的抽样速率的下限是由抽样定理确定的。抽样速率采用8KHZ。量化,就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,通常是用二进制表示。量化误差:量化后的信号和抽样信号的差值。量化误差在接收端表现为噪声,称为量化噪声。 量化级数越多误差越小,相应的二进制码位数越多,要求传输速率越高,频带越宽。 为使量化噪声尽可能小而所需码位数又不太多,通常采用非均匀量化的方法进行量化。 非均匀量化根据幅度的不同区间来确定量化间隔,幅

3、度小的区间量化间隔取得小,幅度大的区间量化间隔取得大。一个模拟信号经过抽样量化后,得到已量化的脉冲幅度调制信号,它仅为有限个数值。编码,就是用一组二进制码组来表示每一个有固定电平的量化值。然而,实际上量化是在编码过程中同时完成的,故编码过程也称为模/数变换,可记作A/D。 差分脉冲编码调制DPCM差分脉冲编码调制DPCM是利用样本与样本之间存在的信息冗余度(预测样值与当前样值之差)来代替样值本身进行编码的一种数据压缩技术10。差分脉冲编码调制可以实现在量化台阶不变(即量化噪声不变)的情况下,编码位数显着减少,信号带宽大大压缩。根据过去的样本去估算下一个样本信号幅度大小,这个值称为预测值,对实际

4、信号值与预测值之差进行量化编码,从而就减少了表示每个样本信号的位数。差分脉冲编码的概念,如图中,差分信号d(k)是离散输入信号s(k)和预测器输出的估计值之差。此刻,是对S(k)的预测值,而不是过去样本的实际值。DPCM系统实际上就是对这个差值的d(k)进行量化编码,用来补偿过去编码中产生的量化误差。DPCM系统实际就是一个负反馈系统,采用这种结构可以避免量化误差的积累。重建新号是由逆量化器产生的量化差分信号,与对过去样本信号的估算值求和得到。他们的和,即作为预测器确定下一个信号估算值的输入信号。由于在发送端和接收端都使用相同的逆量化器和预测器,所以接收端的重建信号可以传送信号I(k)中获得。

5、 图 DPCM原理图在PCM中,每个波形样值都独立编码,与其他样值无关,样值的整个幅值编码需要较多位数,比特率较高,数字化的信号带宽大。然而,大多数以奈奎斯特或更高速率抽样的信源信号在相邻抽样间表现出很强的相关性,利用信源的这种相关性,一种比较简洁的解决方案是对相邻样值的差值而不是样值本身进行编码。由于相邻样值的差值比样值本身小,可以用较少的比特数表示差值。如果将样值之差仍用N位编码传送,则DPCM的量化信噪比显然优于PCM系统。 自适应差分脉冲编码调制ADPCM前述概要地介绍了DPCM的工作原理。但为了能进一步提高DPCM方式的质量还需要采取一些辅助措施。即自适应措施。语声信号的变化是因人、

6、因时而不同的,为了能在相当宽的变化范围内仍能得到最佳的性能,DPCM也需要自适应系统,自适应预测和自适应量化,称为ADPCM。图所示为采用固定预测并带有自适应量化的ADPCM系统。图中多电平量化与调制器用Q表示,积分器用P组成的预测系统表示。自适应量化的基本思想是:让量化间隔的变化,与输入信号方差相匹配,即量化器阶距随输入信号的方差而变化,它正比于量化器输入信号的方差。现有的自适应量化方案有两类:一类是其输入幅度或方差由输入信号本身估算,这种方案叫前馈自适应量化器。另一类是其阶距根据量化器的输出来进行自适应调整,或等效的用输出编码信号来进行自适应调整,这类自适应量化方案称为反馈自适应量化器。无

7、论是采用前馈式还是反馈式,自适应量化都可以改善动态范围及信噪比。反馈控制的主要优点是量化阶距的信息由码字序列提取,因此不需要传输或存储额外的阶距信息。但是在重建信号输出时,传输中的误码对质量的影响比较敏感,在前馈控制时,要求码字和阶距一起,用来得出信号。这样是增加了其复杂程度,但它有可能在差错控制保护下传输阶距从而大大改善高误码率传输时的输出信号质量。不论是前馈型还是反馈型自适应量化都可以希望得到超过相同电平数固定量化的1020dB的改善。为了进一步有效地克服语声通信过程中的不平稳行,要考虑量化器和预测器都适应匹配于语声信号瞬时变化,又设计了同时带有自适应量化和自适应阶距的ADPCM系统。自适

8、应量化和自适应预测都可以是前馈型的或是反馈型的。对ADPCM来说,预测系统的预测系数的选择是很重要的。如果信号的样值用S(n)表示,的样值用表示,的样值用表示,则当采用线性预测,即是以前量化值的线性组合时,其预测值为 式中P为预测器的阶数。要使预测系数自适应,通常是假定短时间内语声信号的参量保持恒定的。并使短时间内的均方预测误差为最小值来选择预测系数11。(a)编码器(b)解码器图 ADPCM原理图 编码过程编码的核心思想是对输入信号与预测信号差值进行编码和预测,采用的是非均匀量化,为了使不同幅值的信号信噪比接近一致,从而避免大幅值语音信号信噪比大而小幅值语音信号信噪比小12。ADPCM编码过

9、程如图所示输示。输入Si是一个线性16bit补码PCM数据,其范围在32767到-32767之间。如果是非线性的PCM则之前先加个线性转化模块使得输入的数据是线性的。经过预测器出来的预测采样值Sp=,与线性输入Si的差值为d,我们就可以在这个差值上进行处理。接下来量化器模块对有符号的4位编码数据I,由于是带符号的所以这个数据的表示范围在7到-7之间,最高位为符号位。 具体实现过程如下,首先计算16位的PCM值的当前采样值Si和上一时刻预测采样值之间的差值d,这个差值的量化编码即输出4位ADPCM值I(k)。在算法实现中,定义一个结构变量存储预测采样Sp和量化步长索引,并制定了两个表。一个表为索

10、引调整表,其输入为差值量化编码I(k),用来更新步长索引。另一个表为步长调整表,其输入为步长索引,输出为步长q。编码时,首先用上一个采样点的步长索引查步长调整表求出步长q。如果当前采样值Si和采样预测值之间的差值d为负,则I的D3位置1。如果该差值绝对值大于步长q,则I的D2位置1。如果d-q大于q/2,则I的D1位置1,如果d-q-q/2大于q/4,则I的D0位置1。如果以上条件不满足,则相应位置0。这样就确定了编码值I(k)。然后编码值I(k)作为索引调整表的输入,查表输出索引调整,并和结构变量中原步长索引相加,产生新的步长索引,在下一个采样值的编码中使用。编码输出I后,编码还需要重复进行

11、和解码完全一样的计算过程,求出新的预测采样值Sp。图 协议编码概括起来其主要步骤如下 计算Si与自适应预测器输出的差值; 通过自适应量化模块对进行量化,得到ADPCM码字I(k); 通过自适应反量化模块对I(k)计算得到量化差分预测信号; 根据重建信号和更新预测滤波器系数; 利用新的系数,计算得到,重复上述5个步骤,压缩下一个语音采样数据。图 协议解码 解码过程解码是编码的逆过程,ADPCM的解码过程如图所示。解码输入即编码输出I,逆量化器将I逆量化成差值dq。差值dq与预测采样Sp相加得到解码输出Sr。解码过程同编码过程中求预测采样的原理是一样的,当编码端的Sr能很好的跟踪上Si时,解码端的

12、Sr也能同样再现Si。这里涉及算法本身的时延和实现平台、实现方法的实时性等因素。 解码时首先通过步长索引查步长调整表得到量化步长,差值量化编码I经逆量化器得到语音差值dq,这是求I的逆过程;然后与前次预测值一起重建当前语音信号Sr,最后用固定预测Sp=Sr,更新预测采样Sp,用I更新量化步长索引值131415。其主要步骤如下: 通过自适应逆量化器和自适应预测得到和。 通过同相加便得到编码输出Sr。 采用与编码器相同的方法更新预测滤波器系数,。 采用与编码器相同的方法更新步长索引表,得到新的 利用新的滤波器系数,重复上述5个步骤,解码下一个I(k)。三:测试与验证主要采用Matlab来验证ADP

13、CM的结果,以及和Modlsim来联合仿真。而我们利用 FPGA 资源消耗低、灵活性强、速度快、性价比突出等优势,使用 VerilogHDL 硬件描述语言设计并实现了ADPCM 编/解码器, 运用Modelsim 仿真测试,来确保编/解码器的正确性和稳定性, 整个设计充分利用了 FPGA 芯片的资源、硬件结构简单、可靠性高,具有良好的应用前景。仿真根据协议,再由上述原理编写ADPCM的编解码器C代码,将代码导入到matlab中17。我们用一段类似语音的正弦波取200点来验证波形。其代码如下:t=0:pi/50:2*pi;y=sin(t); adpcm_y=adpcm_encoder(y); Y

14、=adpcm_decoder(adpcm_y);其中adpcm_encoder( )为ADPCM的编码模块,代码见附录1,而adpcm_decoder( )为ADPCM的解码模块,其代码也见附录1。y为输入波,adpcm_y为ADPCM编码波形,Y为解码输出波形则输入波形如图。图 输入波形ADPCM编码波形如图。图 ADPCM编码波形ADPCM解码波形如图。图 ADPCM解码输入与输出波形的差值如图。图 输入与输出差值波形可以看出开始差距比较大后来慢慢便开始减小,是因为开始是初始化预测值我们无法知道,所以便设定为预测值为0。 Modelsim仿真本设计采用verilog语言验证编解码器功能的实

15、现18。先用matlab生成一个类似于正弦波的图形来模拟为输入的语音波形,并将其值记录在一个名为“sin”的.txt文件,然后送入到测试文件中my_mem保存起来,2个时钟上升沿后便把my_mem保存的数据一一送入到编码器的PCMIN输入端,然后modelsim仿真结果如下图。仿真测试verilog代码和编码器的代码见附录2。图 输入波形及编码波形同理我让从编码器输出的编码值也保存在名为“code”的.txt文件中,并设计了一个my_mem的寄存器也来保存中的编码值,在经过2个时钟下降沿后便把my_mem中保存的数据一一送到解码器的CODEIN输入端,按照这种方法,每隔2个时钟下降沿便将my_

16、mem中数据输入一个,最后modelsim仿真数据如图。其中verilog的解码器代码和测试文件的代码见附录2。图 解码输出波形经过解码后波形与输入波形相似,当系统稳定后,差异便慢慢减少,基本保持了语音的质量。四:总结与展望通过matlab仿真和modelsim的仿真,能够证明此次设计基本符合语音编解码的期望和结果。本次课题主要研究ADPCM编解码器实现,从而展开的工作。其主要的工作是根据文献资料调研ADPCM编解码器的原理和设计方法。利用Matlab和C语言实现ADPCM编解码器。利用verilog设计ADPCM编解码器的硬件电路,通过对modelsim仿真测试激励文件的描写和verilog

17、编程语言的学习,对设计的verilog模型进行时序仿真验证。综合设计的verilog模型并生成FPGA文件。通过此次课题让我对ADPCM编解码有了一定的了解,同时也对其使用的仿真软件有了更加熟悉的运用,让我对verilog硬件语言有了更加深刻的认识,为我积累了许多宝贵的经验。附 录附录1:编码代码function adpcm_y = adpcm_encoder(raw_y)IndexTable = -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8; StepSizeTable = 7, 8, 9, 10, 11, 12, 13, 14

18、, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 48

19、71, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767;prevsample = 0;previndex = 1; Ns = length(raw_y);n = 1; raw_y = 32767 * raw_y; while (n = 0) code = 0; else code = 8; diff = -diff; end tempstep = step; if (diff =

20、tempstep) code = bitor(code, 4); diff = diff - tempstep; end tempstep = bitshift(tempstep, -1); if (diff = tempstep) code = bitor(code, 2); diff = diff - tempstep; end tempstep = bitshift(tempstep, -1); if (diff = tempstep) code = bitor(code, 1); end diffq = bitshift(step, -3); if (bitand(code, 4) d

21、iffq = diffq + step; end if (bitand(code, 2) diffq = diffq + bitshift(step, -1); end if (bitand(code, 1) diffq = diffq + bitshift(step, -2); end if (bitand(code, 8) predsample = predsample - diffq; else predsample = predsample + diffq; end if (predsample 32767) predsample = 32767; elseif (predsample

22、 -32768) predsample = -32768; end index = index + IndexTable(code+1); if (index 89) index = 89; end prevsample = predsample; previndex = index; adpcm_y(n) = bitand(code, 15); n = n + 1;End解码模块function raw_y = adpcm_decoder(adpcm_y)IndexTable = -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8;

23、StepSizeTable = 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2

24、499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767; prevsample = 0;previndex = 1; Ns = length(adpcm_y);n = 1; while (n 32767) predsample = 32767; elseif (predsample -32768)

25、 predsample = -32768; end index = index + IndexTable(code+1); if (index 89) index = 89; end prevsample = predsample; previndex = index; raw_y(n) = predsample / 32767; n = n + 1;end附录2编码模块module ADPCMEncoder(RST,EN,CLK,PCMIN,CODEOUT);input RST;input EN;input CLK;input signed 15:0 PCMIN;output3:0 CODE

26、OUT;reg3:0 CODEOUT;reg tai;reg sb;reg signed15:0 predsample,diff,prevsample;reg15:0 code;reg signed7:0 index;reg start;initialbegin tai = 0; prevsample = 0; start = 0;endalways (posedge CLK)begin if(EN = 0) begin start = 1; end if(RST=0) begin tai = 0; prevsample = 0; index = 0; end if(start=1) begi

27、n if(!tai) begin predsample = PCMIN; diff=predsample-prevsample; if (diff=StepSizeTable(index) begin diff = diff - StepSizeTable(index); code2 = 1; end else code2 = 0; diff = diff=StepSizeTable(index) begin diff = diff - StepSizeTable(index); code1 = 1; end else code1 = 0; diff = diff=StepSizeTable(

28、index) begin code0 = 1; end else code0 = 0; end else begin CODEOUT0 = code0; CODEOUT1 = code1; CODEOUT2 = code2; CODEOUT3 = sb; index =index + IndexTable(code); if (index88) index=88; prevsample=predsample; start = 0; end tai = tai; endendfunction7:0 IndexTable;input2:0 index_a;case(index_a)3d00:IndexTabl

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1