ADPCM压缩算法_第1页
ADPCM压缩算法_第2页
ADPCM压缩算法_第3页
ADPCM压缩算法_第4页
ADPCM压缩算法_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#ADPCM压缩算法ADPCM(Adaptive Differential Pulse Code Modulation),是一种针对 16bits( 或8bits或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每次采样的 16bit 数据以 4bit 存储,所以压缩比 1:4. 而且压缩/解压缩算法非常简单,所以是一种低空间消耗,高质量高效率声音获得的好途径。保存声音的数据文件后缀名为 .AUD 的大多用ADPCM 压缩。ADPCM 主要是针对连续的波形数据的,保存的是波形的变化情况,以达到描述整个波形的目的,由于它的编码和解码的过程却很简洁,列在后面,相信大家能够看懂。8bits采样

2、的声音人耳是可以勉强接受的,而 16bit 采样的声音可以算是高音质了。ADPCM 算法却可以将每次采样得到的 16bit 数据压缩到 4bit 。需要注意的是,如果要压缩/解压缩得是立体声信号,采样时,声音信号是放在一起的,需要将两个声道分别处理。ADPCM 压缩过程首先我们认为声音信号都是从零开始的,那么需要初始化两个变量 int index=0,prev_sample=0;下面的循环将依次处理声音数据流,注意其中的 getnextsample() 应该得到一个 16bit 的采样数据,而 outputdata() 可以将计算出来的数据保存起来,程序中用到的 step_table,inde

3、x_adjust 附在后面:int index=0,prev_sample:=0;while (还有数据要处理)cur_sample=getnextsample();/ 得到当前的采样数据delta=cur_sample-prev_sample;/ 计算出和上一个的增量if (delta<0) delta=-delta,sb=8;/ 取绝对值else sb = 0 ;/ sb 保存的是符号位code = 4*delta / step_tableindex;/ 根据 steptable得到一个 0-7 的值if (code>7) code=7;/ 它描述了声音强度的变化量index

4、+= index_adjustcode ;/ 根据声音强度调整下次取steptable 的序号if (index<0) index=0;/ 便于下次得到更精确的变化量的描述else if (index>88) index=88;prev_sample=cur_sample;outputode(code|sb);/ 加上符号位保存起来有关ADPCM压缩过程更详细的信息,参见本站 ADPCM压缩过程演示程序 ADPCM 解压缩过程 接压缩实际是压缩的一个逆过程,同样其中的 getnextcode() 应该得到一个编码,,而 outputsample() 可以将解码出来的声音信

5、号保存起来。这段代码同样使用了同一个的 setp_table 和 index_adjust() 附在后面:int index=0,cur_sample=0;while (还有数据要处理) code=getnextcode();/ 得到下一个数据if (code & 8) != 0) sb=1 else sb=0;code&=7;/ 将 code 分离为数据和符号delta = (step_tableindex*code)/4+step_tableindex/8;/ 后面加的一项是为了减少误差if (sb=1) delta=-delta;cur_sample+=delta; /

6、计算出当前的波形数据if (cur_sample>32767) output_sample(32767);else if (cur_sample<-32768) output_sample(-32768);else output_sample(cur_sample);index+=index_adjustcode;if (index<0) index=0;if (index>88) index=88;有关ADPCM解压过程更详细的信息,参见本站 ADPCM解压过程演示程序附表 int index_adjust8 = -1,-1,-1,-1,2,4,6,8;int ste

7、p_table89 = 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,2499,2749,3024,3327,3660,4026,4428,4871,5358,5894,6484,7132,7845,8

8、630,9493,10442,11487,12635,13899,15289,16818,18500,20350,22385,24623,27086,29794,32767特殊ADPCM压缩根据ADPCM压缩/解压原理,本站提供了 3bits ADPCM 和 4bits ADPCM 压缩程序,另外还提供 ADPCM系数表设计程序 下载。AUD文件结构关于 WestWood 的 .AUD 文件,结构比较简单,这里顺带提一下,有兴趣可以自己写处理AUD文件的程序,其 8bit 的声音压缩算法尚不知晓,但用的最广泛的 16bit 声音正是用 ADPCM 压缩,每个 AUD 文件都有一个文件头,结构如

9、下:structunsigned short int samplespersec ; / 频率long int size; / 除掉文件头的大小long int outsize;/ 输出数据大小 (通常是 4 倍)unsigned char flags; / 位 0 描述是否立体声,位 1 描述是否 16 bitunsigned char type ; / 1=WW 压缩,99=IMA ADPCMAUD文件的声音信号是按块存放的,每块大约 512 字节,每一块都有一个块头结构:structunsigned short int size; / 压缩过的数据大小unsigned short int

10、 outsize; / 输出数据大小 (通常是 4 倍)long int id; / 永远是 0x0000DEAF¥ADPCM - 名称Adpcm是自适应差分脉冲编码调制的简称,最早使用于数字通信系统中。该算法利用了语音信号样点间的相关性,并针对语音信号的非平稳特点,使用了自适应预测和自适应量化,在32kbps8khz速率上能够给出网络等级话音质量。 编辑本段 回目录 ADPCM - 用途现在我们使用的是IMA ADPCM算法,该算法中对量化步长的调整使用了简单的查表方法,对于一个输入的PCM值X(n),将其与前一时刻的X(n-1)预测值做差值 得到d(n),然后根据当前的量化步长对

11、d(n)进行编码,再用此sample点的编码值调整量化步长,同时还要得到当前sample点的预测值供下一sample点编码使用。通过此算法可将样点编码成4bit的码流,一个符号位和三个幅度位。该算法较简单,通过查表简化了运算。对于编码后的数据我们采用了wav文件格式,该格式对编码后的数据流进行了包装,由文件头和数据码流组成,文件头中指出了音频数据所采用格式、采样率、比特率、块长度、比特数及声道数等信息。数据码流以块为单位,块头指出了该块起始的预测值和index值,码流中每byte的高四位和低四位分别对应一个PCM。当前该算法以其简单实用的特点广泛应用到数字音乐盒和数字录音笔中。 刚写的一个8位

12、ADPCM压缩程序,秀一下. 问.PUBLIC _stAtei,_stAteo,_indextAble,_stepsizetAble /定义全局变量S_STATE:.STRUCT                                   &

13、#160;PrevVAlue:.DW 1 DUP(?)    PrevIndex:.DW 1 DUP(?).ENDS.DATA_indextAble:     .DW -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8_stepsizetAble:    .DW 4, 5, 6, 7, 8, 9, 11,13,15,17,19, 22, 25,28, 31, 34,38, 42, 46, 50, 54, 59

14、, 64, 69, 74, 79, 85, 91, 97, 103, 109,116,123,127.RAM_stAtei:.S_STATE_stAteo:.S_STATE.DEFINE STEP         5 .DEFINE BUFOSTEP     4.DEFINE BUFISTEP     3.DEFINE SIGN      

15、0; 2.DEFINE LEN            11.DEFINE OUTDATA        10.DEFINE INDATA        9.CODE.PUBLIC _ADPCM_ENCODE,_ADPCM_DECODE_ADPCM_ENCODE: .PROC   

16、 push bp to sp    sp-=6            bp=SP+1    r1=_stAtei.PrevIndex    r1+=_stepsizetAble    R1=r1    BP+STEP=R1     

17、;R1=0    BP+BUFOSTEP=R1 /BUFOSTEP    BP+BUFISTEP=R1 /BUFISTEPT1:    R1=BP+LEN    cmp R1,0    JNE LOOP    PC= EXITLOOP:    R4=BP+INDATA    R2

18、=R4    R3=BP+BUFISTEP    TEST R3,1    JNZ LOW_BIT        R2=R2 LSR R2        R2=R2 LSR R2        JMP T2LOW_BIT: 

19、60;      R2&Amp;=0x00FF        R1-=1        R4+=1    BP+INDATA=R4    BP+LEN=R1T2:    R3=R3 XOR 0xFFFF    B

20、P+BUFISTEP=R3    /R1,R3,R4 FREE;    R1=0        R3=_stAtei.PrevVAlue    R2-=R3    JSC T3    R1=8    R2=-R2     

21、0;          /R2 DIFF T3:                     /R1 DELTA    BP+SIGN=R1    R3=BP+STEP    

22、;    /R3 STEP    R4=R3 LSR 3            /R4 vpdiff    CMP R2,R3    JNGE T4    R1=4    R2-=R3    R4+=

23、R3T4:    R3=R3 LSR 1    CMP R2,R3    JNGE T5    R1|=2    R2-=R3    R4+=R3T5:     R3=R3 LSR 1    CMP R2,R3    JNGE T6

24、0;   R1|=1    R4+=R3T6:                /R2 R3 FREE    r3=_stAtei.PrevVAlue    R2=BP+SIGN    TEST R2,0x8   

25、0;JNZ T7    R3+=R4    JMP T8T7: R3-=R4T8:    CMP R3,127    JLE T9    R3=127T9:    CMP R3,-128    JGE T10    R3=-128T10:_stAtei.PrevVAlue=R3&

26、#160;   R1|=R2    R2=R1+_indextAble    R2=R2    R2+=_stAtei.PrevIndex    JSC T11_1        R2=0T11_1:        CMP R2,33 &#

27、160;      JLE T11            R2=33T11:    _stAtei.PrevIndex=R2    R3=R2+_stepsizetAble    R3=R3    BP+STEP=R3   

28、60;R3=BP+OUTDATA    R4=R3    R2=BP+BUFOSTEP    CMP R2,0        JNE T12        R1 = R1 LSR 4        R1 = R1 ROR 4 &#

29、160;      R3=R1        JMP T15T12:        CMP R2,1        JNE T13        R1=R1 LSL 4    &#

30、160;   R1=R1 LSL 4        R4|=R1        R3=R4        JMP T15T13:    CMP R2,2        JNE T14  &#

31、160;         R1=R1 LSL 4        R4|=R1        R3=R4        JMP T15T14:    CMP R2,3     

32、60;  JNE T15        R4|=R1        R3=R4        R3+=1        BP+OUTDATA=R3        R2=0 

33、;       BP+BUFOSTEP=R2        PC=T1T15:    R2+=1    BP+BUFOSTEP=R2    PC=T1EXIT:    sp+=6;    pop bp from sp   

34、; retf    .ENDP_ADPCM_DECODE:.PROC    .ENDP ADPCM简介Adpcm 是自适应差分脉冲编码调制的简称,最早使用于数字通信系统中。该算法利用了语音信号样点间的相关性,并针对语音信号的非平稳特点,使用了自适应预测和自适应量化,在32kbps8khz速率上能够给出网络等级话音质量。现在我们使用的是IMA ADPCM算法,该算法中对量化步长的调整使用了简单的查表方法,对于一个输入的PCM值X(n),将其与前一时刻的X(n-1)预测值做差值 得到d(n),然后根据当前的量

35、化步长对d(n)进行编码,再用此 sample点的编码值调整量化步长,同时还要得到当前sample点的预测值供下一sample点编码使用。通过此算法可将样点编码成4bit的码流,一个符号位和三个幅度位。该算法较简单,通过查表简化了运算。对于编码后的数据我们采用了wav文件格式,该格式对编码后的数据流进行了包装,由文件头和数据码流组成,文件头中指出了音频数据所采用格式、采样率、比特率、块长度、比特数及声道数等信息。数据码流以块为单位,块头指出了该块起始的预测值和 index值,码流中每byte的高四位和低四位分别对应一个PCM。当前该算法以其简单实用的特点广泛应用到数字音乐盒和数字录音笔中。AD

36、PCM压缩算法 ADPCM(Adaptive Differential Pulse Code Modulation),是一种针对 16bits( 或8bits或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每次采样的 16bit 数据以 4bit 存储,所以压缩比 1:4. 而且压缩/解压缩算法非常简单,所以是一种低空间消耗,高质量高效率声音获得的好途径。保存声音的数据文件后缀名为 .AUD 的大多用ADPCM 压缩。ADPCM 主要是针对连续的波形数据的,保存的是波形的变化情况,以达到描述整个波形的目的,由于它的编码和解码的过程却很简洁,列在后面,相信大家能够看懂。8bit

37、s采样的声音人耳是可以勉强接受的,而 16bit 采样的声音可以算是高音质了。ADPCM 算法却可以将每次采样得到的 16bit 数据压缩到 4bit 。需要注意的是,如果要压缩/解压缩得是立体声信号,采样时,声音信号是放在一起的,需要将两个声道分别处理。ADPCM 压缩过程首先我们认为声音信号都是从零开始的,那么需要初始化两个变量 int index=0,prev_sample=0;下面的循环将依次处理声音数据流,注意其中的 getnextsample() 应该得到一个 16bit 的采样数据,而 outputdata() 可以将计算出来的数据保存起来,程序中用到的 step_table,i

38、ndex_adjust 附在后面:int index=0,prev_sample:=0;while (还有数据要处理)cur_sample=getnextsample();/ 得到当前的采样数据delta=cur_sample-prev_sample;/ 计算出和上一个的增量if (delta<0) delta=-delta,sb=8;/ 取绝对值else sb = 0 ;/ sb 保存的是符号位code = 4*delta / step_tableindex;/ 根据 steptable得到一个 0-7 的值if (code>7) code=7;/ 它描述了声音强度的变化量ind

39、ex += index_adjustcode ;/ 根据声音强度调整下次取steptable 的序号if (index<0) index=0;/ 便于下次得到更精确的变化量的描述else if (index>88) index=88;prev_sample=cur_sample;outputode(code|sb);/ 加上符号位保存起来ADPCM 解压缩过程 接压缩实际是压缩的一个逆过程,同样其中的 getnextcode() 应该得到一个编码,,而 outputsample() 可以将解码出来的声音信号保存起来。这段代码同样使用了同一个的 setp_table 和 index_

40、adjust() 附在后面:int index=0,cur_sample=0;while (还有数据要处理) code=getnextcode();/ 得到下一个数据if (code & 8) != 0) sb=1 else sb=0;code&=7;/ 将 code 分离为数据和符号delta = (step_tableindex*code)/4+step_tableindex/8;/ 后面加的一项是为了减少误差if (sb=1) delta=-delta;cur_sample+=delta; / 计算出当前的波形数据if (cur_sample>32767) outp

41、ut_sample(32767);else if (cur_sample<-32768) output_sample(-32768);else output_sample(cur_sample);index+=index_adjustcode;if (index<0) index=0;if (index>88) index=88;附表 int index_adjust8 = -1,-1,-1,-1,2,4,6,8;int step_table89 = 7,8,9,10,11,12,13,14,16,17,19,21,23,25,28,31,34,37,41,45,50,55,

42、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,4871,5358,5894,6484,7132,7845,8630,9493,10442,11487,12635,13899,15289,16818,18500,20350,22385,24623,27086,

43、29794,32767843*ADPCM(Adaptive Differential Pulse Code Modulation),是一种针对 16bits( 或8bits或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每次采样的 16bit 数据以 4bit 存储,所以压缩比 1:4. 而且压缩/解压缩算法非常简单,所以是一种低空间消耗,高质量高效率声音获得的好途径。保存声音的数据文件后缀名为 .AUD 的大多用ADPCM 压缩。 ADPCM 主要是针对连续的波形数据的,保存的是波形的变化情况,以达到描述整个波形的目的,由于它的编码和解码的过程却很简洁,列在后面,相信大家能够看懂。

44、8bits采样的声音人耳是可以勉强接受的,而 16bit 采样的声音可以算是高音质了。ADPCM 算法却可以将每次采样得到的 16bit 数据压缩到 4bit 。需要注意的是,如果要压缩/解压缩得是立体声信号,采样时,声音信号是放在一起的,需要将两个声道分别处理。 PCM是脉冲编码调制的意思。AD是自适应增量的意思。 严格说来,ADPCM不是压缩方法。他的主要思想是,用差值替代绝对值。举个例子,全班同学平均身高175CM:其中,我的身高170CM,这就是PCM方法;我的身高和平均值相比为-5cm,这就是DPCM,我的身高跟前一位同学相比为-10CM,前一位同学有多高我不知道他多高,你问他,这是

45、ADPCM。比方不是太准确,大概就是这个意思。 在大多数情况下,数据值与平均值相差不大,所以用差值替代绝对值可以节省空间。ADPCM压缩算法 作者:龙林 EMAIL:dragon_hn WEB:www.dragon- ADPCM(Adaptive Differential Pulse Code Modulation),是一种针对 16bits( 或8bits或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每次采样的 16bit 数据以 4bit 存储,所以压缩比 1:4. 而且压缩/解压缩算法非常简单,所以是一种低空间消耗,高质量高效率声音获得的好途径。保存声音的数据文件后缀名为 .A

46、UD 的大多用ADPCM 压缩。ADPCM 主要是针对连续的波形数据的,保存的是波形的变化情况,以达到描述整个波形的目的,由于它的编码和解码的过程却很简洁,列在后面,相信大家能够看懂。8bits采样的声音人耳是可以勉强接受的,而 16bit 采样的声音可以算是高音质了。ADPCM 算法却可以将每次采样得到的 16bit 数据压缩到 4bit 。需要注意的是,如果要压缩/解压缩得是立体声信号,采样时,声音信号是放在一起的,需要将两个声道分别处理。ADPCM 压缩过程首先我们认为声音信号都是从零开始的,那么需要初始化两个变量 int index=0,prev_sample=0;下面的循环将依次处理

47、声音数据流,注意其中的 getnextsample() 应该得到一个 16bit 的采样数据,而 outputdata() 可以将计算出来的数据保存起来,程序中用到的 step_table,index_adjust 附在后面:int index=0,prev_sample:=0;while (还有数据要处理)cur_sample=getnextsample();/ 得到当前的采样数据delta=cur_sample-prev_sample;/ 计算出和上一个的增量if (delta<0) delta=-delta,sb=8;/ 取绝对值else sb = 0 ;/ sb 保存的是符号位c

48、ode = 4*delta / step_tableindex;/ 根据 steptable得到一个 0-7 的值if (code>7) code=7;/ 它描述了声音强度的变化量index += index_adjustcode ;/ 根据声音强度调整下次取steptable 的序号if (index<0) index=0;/ 便于下次得到更精确的变化量的描述else if (index>88) index=88;prev_sample=cur_sample;outputode(code|sb);/ 加上符号位保存起来有关ADPCM压缩过程更详细的信息,参见本站 ADPCM压缩过程演示程序 ADPCM 解压缩过程 接压缩实际是压缩的一个逆过程,同样其中的 getn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论