當前位置:編程學習大全網 - 源碼下載 - 求用matlab或者C語言實現的FFT變換程序

求用matlab或者C語言實現的FFT變換程序

妳好,這是我的回答,希望可以幫到妳。

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;

祝妳好運!

  • 上一篇:如何設計Android App測試用例
  • 下一篇:希爾排序圖解流程圖
  • copyright 2024編程學習大全網