资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
1 ADPCMAdaptive Differential Pulse Code Modulation自适应差值脉冲编码调制 分 类: 传输与接入 解 释: 一种新型的脉冲编码技术,它是利用自适应技术和差值编码技术相结合的一种编解码技术。可以使 64 kbit/s 的脉冲编码(PCM)信号进一步压缩为 32 kbit/s 的脉冲编码数据。使传输脉冲编码所需要的带宽减少一半,提高了信道的利用效率,并且还可以使脉码调制系统的通信质量得到提高。 ADPCM 的基本原理是利用对过去的几个抽样值来预测当前输入的样值,并使预测电路具有自适应的预测功能与实际检测值进行比较,随时对测得的差值自动进行量化级差的处理,使之始终保持与信号同步变化。这种 ADPCM 技术已广泛地应用于电话通信网。IMA-ADPCM (ADPCM Adaptive Differential Pulse Code Modulation), 是一种针对 16bit 声音波形数据的一种有损压缩算法, 它将声音流中每次采样的 16bit 数据以 4bit 存储, 所以压缩比 1:4. 而压缩/解压缩算法非常的简单, 所以是一种低空间消耗,高质量声音获得的好途径. 著名的 WestWood 在它的许多游戏里都使用了这个技术, DUNE II, C 另一是 MIDI 类的, 它是将各种乐器的声学性质都事先记录下来, 而数据流中仍旧是按一定频率记 录, 但不是每秒数千上万次了, 大约只有几 Hz 到几十 Hz, 将几种乐器按某一音频和强度 触发描述下来, 经过声卡合成为波形信号就可以播放了. 8bit 采样的声音人耳是可以接受的, 比如 Win95 启动的音乐, 而 16bit 采样的声音 可以算是高音质了, 现代游戏中也多采用它. (将声音强度分的更细没有太多的意义, 通常 都是提高采样频率来近一步提高音质) ADPCM 算法却可以将每次采样得到的 16bit 数据压 缩到 4bit ;-) 需要注意的是, 如果要压缩/接压缩立体声信号, 请注意采样时, 声音信号 是放在一起的, 需要将两个声道分别处理. OK, 下面列出了其中的奥妙, 请细细品味: IMA-ADPCMIMA-ADPCM 压缩过程压缩过程 首先我们认为声音信号都是从零开始的,那么需要初始化两个变量 int index=0,prev_sample:=0; 下面的循环将依次处理声音数据流, 注意其中的 getnextsample() 应该得到一个 16bit 的采 样数据, 而 outputdata() 可以将计算出来的数据保存起来,程序中用到的 step_table, index_adjust 附在后面: int index=0,prev_sample:=0;while (还有数据要处理) cur_sample=getnextsample(); / 得到当前的采样数据delta=cur_sample-prev_sample; / 计算出和上一个的增量if (delta7) code=7; / 它描述了声音强度的变化量index+=index_adjustcode; / 根据声音强度调整下次取 steptable 的 序号if (index88) index=88;prev_sample=cur_sample;outputode(code|sb); / 加上符号位保存起来IMA-ADPCMIMA-ADPCM 解压缩过程解压缩过程 1 接压缩实际是压缩的一个逆过程, 同样其中的 getnextcode() 应该得到一个编码, 而 outputsample() 可以将解码出来的声音信号保存起来. 这段代码同样使用了同一个的 setp_table 和 index_adjust() 附在后面: int index=0,cur_sample:=0;while (还有数据要处理) code=getnextcode(); / 得到下一个数据if (code code / 将 code 分离为数据和符号delta=(step_tableindex*code) /4 + step_tableindex / 8;/ 后面加的一项是为了减少误差 if (sb=1) delta=-delta;cur_Sample+=delta; / 计算出当前的波形数据if (cur_sample32767) cur_sample=32767;else if (cur_sample88) 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, 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, 29794, 32767 ; 关于 WestWood 的 .AUD 文件,结构比较简单, 这里顺带提一下, 有兴趣可以自己写 处理 AUD 文件的程序 ;-) 其 8bit 的声音压缩算法尚不知晓, 但用的最广泛的 16bit 声音 正是用 IMA-ADPCM 压缩, 每个 AUD 文件都有一个文件头, 结构如下:1 struct unsigned short int samplespersec; / 频率long int size; / 除掉文件头的大小long int outsize; / 输出数据大小 (通常是 4 倍)unsigned char flags; / 位 0 描述是否立体声, 位 1 描述是否 16 bitunsigned char type; / 1=WW 压缩, 99=IMA ADPCM AUD 文件的声音信号是按块存放的, 每块大约 512 字节, 没一块都有一个块头结构:struct unsigned short int size; / 压缩过的数据大小unsigned short int outsize; / 输出数据大小 (通常是 4 倍)long int id; / 永远是 0x0000DEAF
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号