最近工作上要做一个语音系统,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)
研究一番,3Q
一周热门 更多>