关于获取音频频谱,是需要经过FFT变化才能得到各频谱的分量真实的幅度值的。类似千千静听那样的频谱显示。然而进行FFT变换需要一定的RAM资源和MCU的速度够快才能处理大量的数据。对普通MCU来说真是望洋兴叹了,无可奈何。由于对频谱显示有点兴趣,所以做了一个模拟千千静听那样显示的频谱(本次只是做8段,千千静听显示的是14段),频谱是取随机值的来模拟的,所以得到的只是模拟的频谱,如果需要真实的频谱,那得另外挂个协处理器来处理FFT数据了。
如图所示:
从图中可以看出,显示的频谱是随着MP3的音乐跳动的(这次模拟是带有MP3播放器功能的,可以播放音乐)。如果频谱是真实的数值(也就是音频信号经过FFT变换后获取频谱分量的模值),然后经过一定的量化和处理,,即可得到类似千千静听的那样的效果了。
关于这次显示频谱段的代码,其实很简单。下面贴出来,作个交流吧。 ^_^
==========================================
.........
for (ii=0; ii<8;ii++)//8段频谱段显示
{
if (FREQ[ii]==0) FREQ[ii]=1;
if (FREQ[ii]>32) FREQ[ii]=32;
dif="32-FREQ"[ii];
Cnt="0";
y="tmp";
if (dif>0)
{
while(dif>0) //6点宽为一频谱段
{
for (len=0;len<6;len++) DrawDotsINT(x+len,y+Cnt,0);
Cnt++;
dif--;
}
}
if (LastFREQ[ii]>0) //补画坠落点
{
for (len=0;len<6;len++) DrawDotsINT(x+len,y+LastFREQ[ii],1);
LastFREQ[ii]-=1;
}
if (FREQ[ii]>0)
{
LastFREQ[ii]=Cnt; //保存初始坠落点
while(FREQ[ii]>0)
{
for (len=0;len<6;len++)
DrawDotsINT(x+len,y+Cnt,1);
Cnt++;
FREQ[ii]--;
}
}
x+=7;
}
.........
tengjingshu_112148725 2010-4-11 01:25