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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4570|回復: 5
打印 上一主題 下一主題
收起左側

c8051f020單片機AD采樣,然后FFT變換程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:582255 發表于 2021-1-26 15:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用單片機對模擬信號進行轉換,轉換后做FFT快速傅里葉變換。
程序如下:
  1. #include<c8051f020.h>
  2. #include<math.h>

  3. #define SYSCLK 11000000
  4. #define  PI 3.1415926536
  5. #define  size_x  1024

  6. sfr16 ADC0 = 0xbe;

  7. typedef struct{
  8.      float real;
  9.      float img;
  10. }complex;

  11. complex W[512];
  12. complex xdata x[1024];
  13. float p=0;                                                           //總功率
  14. unsigned int h;

  15. void SYSCLK_Init (void)
  16. {
  17.    int i;                              // delay counter
  18.    OSCXCN = 0x67;                      // start external oscillator with
  19.                                        // 11MHz crystal
  20.    for (i=0; i < 256; i++) ;           // Wait for osc. to start up
  21.    while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
  22.    OSCICN = 0x88;                      // select external oscillator as SYSCLK
  23.                                        // source and enable missing clock
  24.                                        // detector
  25. //        OSCICN = 0x07;   //interal 16MHZ
  26. }
  27. void WDT_Init()
  28. {
  29. WDTCN = 0xde;
  30. WDTCN = 0xad;
  31. }
  32. void T3_Init()                                                      //定時48.8us
  33. {
  34. TMR3CN=0x02;
  35. TMR3RLL=(65536-540)%256;
  36. TMR3RLH=(65536-540)/256;
  37. TMR3L=(65536-540)%256;
  38. TMR3H=(65536-540)/256;
  39. TMR3CN|=0X04;                                                          //啟動定時器
  40. }
  41. void ADC_Init()
  42. {
  43. AMX0CF=0X00;                                                          //通道0
  44. AMX0SL=0X00;
  45. ADC0CF = (SYSCLK/2500000) << 3;               //SAR時鐘為2.5mhz
  46. ADC0CN = 0x84;                                                          //定時器3方式啟動
  47. REF0CN = 0x03;
  48. EA=1;
  49. EIE2|=0X02;                    
  50. EIE1&= ~0x04;
  51. }
  52. void ADC0_ISR() interrupt 15
  53. {
  54. ADC0CN&=0xdf;
  55. x[h].real=ADC0;
  56. h++;
  57. }
  58. void add(complex a,complex b,complex *c)
  59. {
  60.      c->real=a.real+b.real;
  61.      c->img=a.img+b.img;
  62. }
  63. void mul(complex a,complex b,complex *c)
  64. {
  65.      c->real=a.real*b.real - a.img*b.img;
  66.      c->img=a.real*b.img + a.img*b.real;
  67. }
  68. void sub(complex a,complex b,complex *c)
  69. {
  70.      c->real=a.real-b.real;
  71.      c->img=a.img-b.img;
  72. }
  73. void change()                                                                                                  //倒位序
  74. {
  75.   unsigned int i=0,j=0,k=0,t;
  76.   complex temp;
  77.   for(i=0;i<size_x;i++)
  78.   {
  79.     k=i;j=0;
  80.         t=(unsigned) (log(size_x)/log(2));
  81.     while(t--)
  82.         {
  83.        j=j<<1;
  84.        j|=(k & 1);                                                                                         
  85.        k=k>>1;
  86.     }
  87.     if(j>i)
  88.         {
  89.        temp=x[i];
  90.        x[i]=x[j];
  91.        x[j]=temp;
  92.     }
  93.   }                                                                                          
  94. }                                                                                                                         //計算旋轉因子
  95. void init_W()                                                                                
  96. {
  97. int i;
  98. for(i=0;i<(size_x/2);i++)
  99. {
  100.    W[i].real=cos(2*PI/size_x*i);
  101.    W[i].img=-1*sin(2*PI/size_x*i);
  102.                   
  103. }
  104. }
  105. void FFT()
  106. {
  107.      unsigned int i=0,j=0,k=0,l=0;
  108.      complex up,down;
  109.      change();                                                                                                                          //倒位序
  110.          init_W();                                                                                                                          //計算旋轉因子
  111.      for(i=0;i<(int)( log(size_x)/log(2) );i++)                                                          //一級蝶形運算
  112.          {                     
  113.            l=( 1<<i );                                                                                                         
  114.            for(j=0;j<size_x;j+=(1<<(i+1)))                                                                  //一組蝶形運算
  115.                    {                              
  116.                  for(k=0;k<l;k++)
  117.                                  {                                                                                                                  //一個蝶形運算
  118.                                                                      
  119.                         mul(x[j+k+l],W[size_x*k/2/l],&up);
  120.                         add(x[j+k],up,&up);
  121.                         mul(x[j+k+l],W[size_x*k/2/l],&down);
  122.                         sub(x[j+k],down,&down);
  123.                         x[j+k]=up;
  124.                         x[j+k+l]=down;
  125.                  }
  126.            }
  127.      }
  128. }
  129. void PSD()                                                                                             //功率譜
  130. {
  131. unsigned int i;
  132. for(i=0;i<size_x;i++)
  133. {                        
  134.   x[i].real=(1/1024.0)*(x[i].real*x[i].real+x[i].img*x[i].img);
  135.   x[i].img=0;
  136. }
  137. }
  138. void ZP()                                                                                           //總功率
  139. {
  140.   int i;
  141.   for(i=0;i<size_x;i++)
  142. {p+=x[i].real*x[i].real;}
  143.   p=(1/1024.0)*p;
  144. }                                                                                                           //轉電壓
  145. void ZDY()
  146. {
  147. unsigned int i;
  148. for(i=0;i<1024;i++)
  149. {
  150.   x[i].real=(1/4096.0)*x[i].real*2.4;
  151. }
  152. }
  153. void main()
  154. {
  155.   WDT_Init();
  156.   SYSCLK_Init();
  157.   ADC_Init();
  158.   T3_Init();
  159.   while(h==1024)
  160.   {
  161.    TMR3CN&=0xfb;
  162.    ZDY();
  163.    ZP();
  164.    FFT();
  165.    PSD();
  166.    h=0;
  167.    TMR3CN|=0x04;
  168.   }
  169. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:64765 發表于 2022-2-6 13:38 | 只看該作者
學習,受益匪淺,謝謝分享。
回復

使用道具 舉報

板凳
ID:1064338 發表于 2023-2-26 13:26 | 只看該作者
學習,受益匪淺,謝謝分享
回復

使用道具 舉報

地板
ID:29750 發表于 2023-8-10 23:50 | 只看該作者
學習,受益匪淺,謝謝分享
回復

使用道具 舉報

5#
ID:654480 發表于 2023-8-29 09:33 | 只看該作者
能直接用嗎
回復

使用道具 舉報

6#
ID:227484 發表于 2023-10-28 19:29 | 只看該作者
這個程序能直接使用嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区国产精品 | 日韩一区二区三区在线观看视频 | 久久999| 欧美在线综合 | 9191av| 免费av播放 | 特黄色一级毛片 | 国产精品久久久久久久免费观看 | 91久久精品一区二区二区 | 欧美性tv| 国产中文在线 | 黄色在线免费观看 | 成人免费在线视频 | 欧美一区二区三区视频在线播放 | 成人网av| 欧美日韩综合一区 | 国产羞羞视频在线观看 | 精品综合久久久 | 国产在线精品一区二区三区 | 久久免费观看一级毛片 | 精品免费国产视频 | 日韩在线视频网址 | 少妇精品久久久久久久久久 | 国产高清精品一区二区三区 | 久久精品国产亚洲一区二区 | 射久久 | 91久久精品国产免费一区 | 日日夜夜天天久久 | jizz中国日本| av免费观看在线 | 国产精品一区二区三区久久久 | 中文字幕日韩欧美一区二区三区 | 久久久性色精品国产免费观看 | 久久久久久免费毛片精品 | 亚洲免费久久久 | 青青久草 | 女女爱爱视频 | 一级做a爰片性色毛片16美国 | 精品国产乱码久久久久久影片 | 91电影在线播放 | av在线视 |