求快速傅里叶算法的C语言实现代码 怎样用C语言实现FFT算法啊?

\u6c42\u5feb\u901f\u81ea\u76f8\u5173\u7684C\u8bed\u8a00\u7b97\u6cd5\uff0c\u6e90\u4ee3\u7801

#include
void main()
{
int a[8];
int i,j,min;
int num;
printf("please input 8 numbers\n");
for(i=0;i<8;i++) //\u8f93\u51658\u4e2a\u6570\u5b57
scanf("%d",&a[i]);
printf("\n");
for(i=0;i<8;i++)
{
min=i; //\u9ed8\u8ba4\u6570\u7ec4\u7684\u7b2c\u4e00\u4e2a\u6570\u662f\u6700\u5c0f\u503c\uff0c\u5728\u7b2c1\u8d9f\u6bd4\u8f83\u4e2d\u505a7\u6b21\uff0c\u627e\u51fa\u6700\u5c0f\u7684
for(j=i+1;j<8;j++) //\u5728\u7b2c\u4e8c\u8d9f\u6bd4\u8f83\u4e2d\uff0c\u505a6\u6b21\uff0c\u4f9d\u6b21\u627e\u51fa\u6700\u5c0f\u7684

{
if(a[j]<a[min])
min=j; //\u5c06\u6700\u5c0f\u7684\u503c\u5b58\u653e\u5728j\u91cc
}
if(min!=i) //\u82e5\u6700\u5c0f\u503c\u4e0d\u7b49\u4e8ei\u7684\u503c
{
num=a[i]; //\u5c31\u8981\u5c06\u6700\u5c0f\u503c\u4ea4\u6362\u91cd\u65b0\u5b58\u50a8
a[i]=a[min];
a[min]=num; //\u6bd4\u8f83\u5927\u5c0f\uff0c\u8fdb\u884c\u4ea4\u6362\u4f4d\u7f6e
}
}

printf("\n");
for(i=0;i<8;i++) //\u8f93\u51fa\u8fd98\u4e2a\u6570
printf("%d\n",a[i]);
printf("\n");
}

1\u3001\u4e8c\u7ef4FFT\u76f8\u5f53\u4e8e\u5bf9\u884c\u548c\u5217\u5206\u522b\u8fdb\u884c\u4e00\u7ef4FFT\u8fd0\u7b97\u3002\u5177\u4f53\u7684\u5b9e\u73b0\u529e\u6cd5\u5982\u4e0b\uff1a\u5148\u5bf9\u5404\u884c\u9010\u4e00\u8fdb\u884c\u4e00\u7ef4FFT\uff0c\u7136\u540e\u518d\u5bf9\u53d8\u6362\u540e\u7684\u65b0\u77e9\u9635\u7684\u5404\u5217\u9010\u4e00\u8fdb\u884c\u4e00\u7ef4FFT\u3002\u76f8\u5e94\u7684\u4f2a\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1afor (int i=0; i<M; i++)FFT_1D(ROW[i]\uff0cN);for (int j=0; j<N; j++)FFT_1D(COL[j]\uff0cM);\u5176\u4e2d\uff0cROW[i]\u8868\u793a\u77e9\u9635\u7684\u7b2ci\u884c\u3002\u6ce8\u610f\u8fd9\u53ea\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u8bb0\u6cd5\uff0c\u5e76\u4e0d\u80fd\u5b8c\u5168\u7167\u6284\u3002\u8fd8\u9700\u8981\u901a\u8fc7\u4e00\u4e9b\u8bed\u53e5\u6765\u751f\u6210\u5404\u884c\u7684\u6570\u636e\u3002\u540c\u7406\uff0cCOL[i]\u662f\u5bf9\u77e9\u9635\u7684\u7b2ci\u5217\u7684\u4e00\u79cd\u7b80\u5355\u8868\u793a\u65b9\u6cd5\u3002\u6240\u4ee5\uff0c\u5173\u952e\u662f\u4e00\u7ef4FFT\u7b97\u6cd5\u7684\u5b9e\u73b0\u3002
2\u3001\u4f8b\u7a0b\uff1a
#include #include #include #define N 1000/*\u5b9a\u4e49\u590d\u6570\u7c7b\u578b*/typedef struct{double real;double img;}complex;complex x[N], *W; /*\u8f93\u5165\u5e8f\u5217,\u53d8\u6362\u6838*/int size_x=0; /*\u8f93\u5165\u5e8f\u5217\u7684\u5927\u5c0f\uff0c\u5728\u672c\u7a0b\u5e8f\u4e2d\u4ec5\u96502\u7684\u6b21\u5e42*/double PI; /*\u5706\u5468\u7387*/void fft(); /*\u5feb\u901f\u5085\u91cc\u53f6\u53d8\u6362*/void initW(); /*\u521d\u59cb\u5316\u53d8\u6362\u6838*/void change(); /*\u53d8\u5740*/void add(complex ,complex ,complex *); /*\u590d\u6570\u52a0\u6cd5*/void mul(complex ,complex ,complex *); /*\u590d\u6570\u4e58\u6cd5*/void sub(complex ,complex ,complex *); /*\u590d\u6570\u51cf\u6cd5*/void output();int main(){int i; /*\u8f93\u51fa\u7ed3\u679c*/system("cls");PI=atan(1)*4;printf("Please input the size of x:\n");scanf("%d",&size_x);printf("Please input the data in x[N]:\n");for(i=0;i0 ){ j=j>1; } if(j>i){ temp=x[i]; x[i]=x[j]; x[j]=temp; }}}/*\u8f93\u51fa\u5085\u91cc\u53f6\u53d8\u6362\u7684\u7ed3\u679c*/void output(){int i;printf("The result are as follows\n");for(i=0;i=0.0001)printf("+%.4fj\n",x[i].img); else if(fabs(x[i].img)real=a.real+b.real;c->img=a.img+b.img;}void mul(complex a,complex b,complex *c){c->real=a.real*b.real - a.img*b.img;c->img=a.real*b.img + a.img*b.real;}void sub(complex a,complex b,complex *c){c->real=a.real-b.real;c->img=a.img-b.img;}

这是源于 Numerical Recipes 的关键性的函数,我曾使用过(书本可能有印刷错误,这里给的没有错误)。我不可能给你在这里讲解语句功能,你可以查原书。
isign 1 或 0 是正变换和反变换。调用前,要自己去掉 mean,尾部要自己 padding ( 最简单添0),时间域 和 频率 域 要自己 滤波。 nn 必须是2的整数次方,例如1024,4096。

#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
void jfour1(float ya[], unsigned long nn, int isign)
{
unsigned long n,mmax,m,j,istep,i;
double wtemp,wr,wpr,wpi,wi,theta;
float tempr,tempi;
n=nn << 1;
j=1;
for (i=1;i<n;i+=2) {
if (j > i) {
SWAP(ya[j],ya[i]);
SWAP(ya[j+1],ya[i+1]);
}
m=n >> 1;
while (m >= 2 && j > m) {
j -= m;
m >>= 1;
};
j += m;
};
mmax=2;
while (n > mmax) {
istep=mmax << 1;
theta=isign*(6.28318530717959/mmax);
wtemp=sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi=sin(theta);
wr=1.0;
wi=0.0;
for (m=1;m<mmax;m+=2) {
for (i=m;i<=n;i+=istep) {
j=i+mmax;
tempr = wr * ya[j]- wi * ya[j+1];
tempi = wr * ya[j+1] + wi * ya[j];
ya[j] = ya[i] - tempr;
ya[j+1] = ya[i+1] - tempi;
ya[i] += tempr;
ya[i+1] += tempi;
};
wr = (wtemp=wr) * wpr - wi * wpi + wr;
wi = wi * wpr + wtemp * wpi + wi;
};
mmax=istep;
};
}
#undef SWAP
void jrealft(float ya[], unsigned long n, int isign)
{
void jfour1(float ya[], unsigned long nn, int isign);
unsigned long i,i1,i2,i3,i4,np3,n05;
float c1=0.5,c2,h1r,h1i,h2r,h2i;
double wr,wi,wpr,wpi,wtemp,theta;
n05 = n >> 1;
theta=3.141592653589793/(double) (n05);
if (isign == 1) {
c2 = -0.5;
jfour1(ya,n05,1);
} else {
c2=0.5;
theta = -theta;
};
wtemp=sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi=sin(theta);
wr=1.0+wpr;
wi=wpi;
np3=n+3;
for (i=2;i<=(n>>2);i++) {
i4=1+(i3=np3-(i2=1+(i1=i+i-1)));
h1r = c1 * (ya[i1] + ya[i3]);
h1i = c1 * (ya[i2] - ya[i4]);
h2r = -c2* (ya[i2] + ya[i4]);
h2i = c2 * (ya[i1] - ya[i3]);
ya[i1] = h1r + wr * h2r - wi * h2i;
ya[i2] = h1i + wr * h2i + wi * h2r;
ya[i3] = h1r - wr * h2r + wi * h2i;
ya[i4] = -h1i + wr * h2i + wi * h2r;
wr= (wtemp=wr) * wpr - wi * wpi + wr;
wi=wi * wpr + wtemp * wpi + wi;
};
if (isign == 1) {
ya[1] = (h1r=ya[1]) + ya[2];
ya[2] = h1r-ya[2];
} else {
ya[1] = c1 * ((h1r=ya[1]) + ya[2]);
ya[2]=c1 * (h1r - ya[2]);
jfour1(ya,n05,-1);
}
}

  • 姹傚揩閫熷倕閲屽彾绠楁硶鐨凜璇█瀹炵幇浠g爜
    绛旓細isign 1 鎴 0 鏄鍙樻崲鍜屽弽鍙樻崲銆傝皟鐢ㄥ墠锛岃鑷繁鍘绘帀 mean锛屽熬閮ㄨ鑷繁 padding ( 鏈绠鍗曟坊0锛夛紝鏃堕棿鍩 鍜 棰戠巼 鍩 瑕佽嚜宸 婊ゆ尝銆 nn 蹇呴』鏄2鐨勬暣鏁版鏂癸紝渚嬪1024锛4096銆俤efine SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr void jfour1(float ya[], unsigned long nn, int isign)...
  • 濡備綍鐢C璇█鎴栨眹缂璇█瀹炵幇FFT(蹇熷倕閲屽彾)鍙樻崲,骞跺啓鍑篊璇█鎴栨眹缂栦唬 ...
    绛旓細float ar[1024],ai[1024];/* 鍘熷鏁版嵁瀹為儴锛岃櫄閮 */ float a[2050];void fft(int nn) /* nn鏁版嵁闀垮害 */ { int n1,n2,i,j,k,l,m,s,l1;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...
  • 璺眰鐢╒C璇█缂栧啓淇″彿鍌呴噷鍙杞崲绋嬪簭鐨勬簮浠g爜!
    绛旓細void FFT1(float a_r1[],float a_im[],int ex,bool inv){ int i,length=1;float *sin_tbl;float *cos_tbl;float *buf;for(i=0;i<ex;i++){ length*=2;} sin_tbl=(float *)malloc(length*sizeof(float));cos_tbl=(float *)malloc(length*sizeof(float));buf=(float *)malloc...
  • 姹傜敤C璇█瀹炵幇FFT鍙樻崲鐨勭▼搴(瑙佷笅闈)
    绛旓細1锛夌粨鏋滆璁 涓锛屽鏋滃淇″彿杩涜鍚屾牱鐐规暟N鐨凢FT鍙樻崲锛岄噰鏍烽鐜噁s瓒婇珮锛屽垯鍙互鍒嗘瀽瓒婇珮棰戠殑淇″彿锛涗笌姝ゅ悓鏃讹紝閲囨牱棰戠巼瓒婁綆锛屽浜庝綆棰戜俊鍙风殑棰戣氨鍒嗚鲸鐜囧垯瓒婂ソ銆備簩锛屽亣璁鹃噰鏍风偣涓嶅湪姝e鸡淇″彿鐨勬尝宄般佹尝璋枫佷互鍙0鐢靛帇澶勶紝棰戣氨鍒欎細浜х敓娉勯湶锛坙eakage锛夈備笁锛屽浜庡悓鏍风殑閲囨牱鐜噁s锛屾彁楂楩FT鐨勭偣鏁癗锛屽垯鍙彁楂橀璋辩殑...
  • 寰垎鏂圭▼缁勫苟琛屽寲姹傝В
    绛旓細寰垎鏂圭▼缁勫苟琛屽寲姹傝В 20 閽堝寰垎鏂圭▼缁勭殑姹傝В,閲囩敤c璇█骞惰鍖栧伐鍏瀹炵幇骞惰鍖栨眰瑙,涓昏鏄绠楁硶鐨鐮旂┒,姣斿瀵归緳鍝ュ簱濉旀硶杩涜骞惰鍖栧鐞,缁欑偣璧勬枡涔熻銆... 閽堝寰垎鏂圭▼缁勭殑姹傝В,閲囩敤c璇█骞惰鍖栧伐鍏峰疄鐜板苟琛屽寲姹傝В,涓昏鏄畻娉曠殑鐮旂┒,姣斿瀵归緳鍝ュ簱濉旀硶杩涜骞惰鍖栧鐞,缁欑偣璧勬枡涔熻銆 灞曞紑  鎴戞潵绛 ...
  • c璇█绋嬪簭璁捐鐨勯粍瀹广佽档姣呬富缂
    绛旓細绠鍗曠殑鍒嗘敮缁撴瀯绋嬪簭鐨勭紪鍐欙級2.3.1绋嬪簭瑙f瀽2.3.2鍏崇郴杩愮畻2.3.3if鈥lse浜屽垎鏀鍙2.3.4鏍煎紡鍖栬緭鍏ュ嚱鏁皊canf2.4璁$畻鑷敱钀戒綋鍙嶅脊楂樺害鍜屾昏窛绂伙紙绠鍗曠殑寰幆缁撴瀯绋嬪簭鈥斺攆or璇彞鐨勭紪鍐欙級2.4.1鎸囧畾娆℃暟鐨勫惊鐜▼搴忚璁2.4.2for璇彞2.4.3璁$畻鑷敱钀戒綋鍙嶅脊楂樺害鍜屾昏窛绂2.4....
  • C璇█绠楁硶閫熸煡鎵嬪唽鐨勭洰褰
    绛旓細16.1 蹇熷倕閲屽彾鍙樻崲 66216.1.1 [绠楁硶159] 澶嶆暟鎹揩閫熷倕閲屽彾鍙樻崲 66216.1.2 [绠楁硶160] 澶嶆暟鎹揩閫熷倕閲屽彾閫嗗彉鎹 66616.1.3 [绠楁硶161] 瀹炴暟鎹揩閫熷倕閲屽彾鍙樻崲 66916.1.4 銆愬疄渚94銆 楠岃瘉鍌呴噷鍙跺彉鎹㈢殑鍑芥暟 67116.2 鍏朵粬甯哥敤鍙樻崲 67416.2.1 [绠楁硶162] 蹇熸矁灏斾粈鍙樻崲 67416.2.2 [绠楁硶163] 蹇熷搱杈剧帥鍙樻崲 ...
  • 鍦∕ATLAB涓敤鍌呴噷鍙剁畻娉姹傚彇涓缁勭鏁g殑鏁版嵁鐨勫熀娉㈠垎閲 鎬庝箞姹?
    绛旓細matlab鐨勫畨瑁呰繃绋嬫湁涓涓夐」锛屽氨鏄畨瑁呭府鍔╂枃妗o紝涓鑸兘鏈夈備綘鍦ㄥ府鍔╄彍鍗曢噷闈㈣皟鍑烘潵鐪嬬湅灏辩煡閬揻ilter鍑芥暟鎬庝箞鐢ㄤ簡銆傝繖绉嶇紪绋嬮棶棰橀兘鍙互閫氳繃瀵熺湅鏂囨。瑙e喅鐨勩
  • c璇█闅句箞?
    绛旓細浣犲ソ锛屽緢楂樺叴涓轰綘瑙g瓟锛氳绠楁満C璇█鏄竴闂ㄩ氱敤璁$畻鏈虹紪绋嬭瑷锛屼笉闅惧銆侰璇█鐨勮璁$洰鏍囨槸鎻愪緵涓绉嶈兘浠ョ畝鏄撶殑鏂瑰紡缂栬瘧銆佸鐞嗕綆绾у瓨鍌ㄥ櫒銆佷骇鐢熷皯閲忕殑鏈哄櫒鐮佷互鍙婁笉闇瑕佷换浣曡繍琛岀幆澧冩敮鎸佷究鑳借繍琛岀殑缂栫▼璇█銆傚敖绠璇█鎻愪緵浜嗚澶氫綆绾у鐞嗙殑鍔熻兘锛屼絾浠嶇劧淇濇寔鐫鑹ソ璺ㄥ钩鍙扮殑鐗规э紝浠ヤ竴涓爣鍑嗚鏍煎啓鍑鐨凜璇█绋嬪簭鍙...
  • DSP鎺у埗鍣ㄥ師鐞嗗強搴旂敤鐨勫悓鍚嶅浘涔
    绛旓細鍏ㄩ潰浠嬬粛浜員I2000绯诲垪DSP鐨勭‖浠剁粨鏋勩佹帴鍙f妧鏈佹暟鍊艰繍绠楀熀纭銆佹寚浠ょ郴缁熴佺▼搴忕粨鏋勪笌璁捐鏂规硶銆CC(Code Composer锛屼唬鐮佺敓鎴愬櫒)闆嗘垚寮鍙戠幆澧冦丆缂栬瘧鍣ㄣ丏SP姹囩紪璇█涓C璇█娣峰悎缂栫▼瑙勫垯銆佸父鐢–璇█鍑芥暟搴撱佸吀鍨嬫暟瀛椾俊鍙峰鐞绠楁硶鈥斺蹇熷倕閲屽彾鎹FT銆丗IR鏁板瓧婊ゆ尝鍣ㄣ両IR鏁板瓧婊ゆ尝鍣ㄧ殑DSP瀹炵幇鏂规硶绛夈傝缁嗕粙缁嶄簡...
  • 扩展阅读:傅里叶级数的基本公式 ... 傅里叶级数画图教程 ... 快速傅里叶变换fft图像 ... 傅里叶级数完整公式 ... 扫一扫题目出答案 ... 傅里叶变换计算器app ... 傅里叶变换全部公式 ... 傅里叶和函数怎么算 ... python快速傅里叶变换 ...

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