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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4515|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:582255 發(fā)表于 2021-1-26 15:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用單片機對模擬信號進行轉(zhuǎn)換,轉(zhuǎn)換后做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. }                                                                                                                         //計算旋轉(zhuǎn)因子
  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();                                                                                                                          //計算旋轉(zhuǎn)因子
  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. }                                                                                                           //轉(zhuǎn)電壓
  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. }
復(fù)制代碼

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜欧美| 夜夜摸夜夜操 | 久草视| 日韩一区二区三区精品 | 日韩中文字幕在线不卡 | 国产精品色 | 毛片a区 | 午夜在线免费观看 | 999久久久| 一区二区三区在线观看视频 | 草草网| 在线综合视频 | 久久综合一区 | 中国大陆高清aⅴ毛片 | 一区二区三区国产视频 | 91免费看片 | 日韩在线视频一区 | 一区二区免费视频 | 久精品久久 | 欧美在线免费 | 久久久久久亚洲精品不卡 | 成人性生交大片免费看r链接 | 欧美一区二区视频 | 国产综合欧美 | 中文字幕一二三 | 国产精品视频久久 | 玖玖色在线视频 | 日操操夜操操 | 亚洲精品日本 | 超碰97免费在线 | 国产精品18hdxxxⅹ在线 | 精品欧美色视频网站在线观看 | 国产精品久久久久久久久久久久久 | 成人午夜影院 | 人人干人人草 | 91亚洲国产精品 | 日本精品一区二区三区视频 | m豆传媒在线链接观看 | 精品无码久久久久久国产 | 久久精品久久综合 | 国产农村一级片 |