本帖最后由 wicy001 于 2012-4-28 13:45 编辑
利用STC90C516RD+实现PWM输出WAV格式的音频,这是一个非常简单的程序
说明:1.此单片机没有集成PWM,需要使用定时器实现
2.播放wav音频的格式为8bit,8Khz 单声道,大小<60K,放在程序存储器中。
3.晶振需要 8Khz*(2^8bit)*12T=24.576Mhz,如果烧写使用6T方式,晶振可减半。
4.端口接耳机,耳机另一端接+5V,这样声音听着会大一些。
问题:
输出有噪音,噪音非常尖锐,而且声音很大,比声音信号要大。请各位大侠看看,问题出在哪,应该怎么解决?
-----------
声音尖锐,频率应该很高,试着加一个RC低通,但效果不明显。
---------------为方便大家快速阅读,将帖子相关内容整理如下-------------
图1:RC电路
图2:经过RC电路仿真波形
【如何去掉图中的尖刺?】
图3:未经RC电路前端口的仿真波形 【斜坡受RC影响,正常。如果不加RC电路,输出是平的】
/*************************程序****************************/
#include <reg52.h> //MCU为STC89/STC90
#include "sound.h" //wav格式数据
sbit BEEP = P0^0; //耳机一端接在P0.0脚上,一端接+5V
unsigned int counter,wavedataL;
unsigned char currentdata,nextdata,i;
void sys_start()
{
TMOD|= 0x02; //T0,自动重装模式
TH0 = currentdata;
TL0 = currentdata;
ET0 = 1;
EA = 1;
TR0 = 1;
BEEP=0;
}
main()
{
unsigned int tmp;
tmp=sound[0x29]; //从wav文件中取,数据长度。数据长度应该是4个字节,
tmp=tmp<<8;
wavedataL=tmp+sound[0x28]; //由于wav存在片内flash中,文件大小有限制,数据长度用int型足够表示了。
counter=0x2c; //wav文件第一个数据
currentdata=sound[counter];
nextdata=sound[counter];
//以上数字请参考wav格式说明
sys_start();
while(1)
{
if(counter>wavedataL) //反复重播
{
counter=0x2c;
}
if(BEEP) TH0=0xFF-currentdata;
else TH0=currentdata;
}
}
/*************************************/
void Timer0int(void) interrupt 1 //定时器0中断
{
BEEP=~BEEP;
if(BEEP)
{
counter++;
nextdata=sound[counter];
}
else
currentdata=nextdata;
}
1.低通滤波的参数,阻容值怎么确定
2.当PWM很高,比如44K以上了,2个相邻的音差距较大的时候,RC会不会使音频失真?
3.WAV的值是8位还是16位的,如果是8位的那么用16位的PWM就得传给高8位寄存器了
4.一个44K的WAV文件,用44K的PWM,是不是取一个WAV的值进行一次PWM转换,再取下一个进行一次转换。每个值只转换一次?
如果用88K的PWM进行2次输出会不会音质好点?
1.低通滤波器的参数:
通常人声和乐器的频率在4kH以内(我查的最高是女高音为3.6Khz),截止频率可以设为f=4K=1/(2πRC)
R取值1-10K之间,计算出C的值。
RC网络本身就不是精准的网络,不必强求RC的值,从音效上,听不出多大的差别。
其实只要不是直流,各个频率经过RC时,幅度都会有衰减。在截止频率时,幅度衰减到原来的0.7而已。
2.这种RC肯定有失真的。RC的作用主要是DA变换,顺便过滤一部分杂音。
3.可以看WAV文件格式标准,有8位wav和16位wav。无论那种,WAV的数据都是以字节的形式存储的,16Bit是低字节在前,高字节在后。
4.PWM的频率越高过滤的效果越好,但是44K与88K的效果差别多少,没做过实验,就不知道了。
我个人分析:如果截止频率设在4K,一般情况PWM超16K以后的效果可能就不是很明显了。再加上人耳接收频率最大20K,所以44K足够了。
音频信号是一段模拟信号(包含音高,节拍),对这段音频采样就可以得到数字信号。
如果以8KHz的频率,8位的精度(256种电压)采样后,按照wav的格式存储起来,就是我们平时播放的wav文件了。
我们知道采样频率越快,采样精度越高,那么文件的音质就越好。当频率和精度达到一定程度时,人耳就分辨不出来了。
44khz,16位精度已经达到CD的音质了,基本上也就可以了。
我们用PWM播放文件,就是按照采样的频率,采样的精度将数字文件还原成模拟音频。
所以在播放时,你不需要考虑节拍,音高的问题。
我们所说的高音,就是模拟音频的高音。
一周热门 更多>