找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3886|回复: 3
收起左侧

STM32写的频谱仪的代码

[复制链接]
ID:56297 发表于 2017-4-18 10:46 | 显示全部楼层 |阅读模式
STM32写的频谱仪的代码
0.png

全部源码下载:
STM32Spectrum.rar (356.87 KB, 下载次数: 72)



预览:
  1. /************************************************************

  2. **注意事项:系统直接集成TFF文件系统

  3. **版本:V1.0
  4. **日期:09-6-10
  5. *************************************************************/

  6. #include "STM32Lib\\stm32f10x.h"
  7. #include "hal.h"
  8. #include <stdio.h>
  9. #include "TFT\\TFTdriver.h"
  10. #include "fft\\FFTInc.h"

  11. //-------------------------------主程序--------------------------------------------------

  12. unsigned int FFT_N = 128;                        //初始化128点
  13. unsigned int ActualBuf[MAX_FFT_N];        //实部
  14. unsigned int ImagBuf[MAX_FFT_N];        //虚部


  15. unsigned int         FFT_dat_W ;                //-- 数据宽度
  16. unsigned char         Distance ;                 //-- 频谱条间隔距离         
  17. unsigned char         Article_W  ;                //-- 频谱条宽度
  18. unsigned char         DOWN_SP ;             //-- 频谱条跌落速度
  19. unsigned char         DOWN_bit ;            //-- 频谱点跌落速度
  20. unsigned char         MAX_bit_del ;   //-- 频谱点跌维持时间
  21. unsigned int          TFT_FFT_H ;                   //-- 频谱显示区高度
  22. unsigned char         FFT_Bit;
  23. unsigned char         show_sav[MAX_FFT_N/2];  //--频谱条缓存
  24. unsigned int         show_bit[MAX_FFT_N/2];  //--频谱点缓存


  25. void FFT_Show_Init( unsigned int n )
  26. {
  27.         unsigned int i;

  28.         FFT_dat_W = n / 2;                                   //-- 数据宽度
  29.         Distance = 320 / FFT_dat_W ;          //-- 频谱条间隔距离

  30.         switch( n )
  31.         {
  32.                    case 16:
  33.                         Article_W  = Distance - 3;        //--
  34.                         DOWN_SP = 1;                     //--
  35.                         DOWN_bit = 2;                    //--
  36.                         MAX_bit_del = 45;             //--
  37.                         FFT_Bit = 4        ;                   //--        
  38.                            break;
  39.                    case 32:
  40.                         Article_W  = Distance - 2;
  41.                         DOWN_SP = 1  ;   //
  42.                         DOWN_bit = 2 ;   //
  43.                         MAX_bit_del  = 40 ;    //
  44.                         FFT_Bit = 5        ;
  45.                         break;
  46.                 case 64:
  47.                         Article_W  = Distance - 1;
  48.                         DOWN_SP = 1  ;   //
  49.                         DOWN_bit = 2 ;   //
  50.                         MAX_bit_del  = 35 ;    //
  51.                         FFT_Bit = 6        ;
  52.                         break;       
  53.                 case 128:
  54.                         Article_W  = Distance - 1;
  55.                         DOWN_SP = 1  ;   //
  56.                         DOWN_bit = 2 ;   //
  57.                         MAX_bit_del  = 30 ;    //
  58.                         FFT_Bit = 7        ;
  59.                         break;                       
  60.                 case 256:
  61.                         Article_W  = Distance - 1;
  62.                         DOWN_SP = 2  ;   //
  63.                         DOWN_bit = 3 ;   //
  64.                         MAX_bit_del  = 25 ;    //
  65.                         FFT_Bit = 8        ;
  66.                         break;
  67.                 case 512:
  68.                         Article_W  = Distance;
  69.                         DOWN_SP = 3  ;   //
  70.                         DOWN_bit = 4 ;   //
  71.                         MAX_bit_del  = 20 ;    //
  72.                         FFT_Bit = 9        ;
  73.                         break;                                               
  74.         }

  75.         TFT_FFT_H = 239 - DOWN_bit - 1;                   //-- 频谱显示区高度

  76.         for ( i = 0 ;i < MAX_FFT_N / 2;i ++ )
  77.         {
  78.                 show_bit[ i ] = show_sav[ i ] = 0;
  79.         }
  80. }



  81. //--------------???--??---------------//
  82. union{                               
  83.         struct{
  84.                 unsigned        B_dat        :8;                //--
  85.                 unsigned        B_del        :8;                //--               
  86.                 }Bit_bit;
  87.                 unsigned        int        Bit_bits;
  88.         }Bit_dat;                                                        //---       
  89.        
  90.        
  91. void FFT_Show( unsigned int *buf )
  92. {
  93.         int i,j,dat;
  94.        
  95.         for ( i = 1,j = 0;i < FFT_dat_W ;i ++,j += Distance )      //--
  96.         {       
  97.                 Bit_dat.Bit_bits = show_bit[ i ];                          //--

  98.                 TFTRectFill( Bit_dat.Bit_bit.B_dat, j , Bit_dat.Bit_bit.B_dat + DOWN_bit + 1,j + Article_W, BLACK,0);//--擦除无效点
  99.                 TFTRectFill( show_sav[i], j , show_sav[i] + DOWN_bit, j + Article_W, BLACK,0);//--擦除无效频谱条

  100.                 if ( buf[ i ] > TFT_FFT_H ) dat = TFT_FFT_H; //--限制频谱条数据在工作区范围内
  101.                 else
  102.                         dat = buf[i];
  103.         //        buf[i] = 0;                   //--

  104.                 if ( show_sav[i] < dat )  //--有新的频谱条出现
  105.                 {
  106.                         TFTRectFill(show_sav[i],j,dat,j + Article_W,RED_BRIGHT,0);  //-- 先刷差值
  107.                         show_sav[i] = dat;                                                              //-- 再保存新值
  108.                 }       

  109.                 if ( Bit_dat.Bit_bit.B_dat < dat )          //--有新的频谱点出现(不和频谱条一起刷新)
  110.                 {
  111.                         Bit_dat.Bit_bit.B_dat = dat;        //--刷新频谱点
  112.                         Bit_dat.Bit_bit.B_del = MAX_bit_del;        //--频谱点维持时间刷新
  113.                 }       
  114.                 //---- 刷频谱点
  115.                 TFTRectFill(Bit_dat.Bit_bit.B_dat,j,Bit_dat.Bit_bit.B_dat+1,j + Article_W,GREEN,0);
  116.                                
  117.                 if ( show_sav[i] >= DOWN_SP ) show_sav[i] -= DOWN_SP; //频谱条跌落
  118.                 else  show_sav[i] = 0;

  119.                 if ( Bit_dat.Bit_bit.B_del ) Bit_dat.Bit_bit.B_del --;//--频谱点维持
  120.                 else
  121.                         if ( Bit_dat.Bit_bit.B_dat - DOWN_bit > show_sav[i] ) //--防止点跌落超过条
  122.                         {
  123.                                 if ( Bit_dat.Bit_bit.B_dat >= DOWN_bit )
  124.                                         Bit_dat.Bit_bit.B_dat -= DOWN_bit; //频谱点跌落
  125.                                 else   
  126.                                         Bit_dat.Bit_bit.B_dat = 0;
  127.                         }
  128.                         else           //--点跌落到条顶部后,再维持
  129.                                 Bit_dat.Bit_bit.B_del = MAX_bit_del;
  130.                                
  131.                 show_bit[i] = Bit_dat.Bit_bits; //--保存变量
  132.         }
  133. }

  134. unsigned char luv = 0;
  135. extern unsigned int adcread(void);
  136. int main(void)
  137. {
  138.         ChipHalInit();
  139.         ChipOutHalInit();
  140.         Lcd_Init();                                //初始化

  141. FFT_read:         
  142.         TFTFill(0,0,240,320,BG_COLOR);
  143.         FFT_Show_Init( FFT_N );
  144.         Int_FFT_TAB( FFT_N );

  145.         for(;;)
  146.         {
  147.                 int i;
  148.             int del;
  149.                
  150.                 for ( i = 0;i < FFT_N; i++ )
  151.                 {
  152.                         ActualBuf [i]= adcread();         // 音频实部
  153.                         ImagBuf[i] = 0;                                   // 音频虚部
  154.                         del = 520;                                           // 音频采样速率
  155.                         while(del--);
  156.                        
  157.                 }
  158.                 fft( (int *)ActualBuf, (int *)ImagBuf, FFT_Bit, FFT_N );//fft
  159.                
  160.                 //--平滑处理
  161.                 if ( GET_LEFT() )        luv = 1;
  162.                 if ( GET_RIGHT() )        luv = 0;

  163.                 //--FFT点数切换 +
  164.                 if ( GET_UP() )
  165.                 {
  166.                            if ( FFT_N < MAX_FFT_N ) FFT_N <<= 1;
  167.                         else FFT_N = MIN_FFT_N;

  168.                         while( GET_UP() );
  169.                         goto FFT_read;
  170.                 }

  171.                 //--FFT点数切换 -
  172.                 if ( GET_DOWN() )
  173.                 {
  174.                            if ( FFT_N > MIN_FFT_N ) FFT_N >>= 1;

  175.                         while( GET_DOWN() );
  176.                         goto FFT_read;
  177.                 }

  178.                 if ( luv )                //--简单的平滑处理
  179.                 {
  180.                         for ( i = 2;i < FFT_N;i ++ )
  181.                         {
  182.                                 if ( ImagBuf[ i-1 ] > ImagBuf[ i ] ) //-- 前一通道 大于当前通道 ,对当前通道进行提升
  183.                                 {
  184.                                            ImagBuf[ i ] += ( ( ImagBuf[ i-1 ] - ImagBuf[ i ]) >> 1 ) ;       
  185.                                 }
  186.                                 if ( ImagBuf[ i-1 ] < ImagBuf[ i ] ) //-- 当前通道 大于 前一通道,对前一通道进行提升
  187.                                 {
  188.                                         ImagBuf[ i-1 ] += ( ( ImagBuf[ i ] - ImagBuf[ i-1 ] ) >> 1);
  189.                                 }
  190.                         }
  191.                 }          

  192.                 FFT_Show( ImagBuf );       
  193.                                
  194. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


评分

参与人数 1黑币 +4 收起 理由
骆驼驼 + 4 很给力!

查看全部评分

回复

使用道具 举报

ID:95821 发表于 2017-4-19 09:57 | 显示全部楼层
學習了,這資料正好有用
回复

使用道具 举报

ID:264095 发表于 2017-12-20 09:55 | 显示全部楼层
学习了,谢谢楼主分享
回复

使用道具 举报

ID:728801 发表于 2020-4-14 13:55 | 显示全部楼层
正在研究
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表