⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51单片机fft算法.txt

📁 C51的FFT
💻 TXT
字号:
#include <reg51.h>
#include "stdio.h"
#include <math.h>       //調用源(頭)文件

struct compx           /*定義一個複數結構*/
{float real;float imag;
};
struct compx s[ 256 ];      //FFT輸入輸出均從是s[1]開始存入
struct compx EE(struct compx,struct compx); //定義複數相乘結構
void FFT(struct compx xin,int N);   /*定義FFT函數*/
struct compx EE(struct compx a1,struct compx b2) //兩複數相乘的程序
{struct compx b3;  //b3保存兩複數間的結果
b3.real=a1.real*b2.real-a1.imag*b2.imag; //兩複數間的運算
b3.imag=a1.real*b2.imag+a1.imag*b2.real;
return(b3);    /*返回結果*/
}

void FFT(struct compx xin,int N)   /*FFT函數體*/
{int f,m,nv2,nm1,i,k,j=1,l;   /*定義變量*/
struct compx v,w,t;    /*定義結構變量*/
nv2=N/2;           /*最高位值的權值*/
f=N;                  /*f為中間變量*/
for(m=1;(f=f/2)!=1;m++){;}            /*求級數m*/
nm1=N-1;                               /*nm1為數組長度*/
for(i=1;i<=nm1;i++)                   /*倒序*/
{if(i<j) {t=xin[j];xin[j]=xin;xin=t;}         /*i<j則換位*/
k=nv2;                       /*k為倒序中相應位置的權值*/
while(k<j) {j=j-k;k=k/2;}            /*k<j時最高為變為0*/
j=j+k;                  /* j為數組中的位數,是一個十進制數*/
}
{int le,lei,ip;       //變量初始化,le為序列長度
  float pi;
  for(l=1;l<=m;l++)                /*l控制級數*/
   {le=pow(2,l);                  /*le等於2的l次方*/
    lei=le/2;                   /*蝶形兩節點間的距離*/
    pi=3.14159265;
    v.real=1.0;                    // 此次的v運於複數的初始化    v.imag=0.0;
   w.real=cos(pi/lei);                  /*旋轉因子*/
    w.imag=-sin(pi/lei);
    for(j=1;j<=lei;j++)      //外循環控制蝶行運算的級數
     {for(i=j;i<=N;i=i+le)      //內循環控制每級間的運算次數
      {ip=i+lei;                 /*蝶形運算的下一個節點*/
       t=EE(xin[ ip ],v);             /*第一個旋轉因子*/
       xin[ ip ].real=xin[ i ].real-t.real;   /*蝶形計算*/
       xin[ ip ].imag=xin[ i ].imag-t.imag;
       xin[ i ].real=xin[ i ].real+t.real;
       xin[ i ].imag=xin[ i ].imag+t.imag;
      }
      v=EE(v,w); //調用EE複數相乘程序,結果給下次的循環
      }
   }
  }
}

main()                    /*定義主函數*/
{int N,i;     //變量初始化,N為總點數,i為每點數
printf("shu ru N de ge shu N=");  /*提示輸入*/
scanf("%d",&N);                   /*輸入N*/
for(i=1;i<=N;i++)              /*輸入*/
  {printf("di %d ge shu real=",i);
   getchar();
   scanf("%f",&s[ i ].real);
   getchar();
   printf("\n");
   printf("di %d ge shu imag=",i);
   scanf("%f",&s[ i ].imag);
   printf("\n");
  }
  FFT(s,N);               /*調用FFt*/
  for(i=1;i<=N;i++)                 /*輸出*/
   {printf("%f",s[ i ].real);
   printf(" + ");
    printf("%f",s[ i ].imag);
    printf("j");
    printf("\n");
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -