求用C语言实现FFT变换的程序(见下面) 求用matlab或者C语言实现的FFT变换程序

\u6c42\u7528matlab\u6216\u8005C\u8bed\u8a00\u5b9e\u73b0\u7684FFT\u53d8\u6362\u7a0b\u5e8f

\u4f60\u597d\uff0c\u8fd9\u662f\u6211\u7684\u56de\u7b54\uff0c\u5e0c\u671b\u53ef\u4ee5\u5e2e\u5230\u4f60\u3002

1\uff09\u7ed3\u679c\u8ba8\u8bba

\u4e00\uff0c\u5982\u679c\u5bf9\u4fe1\u53f7\u8fdb\u884c\u540c\u6837\u70b9\u6570N\u7684FFT\u53d8\u6362\uff0c\u91c7\u6837\u9891\u7387fs\u8d8a\u9ad8\uff0c\u5219\u53ef\u4ee5\u5206\u6790\u8d8a\u9ad8\u9891\u7684\u4fe1\u53f7\uff1b\u4e0e\u6b64\u540c\u65f6\uff0c\u91c7\u6837\u9891\u7387\u8d8a\u4f4e\uff0c\u5bf9\u4e8e\u4f4e\u9891\u4fe1\u53f7\u7684\u9891\u8c31\u5206\u8fa8\u7387\u5219\u8d8a\u597d\u3002

\u4e8c\uff0c\u5047\u8bbe\u91c7\u6837\u70b9\u4e0d\u5728\u6b63\u5f26\u4fe1\u53f7\u7684\u6ce2\u5cf0\u3001\u6ce2\u8c37\u3001\u4ee5\u53ca0\u7535\u538b\u5904\uff0c\u9891\u8c31\u5219\u4f1a\u4ea7\u751f\u6cc4\u9732\uff08leakage\uff09\u3002

\u4e09\uff0c\u5bf9\u4e8e\u540c\u6837\u7684\u91c7\u6837\u7387fs\uff0c\u63d0\u9ad8FFT\u7684\u70b9\u6570N\uff0c\u5219\u53ef\u63d0\u9ad8\u9891\u8c31\u7684\u5206\u8fa8\u7387\u3002

\u56db\uff0c\u5982\u679c\u91c7\u6837\u9891\u7387fs\u5c0f\u4e8e2\u500d\u4fe1\u53f7\u9891\u73872*fs\uff08\u5948\u572d\u65af\u7279\u5b9a\u7406\uff09\uff0c\u5219\u9891\u8c31\u5206\u6790\u7ed3\u679c\u4f1a\u51fa\u9519\u3002

\u4e94\uff0c\u5bf9\u4e8e\uff08\u4e8c\uff09\u4e2d\u6cc4\u9732\u73b0\u8c61\uff0c\u53ef\u4ee5\u901a\u8fc7\u5728\u4fe1\u53f7\u540e\u9762\u8865\u96f6\u70b9\u89e3\u51b3\u3002


2\uff09\u7a0b\u5e8f\u53ca\u6ce8\u89e3\u5982\u4e0b

%\u6e05\u9664\u547d\u4ee4\u7a97\u53e3\u53ca\u53d8\u91cf
clc;
clear all;

%\u8f93\u5165f\u3001N\u3001T\u3001\u662f\u5426\u8865\u96f6\uff08\u8865\u51e0\u4e2a\u96f6\uff09
f=input('Input frequency of the signal: f\n');
N=input('Input number of pointsl: N\n');
T=input('Input sampling time: T\n');
flag=input('Add zero too sampling signal or not? yes=1 no=0\n');
if(flag)
ZeroNum=input('Input nmber of zeros\n');
else
ZeroNum=0;
end

%\u751f\u6210\u4fe1\u53f7\uff0csignal\u662f\u539f\u4fe1\u53f7\u3002signal\u4e3a\u91c7\u6837\u4fe1\u53f7\u3002
fs=1/T;
t=0:0.00001:T*(N+ZeroNum-1);
signal=sin(2*pi*f*t);
t2=0:T:T*(N+ZeroNum-1);
signal2=sin(2*pi*f*t2);
if (flag)
signal2=[signal2 zeros(1, ZeroNum)];
end

%\u753b\u51fa\u539f\u4fe1\u53f7\u53ca\u91c7\u6837\u4fe1\u53f7\u3002
figure;
subplot(2,1,1);
plot(t,signal);
xlabel('Time(s)');
ylabel('Amplitude(volt)');
title('Singnal');
hold on;
subplot(2,1,1);
stem(t2,signal2,'r');
axis([0 T*(N+ZeroNum) -1 1]);


%\u4f5cFFT\u53d8\u6362\uff0c\u8ba1\u7b97\u5176\u5e45\u503c\uff0c\u5f52\u4e00\u5316\u5904\u7406\uff0c\u5e76\u753b\u51fa\u9891\u8c31\u3002
Y = fft(signal2,N);
Pyy = Y.* conj(Y) ;
Pyy=(Pyy/sum(Pyy))*2;
f=0:fs/(N-1):fs/2;4
subplot(2,1,2);
bar(f,Pyy(1:N/2));
xlabel('Frequency(Hz)');
ylabel('Amplitude');
title('Frequency compnents of signal');
axis([0 fs/2 0 ceil(max(Pyy))])
grid on;

\u795d\u4f60\u597d\u8fd0\uff01

\u6211\u4e5f\u5199\u4e86\u4e2afft\u7a0b\u5e8f\uff0c256\u70b9\u65f6\u8ba1\u7b97\u8fd8\u6b63\u786e\uff0c\u4f46\u662f512\u548c1024\u70b9\u7ed3\u679c\u5c31\u9519\u4e86\uff0c\u5e0c\u671b\u697c\u4e3b\u7b54\u6848\u7684\u8bdd\u80fd\u544a\u77e5\uff0c

你好,这是我的回答,希望可以帮到你。

1)结果讨论

一,如果对信号进行同样点数N的FFT变换,采样频率fs越高,则可以分析越高频的信号;与此同时,采样频率越低,对于低频信号的频谱分辨率则越好。

二,假设采样点不在正弦信号的波峰、波谷、以及0电压处,频谱则会产生泄露(leakage)。

三,对于同样的采样率fs,提高FFT的点数N,则可提高频谱的分辨率。

四,如果采样频率fs小于2倍信号频率2*fs(奈圭斯特定理),则频谱分析结果会出错。

五,对于(二)中泄露现象,可以通过在信号后面补零点解决。

2)程序及注解如下

%清除命令窗口及变量
clc;
clear all;

%输入f、N、T、是否补零(补几个零)
f=input('Input frequency of the signal: f\n');
N=input('Input number of pointsl: N\n');
T=input('Input sampling time: T\n');
flag=input('Add zero too sampling signal or not? yes=1 no=0\n');
if(flag)
ZeroNum=input('Input nmber of zeros\n');
else
ZeroNum=0;
end

%生成信号,signal是原信号。signal为采样信号。
fs=1/T;
t=0:0.00001:T*(N+ZeroNum-1);
signal=sin(2*pi*f*t);
t2=0:T:T*(N+ZeroNum-1);
signal2=sin(2*pi*f*t2);
if (flag)
signal2=[signal2 zeros(1, ZeroNum)];
end

%画出原信号及采样信号。
figure;
subplot(2,1,1);
plot(t,signal);
xlabel('Time(s)');
ylabel('Amplitude(volt)');
title('Singnal');
hold on;
subplot(2,1,1);
stem(t2,signal2,'r');
axis([0 T*(N+ZeroNum) -1 1]);

%作FFT变换,计算其幅值,归一化处理,并画出频谱。
Y = fft(signal2,N);
Pyy = Y.* conj(Y) ;
Pyy=(Pyy/sum(Pyy))*2;
f=0:fs/(N-1):fs/2;4
subplot(2,1,2);
bar(f,Pyy(1:N/2));
xlabel('Frequency(Hz)');
ylabel('Amplitude');
title('Frequency compnents of signal');
axis([0 fs/2 0 ceil(max(Pyy))])
grid on;

祝你好运!
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。

这是一个傅里叶变化的子函数,你可以自己做主函数传递你这里的参数验证
// 入口参数:
// l: l = 0, 傅立叶变换; l = 1, 逆傅立叶变换
// il: il = 0,不计算傅立叶变换或逆变换模和幅角;il = 1,计算模和幅角
// n: 输入的点数,为偶数,一般为32,64,128,...,1024等
// k: 满足n=2^k(k>0),实质上k是n个采样数据可以分解为偶次幂和奇次幂的次数
// pr[]: l=0时,存放N点采样数据的实部
// l=1时, 存放傅立叶变换的N个实部
// pi[]: l=0时,存放N点采样数据的虚部
// l=1时, 存放傅立叶变换的N个虚部
//
// 出口参数:
// fr[]: l=0, 返回傅立叶变换的实部
// l=1, 返回逆傅立叶变换的实部
// fi[]: l=0, 返回傅立叶变换的虚部
// l=1, 返回逆傅立叶变换的虚部
// pr[]: il = 1,l = 0 时,返回傅立叶变换的模
// il = 1,l = 1 时,返回逆傅立叶变换的模
// pi[]: il = 1,l = 0 时,返回傅立叶变换的辐角
// il = 1,l = 1 时,返回逆傅立叶变换的辐角

void kbfft(double *pr,double *pi,int n,int k,double *fr,double *fi,int l,int il)
{
int it,m,is,i,j,nv,l0;
double p,q,s,vr,vi,poddr,poddi;

//排序
for (it=0; it<=n-1; it++)
{ m=it; is=0;
for (i=0; i<=k-1; i++)
{ j=m/2; is=2*is+(m-2*j); m=j;
fr[it]=pr[is]; fi[it]=pi[is];
}
}

//蝶形运算
pr[0]=1.0; pi[0]=0.0;
p=6.283185306/(1.0*n);
pr[1]=cos(p); pi[1]=-sin(p);
if (l!=0) pi[1]=-pi[1];
for (i=2; i<=n-1; i++)
{ p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
pr[i]=p-q; pi[i]=s-p-q;
}
for (it=0; it<=n-2; it=it+2)
{ vr=fr[it]; vi=fi[it];
fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
}
m=n/2; nv=2;
for (l0=k-2; l0>=0; l0--)
{ m=m/2; nv=2*nv;
for (it=0; it<=(m-1)*nv; it=it+nv)
for (j=0; j<=(nv/2)-1; j++)
{ p=pr[m*j]*fr[it+j+nv/2];
q=pi[m*j]*fi[it+j+nv/2];
s=pr[m*j]+pi[m*j];
s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
poddr=p-q; poddi=s-p-q;
fr[it+j+nv/2]=fr[it+j]-poddr;
fi[it+j+nv/2]=fi[it+j]-poddi;
fr[it+j]=fr[it+j]+poddr;
fi[it+j]=fi[it+j]+poddi;
}
}
if (l!=0)
for (i=0; i<=n-1; i++)
{ fr[i]=fr[i]/(1.0*n);
fi[i]=fi[i]/(1.0*n);
}
if (il!=0)
for (i=0; i<=n-1; i++)
{ pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
pr[i]=(pr[i]/(n/2)); //各次谐波幅值,其中pr[1]为基波幅值
if (fabs(fr[i])<0.000001*fabs(fi[i]))//fabs()是取绝对值函数,浮点型的0 在内存中并不是严格等于0,可以认为当一个浮点数

离原点足够近时,也就是f>0.00001 && f<-0.00001,认为f是0
{ if ((fi[i]*fr[i])>0) pi[i]=90.0;
else pi[i]=-90.0;
}
else
pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
}
return;
}

  • 鎬ユ眰 蹇熷倕閲屽彾鍙樻崲鐨勭▼搴 浼氱殑澶т緺甯繖鍋氫竴涓獈
    绛旓細浠ュ墠鐢FFT閮芥槸鐩存帴鐢∕atlab閲岄潰鐨勶紝鍙槸濡傛灉瀹為檯宸ョ▼閲岄潰闇瑕侊紝杩樻槸寰楀啓涓涓C璇█鐗堟湰鐨勩侰++澶勭悊澶嶆暟姣旇緝瀹规槗锛屼絾鐩墠宓屽叆寮忓紑鍙戣繕鏄疌璇█鐨勫ぉ涓嬶紝鍥犳C璇█鐨凢FT搴旂敤璧锋潵鏇存柟渚裤傚啓瀹岃创鍑烘潵锛屽笇鏈涘澶у鏈変竴浜涘府鍔┿傝创鍑烘潵鎺掔増鍙兘鏈夌偣涔憋紝閭d笉鏄垜鐨勫師鍥狅紝鎴戝啓鐨勭▼搴閮芥槸鏁存暣榻愰綈鐨勶紝鍙互鐩存帴鐐瑰嚮鏂囩珷...
  • fft绠楁硶c璇█瀹炵幇璇﹁Вfft绠楁硶
    绛旓細鍏充簬fft绠楁硶c璇█瀹炵幇璇﹁В锛宖ft绠楁硶杩欎釜寰堝浜鸿繕涓嶇煡閬擄紝浠婂ぉ鏉ヤ负澶у瑙g瓟浠ヤ笂鐨勯棶棰橈紝鐜板湪璁╂垜浠竴璧锋潵鐪嬬湅鍚э紒1銆佸揩閫熷倕閲屽彾鍙樻崲锛屾槸璁$畻鏈虹畻鍌呴噷鍙鍙樻崲鐨甯哥敤鏂规硶銆2銆併FFT锛團ast Fourier Transformation锛夛紝鍗充负蹇熷倕姘忓彉鎹紝鏄鏁e倕姘忓彉鎹㈢殑蹇熺畻娉曪紝瀹冩槸鏍规嵁绂绘暎鍌呮皬鍙樻崲鐨勫銆佸伓銆佽櫄銆佸疄绛夌壒鎬...
  • 璺眰澶у笀鐢–璇█甯垜缂栦竴涓8鐐瑰熀-2鎸夋椂闂存娊鍙栫殑FFT绋嬪簭
    绛旓細鐢ㄩ掑綊搴旇姣旇緝瀹规槗鍐欑殑锛 铏界劧鏁堢巼宸竴浜 澶ф鎬濊矾锛氱敤涓涓嚱鏁板仛鍑嗗锛氭妸鏁扮粍鎺掑垪鎴愬埌浣嶅簭 璁$畻Wn 瀵规暣涓暟缁勮皟鐢 do_fft鍑芥暟 do_fft鍑芥暟锛氬鏋滈渶瑕佽绠楃殑搴忓垪闀夸负2锛屼袱涓綅缃垎鍒啓涓簒[0]+x[1]鍜寈[0]-x[1]鐒跺悗杩斿洖 瀵归渶瑕佽绠楃殑搴忓垪鍓嶅崐閮ㄥ垎璋冪敤do_fft鍑芥暟 瀵归渶瑕佽绠楃殑搴忓垪鍚庡崐鍓湰璋冪敤do...
  • C璇█浠庝袱涓枃浠朵腑鎻愬彇鏁版嵁缁欎竴涓鏁鐨瀹為儴鍜岃櫄閮,浣嗗湪杩愮畻鐨勬椂鍊欒繖...
    绛旓細C璇█浠庝袱涓枃浠朵腑鎻愬彇鏁版嵁缁欎竴涓鏁扮殑瀹為儴鍜岃櫄閮,浣嗗湪杩愮畻鐨勬椂鍊欒繖涓や釜閮ㄥ垎涓嶈兘涓涓瀵瑰簲,鎬庝箞瑙e喅 10 绋嬪簭濡備笅#include<stdio.h>#include<math.h>#include<stdlib.h>#defineN1024/*瀹氫箟澶嶆暟绫诲瀷*/typedefstruct{doublereal;doubleimg;}complex;complexx[N],*W;/*杈撳叆搴忓垪,鍙樻崲鏍*/intsi... 绋嬪簭濡備笅#...
  • C璇█杈撳嚭鍒版枃浠跺憪,灏辨槸涓涓fft鐨缁撴灉杈撳嚭鏉ユ眰鎸囩偣鍟
    绛旓細freopen("in.txt","r",stdin);//鏂囦欢杈撳叆 freopen("out.txt","w",stdout);//鏂囦欢杈撳嚭 澶存枃浠#include<stdlib.h> using namespace std;
  • ...鎴栬呭叾浠璇█缂栫▼瀹炵幇8鐐瑰簭鍒鐨鍩2-DIT-FFT绠楁硶,骞跺缁撴灉杩涜鍒嗘瀽楠...
    绛旓細鍑芥暟鍔熻兘锛氬鎸囧畾闀垮害鐨勯噰鏍锋暟鎹繘琛屽揩閫熷倕绔嬪彾鍙樻崲锛屽苟杩斿洖鍙樻崲鍊, X = FFT(x)鍏ュ彛鍙傛暟锛氱洰鏍囬噰鏍锋暟鎹紝淇濆瓨鍙樻崲鍊肩殑鎸囬拡锛岄噰鏍锋暟鎹暱搴 鍑哄彛鍙傛暟锛氭寚鍚戝彉鎹㈠肩殑鎸囬拡 娉ㄦ剰浜嬮」锛氫繚瀛樼粨鏋滅殑绌洪棿鏄湪鍑芥暟澶栭儴鐢宠锛屾湰鍑芥暟涓嶅鐞嗘鍐呭 /*/ COMPLEX *FFT(COMPLEX *X,COMPLEX *x, unsigned N){ ...
  • ADSP TS201 涓C璇█绋嬪簭濡備綍璋冪敤FFT32姹囩紪绋嬪簭瀹炵幇8192鐐瑰拰16鐐笷FT...
    绛旓細鍙互鐩存帴璋冪敤鍑芥暟void cfftf (in[], out[], twid[], wst, n) 锛沬n[]涓鸿緭鍏ユ暟缁勶紝out[]涓鸿緭鍑虹粨鏋滃瓨鏀剧殑鏁扮粍锛宼wid[]鏄棆杞洜瀛愭暟缁勶紝涔熸槸杈撳叆鍊硷紝wst涓烘棆杞洜瀛愭杩涘硷紝涓鑸彇1灏卞浜嗭紝n灏辨槸FFT鐐规暟銆傝娉ㄦ剰鐨勬槸锛屽鏋鐢╟fftf浠ヤ笂鍓3涓暟缁勯兘瑕佹槸澶嶇殑娴偣鍙橀噺鏁扮粍锛屼篃灏辨槸complex_float褰㈠紡...
  • c璇█闂,姹傞珮鎵嬬紪鍐欎竴涓绋嬪簭 缂栧啓绋嬪簭: (1)姹備竴涓瓧绗︿覆S1鐨闀垮害...
    绛旓細/ 涓瞫 = ads 涓瞭 = fftgds s -> d锛宒 = ads d + t = adsfftgds len of d = 9 璇锋寜浠绘剰閿户缁. . ./ include <stdio.h> int strlen(char *s) { int i,len = 0;for(i = 0; s[i]; ++i) ++len;return len;} char *strcpy(char s2[], char s1[]) { int i;fo...
  • ...璋佹湁鐢╒erilog璇█缂栫▼瀹炵幇FFT(蹇熷倕绔嬪彾鍙樻崲)鐨勭▼搴鍟奯鐧惧害...
    绛旓細// fi[]: l=0, 杩斿洖鍌呯珛鍙鍙樻崲鐨铏氶儴 // l=1, 杩斿洖閫嗗倕绔嬪彾鍙樻崲鐨勮櫄閮 // pr[]: il=1,i=0 鏃讹紝杩斿洖鍌呯珛鍙跺彉鎹㈢殑妯 // il=1,i=1 鏃讹紝杩斿洖閫嗗倕绔嬪彾鍙樻崲鐨勬ā // pi[]: il=1,i=0 鏃讹紝杩斿洖鍌呯珛鍙跺彉鎹㈢殑杈愯 // il=1,i=1 鏃讹紝杩斿洖閫嗗倕绔嬪彾鍙樻崲鐨勮緪瑙 void fft(...
  • c璇█瀹炵幇闊充箰淇″彿鐨蹇熷倕閲屽彾鍙樻崲,涓轰粈涔堣鏈夊懆鏈熶腑鏂潵ad閲囬泦闊充箰...
    绛旓細蹇熷倕閲屽彾鍙樻崲 -- 鏁版嵁鐐规暟 蹇呴』鏄 2 鐨勬暣鏁版鏂癸紝渚嬪 1024锛2048锛4096 銆傘傘備笉瓒虫椂瑕佽ˉ鐐癸紝琛ョ偣鏈夊绉嶆柟娉曪紝鏈甯哥敤鏄ˉ0 鎴 鍋囧畾淇″彿浠庡ご鍐嶆潵銆--- 浣犳兂鐢 40000 hz 閲囨牱棰戠巼锛1绉掑氨瑕佹湁 40000 鐐广傛荤殑淇″彿闀垮害鑻ユ槸鍑犲垎閽燂紝鐐规暟灏卞悡浜哄湴澶氾紝FFT 鑰楁椂涔熻寰堥暱銆備綘涔熻鍙互鎶婁俊鍙峰垎娈...
  • 扩展阅读:学c#有前途吗 ... c# 延时 ... 为什么不建议孩子学编程 ... c#教程电子书 ... c#面试题 ... ctrl c不能用了怎么办 ... 为什么电脑不能用ctrl c了 ... c#开发实战 ... c#入门基础知识 ...

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