自适应差值脉冲编码调制adpcm介绍

上传人:子 文档编号:45963778 上传时间:2018-06-20 格式:DOC 页数:4 大小:39.50KB
返回 下载 相关 举报
自适应差值脉冲编码调制adpcm介绍_第1页
第1页 / 共4页
自适应差值脉冲编码调制adpcm介绍_第2页
第2页 / 共4页
自适应差值脉冲编码调制adpcm介绍_第3页
第3页 / 共4页
自适应差值脉冲编码调制adpcm介绍_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《自适应差值脉冲编码调制adpcm介绍》由会员分享,可在线阅读,更多相关《自适应差值脉冲编码调制adpcm介绍(4页珍藏版)》请在金锄头文库上搜索。

1、 1 ADPCMAdaptive Differential Pulse Code Modulation自适应差值脉冲编码调制 分 类: 传输与接入 解 释: 一种新型的脉冲编码技术,它是利用自适应技术和差值编码技术相结合的一种编解码技术。可以使 64 kbit/s 的脉冲编码(PCM)信号进一步压缩为 32 kbit/s 的脉冲编码数据。使传输脉冲编码所需要的带宽减少一半,提高了信道的利用效率,并且还可以使脉码调制系统的通信质量得到提高。 ADPCM 的基本原理是利用对过去的几个抽样值来预测当前输入的样值,并使预测电路具有自适应的预测功能与实际检测值进行比较,随时对测得的差值自动进行量化级差的

2、处理,使之始终保持与信号同步变化。这种 ADPCM 技术已广泛地应用于电话通信网。IMA-ADPCM (ADPCM Adaptive Differential Pulse Code Modulation), 是一种针对 16bit 声音波形数据的一种有损压缩算法, 它将声音流中每次采样的 16bit 数据以 4bit 存储, 所以压缩比 1:4. 而压缩/解压缩算法非常的简单, 所以是一种低空间消耗,高质量声音获得的好途径. 著名的 WestWood 在它的许多游戏里都使用了这个技术, DUNE II, C 另一是 MIDI 类的, 它是将各种乐器的声学性质都事先记录下来, 而数据流中仍旧是按

3、一定频率记 录, 但不是每秒数千上万次了, 大约只有几 Hz 到几十 Hz, 将几种乐器按某一音频和强度 触发描述下来, 经过声卡合成为波形信号就可以播放了. 8bit 采样的声音人耳是可以接受的, 比如 Win95 启动的音乐, 而 16bit 采样的声音 可以算是高音质了, 现代游戏中也多采用它. (将声音强度分的更细没有太多的意义, 通常 都是提高采样频率来近一步提高音质) ADPCM 算法却可以将每次采样得到的 16bit 数据压 缩到 4bit ;-) 需要注意的是, 如果要压缩/接压缩立体声信号, 请注意采样时, 声音信号 是放在一起的, 需要将两个声道分别处理. OK, 下面列出

4、了其中的奥妙, 请细细品味: 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();

5、/ 得到当前的采样数据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() 应该得到一个编码, 而 outp

6、utsample() 可以将解码出来的声音信号保存起来. 这段代码同样使用了同一个的 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; / 计算出当前的波

7、形数据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

8、, 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

9、 ; 关于 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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号