2015-06-08 94 views
-1

我有一個信號,我想提取頻率介於14赫茲至14.4赫茲之間。我使用butterworth這樣的帶通濾波器,但答案是不可接受的。現在我想知道如何使用FFT濾波器來獲得我的頻率。 我寫這篇文章的代碼在MATLAB:信號的FFT濾波

clc; 
clear all; 
load('SignalData2'); 
[n,c] = size(mydata2); 
mydata1 = mydata2(1:n,1); 
% my sample rate is 39500 or datalenth/4 
fs = n/4;  % Sampling rate [Hz] 
Ts = 1/fs;  % Sampling period [s] 
fNy = fs/2; % Nyquist frequency [Hz] 
noSamples = n; % Number of samples 
f = 0 : fs/noSamples : fs - fs/noSamples; % Frequency vector 
figure; 
subplot(2,2,1); 
plot(mydata1); 
x_fft = abs(fft(mydata1)); 
subplot(2,2,2); 
plot(f,x_fft); 
xlim([1 150]); 
bw=0.2;  %Bandwisth 
fc=pi*14.2;  %Center Frequency 
L = n;  % sample number; 
%Compute Hamming window 
for nn=1:L 
    hamm(nn)=(0.54-0.46*cos(2*pi*nn/L)); 
end 
%Compute Filter 
hsuup=(-(L-1)/2:(L-1)/2); 
hideal1=hamm.*(2*(fc+bw)*(sin(2*(fc+bw)*hsuup/fs)./(2*(2*fc+bw)*hsuup/fs))); 
hideal2=hamm.*(2*(fc-bw)*(sin(2*(fc-bw)*hsuup/fs)./(2*(2*fc+bw)*hsuup/fs))); 
h_bpf=(hideal1-hideal2); 
comp_sig_fft=fft(mydata1)'/L; 
h_bpf_fft=fft(h_bpf) /L; 
s100_fft=comp_sig_fft.*h_bpf_fft; 
band_passed_signal=real(ifft(s100_fft)); 
subplot(2,2,3); 
plot(band_passed_signal); 
% 
x_fft = abs(fft(band_passed_signal)); 
subplot(2,2,4); 
plot(f,x_fft); 
xlim([1 150]); 

和我上載的信號文件在此鏈接: http://wikisend.com/download/428686/SignalData2.mat

但濾波器信號是NaN。 有沒有解決這個問題的想法? 結果圖像: http://i58.tinypic.com/11ukn61.jpg

回答

2

fft(h_bpf)結果是NaN,因爲你必須在輸入h_bpf一個NaN值。該值由表達式引入像sin(x)/x,其中x = 0,當計算hideal1hideal2

> find(isnan(hideal1)) 

ans = 

     78443 

嘗試使用sinc函數而不是如果需要這樣的計算。

+2

正確,'hsuup'爲中心值0,導致'0/0' *錯誤*。 – rst

+0

謝謝。回覆。我怎樣才能使用我的窗口。我的窗戶是海明。 –