找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5041|回复: 16
打印 上一主题 下一主题
收起左侧

FFT-LED算法led频谱显示

  [复制链接]
跳转到指定楼层
楼主
ID:95540 发表于 2015-11-12 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FFT-LED算法led频谱显示,抄自网路
  1. //电脑音量推荐设置为40%,手机及MP4等要高一些
  2. #include <STC12C5A60S2.h>
  3. #include<intrins.h>

  4. /********************************************************************/
  5. #define SAMPLE_NUM 128
  6. #define LOG 6
  7. #define TIME 2048           //中断
  8. #define FFT_OUT_MIN 0
  9. #define FFT_OUT_MAX        7       
  10. #define OFF L1=L2=L3=L4=L5=L6=L7=L8=L9=L10=L11=L12=L13=L14=L15=L16=L17=L18=L19=L20=L21=L22=L23=L24=1;
  11. #define ADC_POWER   0x80            //ADC power control bit
  12. #define ADC_FLAG    0x10            //ADC complete flag
  13. #define ADC_START   0x08            //ADC start control bit
  14. //#define ADC_SPEEDLL 0x00            //420 clocks
  15. //#define ADC_SPEEDL  0x20            //280 clocks
  16. #define ADC_SPEEDH  0x40            //140 clocks
  17. //#define ADC_SPEEDHH 0x60            //70 clocks

  18. /********************************************************************/
  19. //采样存储序列表
  20. unsigned char code BRTable[SAMPLE_NUM] ={0, 64, 32, 96, 16, 80, 48, 112,
  21. 8, 72, 40, 104, 24, 88, 56, 120,
  22. 4, 68, 36, 100, 20, 84, 52, 116,
  23. 12, 76, 44, 108, 28, 92, 60, 124,
  24. 2, 66, 34, 98, 18, 82, 50, 114,
  25. 10, 74, 42, 106, 26, 90, 58, 122,
  26. 6, 70, 38, 102, 22, 86, 54, 118,
  27. 14, 78, 46, 110, 30, 94, 62, 126,
  28. 1, 65, 33, 97, 17, 81, 49, 113,
  29. 9, 73, 41, 105, 25, 89, 57, 121,
  30. 5, 69, 37, 101, 21, 85, 53, 117,
  31. 13, 77, 45, 109, 29, 93, 61, 125,
  32. 3, 67, 35, 99, 19, 83, 51, 115,
  33. 11, 75, 43, 107, 27, 91, 59, 123,
  34. 7, 71, 39, 103, 23, 87, 55, 119,
  35. 15, 79, 47, 111, 31, 95, 63, 127};
  36. char code sin_tabb[SAMPLE_NUM] = {0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102,

  37. 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112,

  38. 108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30,

  39. -36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121,

  40. -123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102,

  41. -98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6};                        
  42. char code cos_tabb[SAMPLE_NUM] = {127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94,

  43. 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59,

  44. -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -

  45. 126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80,

  46. -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70,

  47. 75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126};
  48. xdata unsigned char result[128];
  49. xdata unsigned char temp[128];
  50. xdata unsigned char num[128];
  51. unsigned char anum,timernum,timernum2,lednum3,Ltime,t;//用于分离
  52. unsigned char lednum[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制
  53. int xdata FftReal[SAMPLE_NUM];
  54. int xdata FftImage[SAMPLE_NUM];

  55. unsigned char code musicdisplay[]={
  56.         0x00,0x00,
  57.         0xFE,0x40,0x30,0x40,0xFE,0x00, // -M-
  58.         0xFC,0x02,0x02,0x02,0xFC,0x00, // -U-
  59.         0x64,0x92,0x92,0x92,0x4C,0x00, // -S-
  60.         0x00,0x82,0xFE,0x82,0x00,0x00, // -I-
  61.         0x7C,0x82,0x82,0x82,0x44,0x00, // -C-
  62.         0x00,0x00,0x00,
  63.         0xFE,0x82,0x82,0x82,0x7C,0x00, // -D-
  64.         0x00,0x82,0xFE,0x82,0x00,0x00, // -I-
  65.         0x64,0x92,0x92,0x92,0x4C,0x00, // -S-
  66.         0xFE,0x90,0x90,0x90,0x60,0x00, // -P-
  67.         0xFE,0x02,0x02,0x02,0x02,0x00, // -L-
  68.         0x3E,0x48,0x88,0x48,0x3E,0x00, // -A-
  69.         0xC0,0x20,0x1E,0x20,0xC0,0x00, // -Y-
  70.         0x00,0x00,0x00,0x00,0x00,0x00,
  71.         0x00,0x00,0x00,0x00,0x00,0x00,
  72.         0x00,0x00,0x00,0x00,0x00,0x00,
  73.         0x00,0x00,0x00,0x00,0x00,0x00,
  74.         0x00,0x00,0x00,0x00,0x00,0x00};
  75. /********************************************************************/
  76. #define LED P2
  77. #define pwm 9

  78. sbit L24=P3^2;
  79. sbit L23=P3^1;
  80. sbit L22=P3^0;
  81. sbit L21=P4^7;
  82. sbit L20=P1^7;
  83. sbit L19=P1^6;
  84. sbit L18=P1^5;
  85. sbit L17=P1^4;
  86. sbit L16=P3^3;
  87. sbit L15=P3^4;
  88. sbit L14=P3^5;
  89. sbit L13=P3^6;
  90. sbit L12=P3^7;
  91. sbit L11=P0^2;
  92. sbit L10=P0^1;
  93. sbit L9=P0^0;
  94. sbit L8=P0^3;
  95. sbit L7=P0^4;
  96. sbit L6=P0^5;
  97. sbit L5=P0^6;
  98. sbit L4=P0^7;
  99. sbit L3=P4^6;
  100. sbit L2=P4^5;
  101. sbit L1=P4^4;
  102. /********************************************************************/
  103. void delay(unsigned char a)
  104. {
  105.         unsigned int i;
  106.         while(--a)
  107.                 for(i=0;i<50;i++);                                    
  108. }
  109. /********************************************************************/
  110. void off()
  111. {
  112.         LED = 0x00;
  113.         OFF
  114. //        delay(10-pwm);
  115. }
  116. /********************************************************************/
  117. void display(unsigned char i,unsigned char dat)
  118. {
  119.         P2=dat;
  120.         switch(i)
  121.         {
  122.                 case 1:L1=0;break;
  123.                 case 2:L2=0;break;
  124.                 case 3:L3=0;break;
  125.                 case 4:L4=0;break;
  126.                 case 5:L5=0;break;
  127.                 case 6:L6=0;break;
  128.                 case 7:L7=0;break;
  129.                 case 8:L8=0;break;
  130.                 case 9:L9=0;break;
  131.                 case 10:L10=0;break;
  132.                 case 11:L11=0;break;
  133.                 case 12:L12=0;break;
  134.                 case 13:L13=0;break;
  135.                 case 14:L14=0;break;
  136.                 case 15:L15=0;break;
  137.                 case 16:L16=0;break;
  138.                 case 17:L17=0;break;
  139.                 case 18:L18=0;break;
  140.                 case 19:L19=0;break;
  141.                 case 20:L20=0;break;
  142.                 case 21:L21=0;break;
  143.                 case 22:L22=0;break;
  144.                 case 23:L23=0;break;
  145.                 case 24:L24=0;break;
  146.         }
  147.         delay(pwm);
  148.         off();
  149. }
  150. /********************************************************************/
  151. void show_musicdisplay()
  152. {
  153.         unsigned char a,b,c;
  154.         for(c=0;c<80;c++)
  155.                 for(b=12;b>0;b--)
  156.                            for(a=1;a<25;a++)
  157.                                 display(a,musicdisplay[a-1+c]);
  158. }
  159. /********************************************************************/            
  160. void FFT_process()                          //下落迟滞
  161. {
  162.         unsigned char i;
  163.         for(i=0;i<24;i++)
  164.         {       
  165.                 if(result[i] < temp[i])
  166.                 {
  167.                         num[i]++;
  168.                         if(num[i] == 1)
  169.                         {
  170.                                 if(temp[0]==0&&temp[1]==0&&temp[2]==0&&temp[3]==0&&temp[4]==0&&temp[5]==0&&temp[6]==0&&temp[7]==0&&temp[8]==0&&temp[9]==0&&temp[10]==0&&temp[11]==0&&temp[12]==0&&temp[13]==0&&temp[14]==0&&temp[15]==0&&temp[16]==0&&temp[17]==0&&temp[18]==0&&temp[19]==0&&temp[20]==0&&temp[21]==0&&temp[22]==0&&temp[23]==0&&temp[24]==0);
  171.                                 else
  172.                                 {
  173.                                         result[i] = --temp[i];
  174.                                         num[i] = 0;
  175.                                 }
  176.                         }
  177.                 }
  178.                 else
  179.                         num[i] = 0;               
  180.         }
  181. }
  182. /********************************************************************/
  183. void disp()
  184. {
  185. //        unsigned char i,j,buff;
  186.         timernum++;
  187.         if(timernum == 25)
  188.                 timernum = 1;
  189.            OFF
  190.         FFT_process();
  191.         /*for(i=0;i<16;i++)
  192.                 for(j=i+1;j<16;j++)
  193.                         if(result[j] > result[i])
  194.                         {
  195.                                 buff = result[i];
  196.                                 result[i] = result[j];
  197.                                 result[j] = buff;
  198.                         }*/                                          
  199.         switch(timernum)
  200.         {
  201.                 case 1:anum = result[0];L1=0;break;
  202.                 case 2:anum = result[1];L2=0;break;
  203.                 case 3:anum = result[2];L3=0;break;
  204.                 case 4:anum = result[3];L4=0;break;
  205.                 case 5:anum = result[4];L5=0;break;
  206.                 case 6:anum = result[5];L6=0;break;
  207.                 case 7:anum = result[6];L7=0;break;
  208.                 case 8:anum = result[7];L8=0;break;
  209.                 case 9:anum = result[8];L9=0;break;
  210.                 case 10:anum = result[9];L10=0;break;
  211.                 case 11:anum = result[10];L11=0;break;
  212.                 case 12:anum = result[11];L12=0;break;
  213.                 case 13:anum = result[12];L13=0;break;
  214.                 case 14:anum = result[13];L14=0;break;
  215.                 case 15:anum = result[14];L15=0;break;
  216.                 case 16:anum = result[15];L16=0;break;
  217.                 case 17:anum = result[16];L17=0;break;
  218.                 case 18:anum = result[17];L18=0;break;
  219.                 case 19:anum = result[18];L19=0;break;
  220.                 case 20:anum = result[19];L20=0;break;
  221.                 case 21:anum = result[20];L21=0;break;
  222.                 case 22:anum = result[21];L22=0;break;
  223.                 case 23:anum = result[22];L23=0;break;
  224.                 case 24:anum = result[23];L24=0;break;
  225.         }
  226.         if(anum >= 8)
  227.                 anum = FFT_OUT_MAX;
  228.         LED = lednum[anum];
  229. }
  230. /********************************************************************/
  231. void ADC_init()
  232. {
  233.         P1ASF = 0x01;                   //Open 8 channels ADC function
  234.     ADC_RES = 0;                    //Clear previous result
  235.         ADC_RESL= 0;
  236.     ADC_CONTR = ADC_POWER | ADC_SPEEDH;
  237.     delay(5);                       //ADC power-on and delay      
  238. }
  239. /********************************************************************/
  240. float ADC_read()
  241. {
  242. //delay(10);       
  243.     ADC_CONTR = ADC_POWER | ADC_SPEEDH  | ADC_START;
  244.     _nop_();                        //至少要延时4个时钟周期
  245.     _nop_();
  246.     _nop_();
  247.     _nop_();
  248.         _nop_();
  249.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  250.     ADC_CONTR &= ~ADC_FLAG;         //关闭ADC
  251.     return (ADC_RES*4+ADC_RESL);                 //Return ADC result
  252. }
  253. /********************************************************************/
  254. short sqrt_16(unsigned long M)   
  255. {
  256.     unsigned int N,i;
  257.     unsigned long tmp,ttp;
  258.     if( M == 0 )            
  259.         return 0;   
  260.     N = 0;  
  261.     tmp = (M >> 30);        
  262.     M <<= 2;
  263.     if( tmp > 1 )            
  264.     {
  265.         N++;               
  266.         tmp -= N;
  267.     }   
  268.     for( i=15; i>0; i-- )   
  269.     {
  270.         N <<= 1;                  
  271.         tmp <<= 2;
  272.         tmp += (M >> 30);         
  273.         ttp = N;
  274.         ttp = (ttp<<1)+1;        
  275.         M <<= 2;
  276.         if( tmp >= ttp )   
  277.         {
  278.             tmp -= ttp;
  279.             N ++;
  280.         }      
  281.     }   
  282.     return N;
  283. }
  284. /********************************************************************/
  285. void FFT()
  286. {
  287.     register unsigned char i,bb,j,k,p;
  288.     register short TR,TI,temp;
  289.     unsigned long ulReal,ulImage;                             
  290.         unsigned char max;
  291.                                                                   
  292.     for(i=0;i<SAMPLE_NUM;i++)         
  293.     {
  294.                 FftReal[BRTable[i]] = ADC_read();
  295.         FftImage[i] = 0;
  296.     }        

  297.     for(i=1;i<=LOG;i++)                        
  298.     {
  299.         bb=1;
  300.         bb <<= (i-1);                                      
  301.         for(j=0;j<=bb-1;j++)                           
  302.         {
  303.             p=1;
  304.             p <<= (LOG-i);           
  305.             p = p*j;
  306.             for(k=j;k<SAMPLE_NUM;k=k+2*bb)               
  307.             {
  308.                 TR=FftReal[k];TI=FftImage[k];temp=FftReal[k+bb];
  309.                 FftReal[k]=FftReal[k]+((FftReal[k+bb]*cos_tabb[p])>>7)+((FftImage[k+bb]*sin_tabb[p])>>7);
  310.                 FftImage[k]=FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7)+((FftImage[k+bb]*cos_tabb[p])>>7);
  311.                 FftReal[k+bb]=TR-((FftReal[k+bb]*cos_tabb[p])>>7)-((FftImage[k+bb]*sin_tabb[p])>>7);
  312.                 FftImage[k+bb]=TI+((temp*sin_tabb[p])>>7)-((FftImage[k+bb]*cos_tabb[p])>>7);
  313.                
  314.                 FftReal[k] >>= 1;            
  315.                 FftImage[k] >>= 1;
  316.                 FftReal[k+bb] >>= 1;                 
  317.                 FftImage[k+bb] >>= 1;                                                                              
  318.             }  
  319.         }
  320.     }

  321.    for(i=0;i<24;i++)
  322.     {  
  323.         ulReal = FftReal[i+1];
  324.         ulReal *= ulReal;
  325.         ulImage = FftImage[i+1];
  326.         ulImage *= ulImage;      
  327.         result[i] = sqrt_16(ulReal+ulImage);                                                                 
  328.                     
  329.     }
  330. /*        for(i=0;i<17;i++)
  331.     {
  332.                 while(result[i] > FFT_OUT_MAX)
  333.                 {
  334.                 for(i=0;i<17;i++)
  335.              {                        
  336.                         result[i] =result[i] -1;      
  337.                   }
  338.             }
  339.         }         */
  340.         while(result[i] == FFT_OUT_MIN)
  341.                 {
  342.                 for(i=0;i<24;i++)
  343.              {                        
  344.                         result[i] =result[i] +1;      
  345.                   }
  346.             }
  347.         for(i=0;i<24;i++)
  348.         {
  349.                 if(result[i] > FFT_OUT_MAX)
  350.                 {
  351.                         result[i] = FFT_OUT_MAX;      
  352.                         if(result[i] > max)
  353.                 max = result[i];
  354.                 }
  355.         }
  356.         //局部增益        */        /*                       
  357.                 /*if(max >= 4)               
  358.                 for(i=1;i<24;i++)
  359.                         if(result[i] >= 2)
  360.                                 result[i]+=1;          */
  361.                                                                  
  362. }
  363. /********************************************************************/            
  364. void init()
  365. {
  366.         P2M0=0XFF;
  367.         P2M1=0X00;
  368.         P3M0=0XFF;
  369.         P3M1=0X00;
  370.         P1M0=0XFE;
  371.         P1M1=0X01;
  372.         P4SW=0x70;

  373.         ADC_init();
  374.         //AUXR |= 0x80;                //定时器时钟1T模式
  375.         TMOD=0x01;
  376.         TH0=(65535-TIME)/256;
  377.         TL0=(65535-TIME)%256;
  378.     EA=1;
  379.         ET0=1;               
  380.         show_musicdisplay();  
  381.         TR0=1;
  382. }
  383. /********************************************************************/
  384. void main()
  385. {
  386.         init();
  387.     while(1)          
  388.         FFT();
  389. }
  390. /********************************************************************/
  391. void timer0() interrupt 1
  392. {
  393.         unsigned char i;
  394.         t++;
  395.         if(t == 24)
  396.         {
  397.                 for(i=0;i<24;i++)
  398.                         temp[i] = result[i];
  399.                 t = 0;
  400.         }                                  
  401.         disp();
  402.         TH0=(65535-TIME)/256;       
  403.         TL0=(65535-TIME)%256;
  404. }
  405. /********************************************************************/
复制代码


FFT-LED.rar

49.14 KB, 下载次数: 2134, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:95809 发表于 2015-11-21 08:34 来自手机 | 只看该作者
试过,编译通不过,需要加上一条宏指令。
回复

使用道具 举报

板凳
ID:95809 发表于 2015-11-26 13:58 来自手机 | 只看该作者
制作成功,谢谢资料
回复

使用道具 举报

地板
ID:101451 发表于 2016-7-9 18:47 | 只看该作者
下载试试
回复

使用道具 举报

5#
ID:88643 发表于 2016-7-14 13:23 来自手机 | 只看该作者
看看。
回复

使用道具 举报

6#
ID:141649 发表于 2016-10-8 11:11 来自手机 | 只看该作者
用什么做显示的?
回复

使用道具 举报

7#
ID:155340 发表于 2016-12-22 08:44 来自手机 | 只看该作者
不错。。。。
回复

使用道具 举报

8#
ID:159371 发表于 2017-1-2 15:45 | 只看该作者
HENHAO
回复

使用道具 举报

9#
ID:148342 发表于 2017-1-2 15:54 | 只看该作者
收藏了 能用到
回复

使用道具 举报

10#
ID:432687 发表于 2019-5-5 02:32 来自手机 | 只看该作者
完美 一 直在寻找它很长一段时间! 谢谢你的分享。
回复

使用道具 举报

11#
ID:402142 发表于 2023-4-25 10:54 | 只看该作者
非常需要这个源码!感谢技术大牛!
回复

使用道具 举报

12#
ID:433219 发表于 2023-4-26 18:46 | 只看该作者
FFT-LED算法 就显示跳跳跳来看么???
回复

使用道具 举报

13#
ID:38792 发表于 2023-5-22 09:37 | 只看该作者
看了很多人做的,都是用FFT算法,而每个人写的又大同小异。有没有使用硬件实现的。那个古老的高级音响是如何实现的,会不会是用的带通滤波器阵列。
回复

使用道具 举报

14#
ID:1017706 发表于 2023-9-15 17:28 | 只看该作者
gaoyang9992006 发表于 2023-5-22 09:37
看了很多人做的,都是用FFT算法,而每个人写的又大同小异。有没有使用硬件实现的。那个古老的高级音响是如 ...

只能算法部分用硬件
回复

使用道具 举报

15#
ID:1017706 发表于 2023-9-15 17:28 | 只看该作者
要吧用来测试一下
回复

使用道具 举报

16#
ID:774081 发表于 2024-1-5 16:29 | 只看该作者
用过的说说波形是否真实啊?楼主贴的是查表法,我用实时计算法弄了一个FFT频谱,发现不真实,输入各段频率,看幅值对应不够理想,没有远古高级音响那样动感十足、灵敏又不乱跳的效果。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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