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条回答
lijinen
1楼-- · 2020-01-21 14:41
 精彩回答 2  元偷偷看……
myhonour
2楼-- · 2020-01-21 19:29

研究一番,3Q
weixinal
3楼-- · 2020-01-21 21:50
为什么非得8bit的,既然都是压缩到4bit那就用16bit的嘛,pwm的位数是多少?几个通道?尽量发挥出来
avr-qq
4楼-- · 2020-01-22 02:14
怎么 AdPCM 又开始热起来啦
478288847@qq.co
5楼-- · 2020-01-22 06:31
下载下来 研究一下

一周热门 更多>