C8051F330 播放WAV ADPCM

2020-01-20 19:03发布

最近工作上要做一个语音系统,PWM方式,由于还没有样板,于是自己先用万用板做了个小测试板,用的C8051F330单片机,嘿嘿,用SD卡存储WAV文件,还带FAT32文件系统,当然是简单的,但能查找到文件并判断出结束簇就可以了,不然RAM不够用。
试了下,播放44.1KHz的音频还可以。
但后来想加入ADPCM压缩,好不容易找了点8Bit的资料(网上都是16bit),结果发现杂音很大,所以想请了解这方面的朋友支个招,帮看看是哪里的问题

#include "includes.h"

INT16S valpred; // 上一个数据
INT8U sign;     // 差值符号
   
INT8S index_pcm = 0x7F;  
INT8U vpdiff;
INT8U step = 0;

#define Maxindex 21

code INT8S stepTable[22]={2,3,4,6,8,10,13,16,19,23,27,32,37,43,50,58,67,77,88,100,113,127};//step表
code INT8S indexTable[8] = {-1, -1, -1, -1, 2, 4, 6, 8};

INT8U ADPCM_Decoder(INT8S snd_i, INT8S dat)
{      
    INT8S delta;    //

    if(snd_i == 0)              // 偶数个码
        delta = dat >> 4;       // 在高四位取ADPCM编码
     else
        delta = dat & 0x0F;     // 在低四位取ADPCM编码      
  
    index_pcm += indexTable[delta];
    if(index_pcm < 0)
        index_pcm = 0;
    else if(index_pcm > Maxindex)
        index_pcm = Maxindex;

    sign  = delta & 8;
    delta = delta & 7;

    vpdiff = (step >> 3);
    if(delta & 4)vpdiff += step;
    if(delta & 2)vpdiff += (step >> 1);
    if(delta & 1)vpdiff += (step >> 2);

    if(sign)
        valpred -= vpdiff;
    else
        valpred += vpdiff;

    if(valpred > 255)
        valpred = 255;
    else if(valpred < 0)
        valpred = 0;

    step = stepTable[index_pcm];

    return valpred;
}
这段是8bit 8:4压缩的ADPCM解压程序,有很大杂音,但也能听清歌曲,可能是两个数据表的问题,但我不是了解这方面,望大家帮帮忙
完整的程序包在这,是带ADPCM的,有杂音,想不做ADPCM的朋友只要把DA中断中装值改下就可以了,用的4bit压缩方式,读SD卡中一个字节解压成两个音频数据,不加ADPCM就是直接把SD中数据送DA
点击此处下载 ourdev_606808V1MUOF.rar(文件大小:91K) (原文件名:4.DAC Audio 4Bit ADPCM.rar)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
amazing030
1楼-- · 2020-01-20 23:25
测试板做的很好看,但没相机,只能过几天借一个拍一下,电路都是最简单的,硬件SPI方式读取SD卡,一路DA用LM358做电压跟随驱动小喇叭,有人需要的话我就找时间画一下,因为我也是一步一步焊的,另外这个FAT32系统是我剪裁的,只支持8字节短文件名,不够8字节也得用空格补齐,而且只支持DBR为0扇区的SD卡,一般的小SD卡是这样的吧,我用的是512M的。这也是没办法,F330768的RAM,勉强能用了
90999
2楼-- · 2020-01-21 01:53
 精彩回答 2  元偷偷看……
90999
3楼-- · 2020-01-21 03:20
这个或许对你有用:
http://wenku.baidu.com/view/c815ed68a98271fe910ef925.html
suebillt
4楼-- · 2020-01-21 04:31
有电路图,或仿真吗
lxliang09
5楼-- · 2020-01-21 08:47
mark
fnems
6楼-- · 2020-01-21 13:43
ADPCM,个人感觉适合对高采样精度的码流进行压缩。

比如每个样本16bit,经过ADPCM之后能达到4bit,压缩率是 25%,算是很出 {MOD}的了。

但是用来对8bit的码流进行编码,想达到同样压缩率
(8bit × 25% = 2bit,但其中符号位是必须的,这样有效幅值位只有1bit)是不可能的。
LZ的代码中也是把8bit压缩到了4bit。

自己最近也在想着方面的实现方法,貌似CELP不错,
SPEEX库就是用了这个算法,不过还没看懂……

一周热门 更多>