找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3298|回复: 2
收起左侧

Matlab源码:单片机播放语音的ADPCM编解码在STC15F上实现

[复制链接]
ID:294362 发表于 2018-3-20 09:54 | 显示全部楼层 |阅读模式
最近做了个关于单片机播放语音的ADPCM编解码在STC15F408上实现,
ADPCM编码子程序,可直接移植使用,已经测试OK。

0.png

Matlab源程序如下:
  1. function adpcm_y = adpcm_encoder(raw_y)

  2. % ADPCM编码子程序
  3. % Edit by L7


  4. IndexTable = [-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8];
  5.          
  6. 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, 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];

  7. prevsample = 0;
  8. previndex = 1;

  9. Ns = length(raw_y);
  10. n = 1;

  11. raw_y = 32767 * raw_y;          % 16-bit operation

  12. while (n <= Ns)
  13.     predsample = prevsample;
  14.     index = previndex;
  15.     step = StepSizeTable(index);

  16.     diff = raw_y(n) - predsample;
  17.     if (diff >= 0)
  18.         code = 0;
  19.     else
  20.         code = 8;
  21.         diff = -diff;
  22.     end

  23.     tempstep = step;
  24.     if (diff >= tempstep)
  25.         code = bitor(code, 4);
  26.         diff = diff - tempstep;
  27.     end
  28.     tempstep = bitshift(tempstep, -1);
  29.     if (diff >= tempstep)
  30.         code = bitor(code, 2);
  31.         diff = diff - tempstep;
  32.     end
  33.     tempstep = bitshift(tempstep, -1);
  34.     if (diff >= tempstep)
  35.         code = bitor(code, 1);
  36.     end

  37.     diffq = bitshift(step, -3);
  38.     if (bitand(code, 4))
  39.         diffq = diffq + step;
  40.     end
  41.     if (bitand(code, 2))
  42.         diffq = diffq + bitshift(step, -1);
  43.     end
  44.     if (bitand(code, 1))
  45.         diffq = diffq + bitshift(step, -2);
  46.     end

  47.     if (bitand(code, 8))
  48.         predsample = predsample - diffq;
  49.     else
  50.         predsample = predsample + diffq;
  51.     end

  52.     if (predsample > 32767)
  53.         predsample = 32767;
  54.     elseif (predsample < -32768)
  55.         predsample = -32768;
  56.     end

  57.     index = index + IndexTable(code+1);

  58.     if (index < 1)
  59.         index = 1;
  60.     end
  61.     if (index > 89)
  62.         index = 89;
  63.     end

  64.     prevsample = predsample;
  65.     previndex = index;

  66.     adpcm_y(n) = bitand(code, 15);
  67.     %adpcm_y(n) = code;
  68.     n = n + 1;
  69. end
复制代码

所有资料51hei提供下载:
ADPCM.rar (409.27 KB, 下载次数: 33)

评分

参与人数 3黑币 +5 收起 理由
jellypejic + 1 绝世好帖!
supernovadada + 3 共享资料的黑币奖励!
nilsqc + 1

查看全部评分

回复

使用道具 举报

ID:3666 发表于 2022-7-9 12:10 | 显示全部楼层
这个程序是什么意思呀, 没有明白
回复

使用道具 举报

ID:1024371 发表于 2022-7-9 13:16 | 显示全部楼层
没有注释的程序真的很难看,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表