久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6335|回復: 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, 下載次數: 2138, 下載積分: 黑幣 -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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色伊人| 欧美激情一区二区三级高清视频 | 亚洲精品性视频 | 国产欧美在线一区 | 国产精品亚洲一区 | 免费亚洲网站 | 亚洲精品乱 | 在线视频国产一区 | 91就要激情 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 91私密视频 | 日日夜夜影院 | 91久久久久久久久 | 亚洲欧美综合精品久久成人 | 一级黄色录像片子 | 在线一级片 | 色伊人| 亚洲精品乱码久久久久久蜜桃 | 欧美日韩精品免费 | 国产小视频在线观看 | 成人免费视频在线观看 | 成人影院一区二区三区 | 精品国产乱码久久久久久老虎 | 男人天堂av网站 | 国产成人精品网站 | 久久福利电影 | h小视频| 久久av一区 | 在线播放国产一区二区三区 | 久久久久一区二区三区四区 | 韩国精品在线观看 | 密室大逃脱第六季大神版在线观看 | 日本一区二区三区视频在线 | 日韩电影一区 | 欧美激情一区 | 欧美高清性xxxxhd | 日韩精品一区二区三区视频播放 | av在线天天| 精品国产一区二区三区久久久蜜月 | 欧美视频免费在线 | 亚洲二区视频 |