求基2、基4、基8FFT(快速傅里叶变换)的c语言程序,要能运行得出来的 求个快速傅里叶变换的C语言程序

\u6c42\u57fa4fft\u7684C\u8bed\u8a00\u7a0b\u5e8f

\u55ef\uff1f\u662fmatlab\u8bed\u8a00\u5427

void fft(){ int nn,n1,n2,i,j,k,l,m,s,l1; float ar[1024],ai[1024]; // \u5b9e\u90e8 \u865a\u90e8 float a[2050]; float t1,t2,x,y; float w1,w2,u1,u2,z; float fsin[10]={0.000000,1.000000,0.707107,0.3826834,0.1950903,0.09801713,0.04906767,0.02454123,0.01227154,0.00613588,};// \u4f18\u5316 float fcos[10]={-1.000000,0.000000,0.7071068,0.9238796,0.9807853,0.99518472,0.99879545,0.9996988,0.9999247,0.9999812,}; nn=1024; s=10; n1=nn/2; n2=nn-1; j=1; for(i=1;i>1; w1=fcos[i-1]; w2=-fsin[i-1]; for(j=1;j<=k;j++) { for(l=j;l<nn;l=l+m) { l1=l+k; t1=a[2*l1]*u1-a[2*l1+1]*u2; t2=a[2*l1]*u2+a[2*l1+1]*u1; a[2*l1]=a[2*l]-t1; a[2*l1+1]=a[2*l+1]-t2; a[2*l]=a[2*l]+t1; a[2*l+1]=a[2*l+1]+t2; } z=u1*w1-u2*w2; u2=u1*w2+u2*w1; u1=z; } } for(i=1;i<=nn/2;i++) { ar[i]=a[2*i+2]/nn; ai[i]=-a[2*i+3]/nn; a[i]=4*sqrt(ar[i]*ar[i]+ai[i]*ai[i]); // \u5e45\u503c }}

1.FFT:
// data为输入和输出的数据,N为长度
bool CFFT::Forward(complex *const Data, const unsigned int N)
{
   if (!Data || N < 1 || N & (N - 1))
      return false;
   //   排序
   Rearrange(Data, N);
   //   FFT计算:const bool Inverse = false
   Perform(Data, N);

   return true;
}
 2.IFFT:
// Scale 为是否缩放
bool CFFT::Inverse(complex *const Data, const unsigned int N,
   const bool Scale /* = true */)
{
   if (!Data || N < 1 || N & (N - 1))
      return false;
   //   排序
   Rearrange(Data, N);
   //   FFT计算,ture表示是逆运算
   Perform(Data, N, true);
   //   对结果进行缩放
   if (Scale)
      CFFT::Scale(Data, N);

   return true;
}
3.排序:
void CFFT::Rearrange(complex *const Data, const unsigned int N)
{
   //   Swap position
   unsigned int Target = 0;
   //   Process all positions of input signal
   for (unsigned int Position = 0; Position < N; ++Position)
   {
      //   Only for not yet swapped entries
      if (Target > Position)
      {
         //   Swap entries
         const complex Temp(Data[Target]);
         Data[Target] = Data[Position];
         Data[Position] = Temp;
      }
      //   Bit mask
      unsigned int Mask = N;
      //   While bit is set
      while (Target & (Mask >>= 1))
         //   Drop bit
         Target &= ~Mask;
      //   The current bit is 0 - set it
      Target |= Mask;
   }
}
 4.FFT计算:
void CFFT::Perform(complex *const Data, const unsigned int N,
   const bool Inverse /* = false */)
{
   const double pi = Inverse ? 3.14159265358979323846 : -3.14159265358979323846;
   //   Iteration through dyads, quadruples, octads and so on...
   for (unsigned int Step = 1; Step < N; Step <<= 1)
   {
      //   Jump to the next entry of the same transform factor
      const unsigned int Jump = Step << 1;
      //   Angle increment
      const double delta = pi / double(Step);
      //   Auxiliary sin(delta / 2)
      const double Sine = sin(delta * .5);
      //   Multiplier for trigonometric recurrence
      const complex Multiplier(-2. * Sine * Sine, sin(delta));
      //   Start value for transform factor, fi = 0
      complex Factor(1.);
      //   Iteration through groups of different transform factor
      for (unsigned int Group = 0; Group < Step; ++Group)
      {
         //   Iteration within group 
         for (unsigned int Pair = Group; Pair < N; Pair += Jump)
         {
            //   Match position
            const unsigned int Match = Pair + Step;
            //   Second term of two-point transform
            const complex Product(Factor * Data[Match]);
            //   Transform for fi + pi
            Data[Match] = Data[Pair] - Product;
            //   Transform for fi
            Data[Pair] += Product;
         }
         //   Successive transform factor via trigonometric recurrence
         Factor = Multiplier * Factor + Factor;
      }
   }
}
 5.缩放:
void CFFT::Scale(complex *const Data, const unsigned int N)
{
   const double Factor = 1. / double(N);
   //   Scale all data entries
   for (unsigned int Position = 0; Position < N; ++Position)
      Data[Position] *= Factor;
}


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct{
double r;
double i;
}my_complex
;

//检查a是否为2的整数次方数
#define NOT2POW(a) (((a)-1)&(a)||(a)<=0)
//pi
#define MYPI 3.14159265358979323846

my_complex* fft(const my_complex* x, unsigned int len){
unsigned int ex=0,t=len;
unsigned int i,j,k;
my_complex *y;
double tr,ti,rr,ri,yr,yi;

if(NOT2POW(len)) return NULL; //如果失败,返回空指针
for(;!(t&1);t>>=1) ex++; //len应该等于2的ex次方

y=(my_complex*)malloc(len*sizeof(my_complex));
if(!y) return NULL;

//变址计算,库里-图基算法
for(i=0;i<len;i++){
k=i;
j=0;
t=ex;
while((t--)>0){
j<<=1;
j|=k&1;
k>>=1;
}
if(j>=i){
y[i]=x[j];
y[j]=x[i];
}
}

//用变址后的y向量进行计算
for(i=0;i<ex;i++){
t=1<<i;
for(j=0;j<len;j+=t<<1){
for(k=0;k<t;k++){
ti=-MYPI*k/t;
rr=cos(ti);
ri=sin(ti);

tr=y[j+k+t].r;
ti=y[j+k+t].i;

yr=rr*tr-ri*ti;
yi=rr*ti+ri*tr;

tr=y[j+k].r;
ti=y[j+k].i;

y[j+k].r=tr+yr;
y[j+k].i=ti+yi;
y[j+k+t].r=tr-yr;
y[j+k+t].i=ti-yi;
}
}
}

return y;
}

//以下为测试
int main()
{
int i,DATA_LEN;
my_complex *x,*y;

printf("基二FFT测试\n输入生成序列长度:");
scanf("%d",&DATA_LEN);
x=(my_complex*)malloc(DATA_LEN*sizeof(my_complex));

for(i=0;i<DATA_LEN;i++){
x[i].r=i;
x[i].i=i-1;
}

printf("处理前...\n实部\t\t虚部\n");
for(i=0;i<DATA_LEN;i++)
printf("%lf\t%lf\n",x[i].r,x[i].i);

y=fft(x,DATA_LEN);
if(!y){
printf("序列长度不为2的整数次方!\n");
return 0;
}

printf("处理后...\n实部\t\t虚部\n");
for(i=0;i<DATA_LEN;i++)
printf("%lf\t%lf\n",y[i].r,y[i].i);

free(y);
free(x);

return 0;
}

  • 姹傚熀2銆鍩4銆鍩8FFT(蹇鍌呴噷鍙跺彉鎹)鐨刢璇█绋嬪簭,瑕佽兘杩愯寰楀嚭鏉ョ殑
    绛旓細1.FFT锛// data涓鸿緭鍏ュ拰杈撳嚭鐨勬暟鎹紝N涓洪暱搴ool CFFT::Forward(complex *const Data, const unsigned int N){ if (!Data || N < 1 || N & (N - 1)) return false; // 鎺掑簭 Rearrange(Data, N); // FFT璁$畻锛歝onst bool Inverse = false Perform(Data, ...
  • 蹇鍌呴噷鍙跺彉鎹㈣绠楁柟娉
    绛旓細闄や簡鍩2锛岃繕鏈鍩4銆佸熀8绛夐珮鍩烘暟鐨凢FT绠楁硶锛屼互鍙婁换鎰忓熀鏁扮殑鍙樼銆傚畠浠兘鍒╃敤浜嗘暟瀛︿笂鐨勭壒娈婃ц川锛屽疄鐜颁簡蹇熻绠楃鏁e倕閲屽彾鍙樻崲鐨勭洰鐨勩傛棤璁烘槸鏃堕棿鎶藉彇杩樻槸棰戠巼鎶藉彇锛孎FT绠楁硶鐨勬牳蹇冮兘鏄氳繃杩唬鍜屽垎瑙o紝鍑忓皯浜嗚绠楀鏉傚害锛屼娇寰楀師鏈楁椂鐨勫倕閲屽彾鍙樻崲鍙樺緱鏇翠负绠渚裤
  • 蹇鍌呴噷鍙跺彉鎹⑩斺旂悊璁
    绛旓細鍩簄蹇熷倕閲屽彾鍙樻崲鐢ㄤ簬涓涓暱搴涓 鐨勫簭鍒楋紝渚嬪鍩2蹇鍌呴噷鍙朵綔鐢ㄥ湪 鐨勫簭鍒椾笂锛屽熀4蹇鍌呴噷鍙朵綔鐢ㄥ湪 鐨勫簭鍒椾笂銆傜幇鍦ㄨ冭檻鍩2FFT鐨勬帹瀵硷紙纭欢瀹炵幇涓鑸娇鐢ㄥ熀4鎴鍩8FFT瀹炵幇锛夛紝棣栧厛鍐欏嚭鏈夐檺闀跨鏁e簭鍒楃殑鍌呴噷鍙跺彉鎹紝璁颁竴涓俊鍙 鐨凢FT鍙樻崲涓 锛 蹇熷倕閲屽彾鍙樻崲鐨勬牳蹇冩濇兂涓 鍒嗚屾不涔 ...
  • 濡備綍鐢诲嚭4,8,16鐐鍩2 DIT-FFT鍜孌IF-FFT鐨勮繍绠楀浘?
    绛旓細濡備笅锛氶鍩8鐐瑰熀2DFT銆傛椂鍩8鐐鍩2FFT銆16鐐逛互姝ょ被鎺紝涓や釜8鐐广傚浘鍍忚繍绠楁寚浠ュ浘鍍忎负鍗曚綅杩涜鐨勬悺浣滐紙璇ユ搷浣滃鍥惧儚涓殑鎵鏈夊儚绱犲悓鏍疯繘琛岋級锛岃繍绠楃殑缁撴灉鏄竴骞呭叾鐏板害鍒嗗竷涓庡師鏉ュ弬涓庤繍绠楀浘鍍忕伆搴﹀垎甯冧笉鍚岀殑鏂板浘鍍忋傚叿浣撶殑杩愮畻涓昏鍖呮嫭绠楁湳鍜岄昏緫杩愮畻锛屽畠浠氳繃鏀瑰彉鍍忕礌鐨勫兼潵寰楀埌鍥惧儚澧炲己鐨勬晥鏋溿傜畻鏈拰閫昏緫...
  • ...灏辨槸FFT绠楁硶涓熀鐨勯夊彇闂,鏈鍩2鐨,鍩4鐨,鍩8鐨
    绛旓細鍩8鏄娊鍙8涓暟鍋氳澏鍙橈紝杩欐牱鐞嗚В褰撶劧灏辨槸鎶藉彇8涓偣瑕佸揩锛岃繖涓綘搴斿綋鐪嬬湅FFT鐨勭畻娉曞師鐞嗐侳PGA鍋欶FT涓鑸兘鏄敤IP鏍稿仛锛屾瘮杈冪畝鍗曪紝鍩2杩樻槸鍩4鑷繁閫夋嫨灏卞彲浠ヤ簡銆傚熀4蹇呴』鏄2鐨勫伓娆℃柟锛屾瘮濡傝浣犺鏄畻128鐐癸紝128鏄2鐨7娆℃柟锛屽氨涓嶈兘鐢ㄥ熀4锛岃蒋浠朵細鑷姩閫夋嫨鍩2.浣犲湪鐪嬬湅FPGA鐨処P鏍稿惂锛
  • FFT鍘熺悊FFT鍩鏈師鐞
    绛旓細FFT涓昏鍒嗕负鏃堕棿鎶藉彇娉曞拰棰戠巼鎶藉彇娉曚袱绫汇傛椂闂存娊鍙栨硶锛屽8鐐笵FT涓殑铦跺舰绠楁硶锛屽皢鏁版嵁鎸夊鍋舵暟鍒嗙粍锛岄氳繃鍘熶綅璁$畻锛屽瓨鍌ㄥ崟鍏冧腑鐨勬暟鎹細鎸夎嚜鐒堕『搴忚緭鍑恒傝岄鐜囨娊鍙栨硶鍒欐槸灏嗘暟鎹垎涓哄墠鍚庝袱閮ㄥ垎杩涜璁$畻锛屼笌鏃堕棿鎶藉彇绫讳技锛屼絾铦跺舰缁撴瀯鍜岃凯浠f鏁版湁鎵涓嶅悓銆傚浜庨潪鍩2闀垮害鐨凢FT锛屽缁勫悎鏁鍩哄洓FFT锛鍙互閫氳繃琛...
  • fft绠楁硶鐨勫熀鏈濊矾鏄粈涔?
    绛旓細鍩2绠楁硶锛屽簭鍒楃殑闀垮害鏄负2鐨勫箓锛屽簭鍒楃殑DFT涓恒傚簭鍒楀彲浠ョ敱濂囧簭鍒楀拰鍋跺簭鍒楃粍鎴愶紝DFT鍒嗗埆涓哄拰銆 浠庢渶鍚庝竴绾у線鍓嶅垎瑙e搴旂殑铦跺舰缁撴瀯锛岃繖浜涜澏褰㈢粨鏋勬渶宸﹁竟鐨勮緭鍏ラ兘鏄簭鍒楃殑DFT鍊硷紝鑰屽垎瑙g洿鍒版渶宸﹁竟鐨勮澏褰㈢粨鏋勬槸涓ょ偣搴忓垪鐨凞FT锛屾鏃舵渶宸﹁竟鐨勫兼槸搴忓垪x[k]銆鍩4鏃堕棿鎶藉彇FFT璁$畻锛氬皢搴忓垪鍒嗕负4涓煭搴忓垪锛...
  • FFT绠楁硶鍒嗗嚑绉?
    绛旓細FFT绠楁硶鍒嗘瀽FFT绠楁硶鐨勫熀鏈師鐞嗘槸鎶婇暱搴忓垪鐨凞FT閫愭鍒嗚В涓鸿緝鐭簭鍒楃殑DFT銆傛寜鐓ф娊鍙栨柟寮忕殑涓嶅悓鍙垎涓篋IT-FFT锛鎸夋椂闂存娊鍙栵級鍜孌IF-FFT锛堟寜棰戠巼鎶藉彇锛夌畻娉曘傛寜鐓ц澏褰㈣繍绠楃殑鏋勬垚涓嶅悓鍙垎涓哄熀2銆鍩4銆鍩8浠ュ強浠绘剰鍥犲瓙锛2n,n涓哄ぇ浜1鐨勬暣鏁帮級锛屽熀2銆佸熀4绠楁硶杈冧负甯哥敤銆 缃戜笂鏈夊府鍔╂枃妗: http://www.5doc...
  • 鍌呯珛鍙跺彉鎹㈠簲鐢
    绛旓細FPGA瀹炵幇鐨勫倕绔嬪彾鍙樻崲锛岀壒鍒槸蹇鍌呯珛鍙跺彉鎹锛團FT锛夛紝瀵逛簬楂樻晥澶勭悊澶ч噺鏁版嵁鑷冲叧閲嶈銆備緥濡傦紝8192鐐圭殑DFT鍙互閫氳繃澶氱骇鍩2鍜鍩4鐨勫倕绔嬪彾鍙樻崲閫愭鍒嗚В瀹炵幇锛岃繖闄嶄綆浜嗚繍绠楅噺骞剁畝鍖栦簡绠楁硶銆侳FT鐨勫熀鏈粨鏋勫寘鍚熀2/4妯″潡銆佸鏁颁箻娉曞櫒銆佸瓨鍌ㄥ崟鍏冨拰鎺у埗妯″潡锛屽鍥1鎵绀猴紝閫氳繃娴佹按绾挎妧鏈繘涓姝ユ彁楂樹簡鏁堢巼銆傚浜庝笉鍚...
  • 璇锋暀涓涓FFT鐨勯棶棰,涔︿笂閮芥槸鍩2,鍩4鐨勩傚鏋滀笉鏄2鐨勬暣鏁版鏂,灏辫琛0...
    绛旓細1.琛ラ浂鍙互浣FFT鍚庣殑缁撴灉鏇村钩婊戯紝鍙互鍙嶆槧鍑哄師淇″彿鐨勯璋便傚洜涓篎FT鍓嶅悗鐨勭偣鏁颁竴鏍凤紝 瀹為檯涓婅ˉ闆剁殑浣滅敤鏄鍔犱簡棰戝煙鐨勬樉绀哄垎杈ㄧ巼銆傚鏋滄湁MATLAB鍙互鐪嬪埌 琛ラ浂鍓嶇殑鏁版嵁鍜岃ˉ闆跺悗鐨勬暟鎹 鍥惧舰鏄熀鏈竴鑷寸殑锛屼絾鏄浜嗚ˉ鐨0鐨勪釜鏁颁釜閲囨牱鐐规潵骞虫粦銆2.琛ラ浂涓嶄細澧炲姞浣犳暟鎹腑鎼哄甫鐨勪俊鎭傛墍浠ヤ笉鑳芥彁楂樹俊鍙风殑...
  • 扩展阅读:大基网 ... 大基社大捷豹微博 ... 基图1 ... 大基社足球队长 ... 基图官网 ... 大基社怎么打开 ... 两个基佬击剑图片 ... 允硕基 ... 基变序1-30 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网