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)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。