原创 MP3音频频谱显示的实现_模拟^_^

2010-4-24 23:38 2363 3 3 分类: 软件与OS

关于获取音频频谱,是需要经过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;
  }


.........

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条