2013-01-25 205 views
0

我想實現一個消除較高頻率的濾波器。在這個例子中,我想消除sin曲線並保持線性曲線。在matlab中實現低通濾波器

編輯:

我糾正我的代碼,但是,我爲濾波實現的功能改變數據的邊緣顯著這是不能接受的。

clc; clear all; 
xaxis = linspace(1, 10, 1000); 
data = xaxis + sin(xaxis*3); 
Nf = 2^12; 
xAxisf = linspace(-10,10,Nf); 
% plot(xaxis, data); 

% FFT 

xsize = numel(data);  
Xf = zeros([1 Nf]); 
indices = Nf/2-floor(xsize/2):Nf/2-floor(xsize/2)+xsize - 1; 
Xf(indices) = data; 

% Xf = fftshift(Xf); 
Xf = fft(Xf); 
Xf = fftshift(Xf); 

% plot 
Xfa = abs(Xf); plot(xAxisf, Xfa); 

% generate super-gaussian filter function 
Nf = numel(Xf);  
widthfilter = 0.12; 
filterpower = 2; 
filter = exp(-(xAxisf.^2./widthfilter^2).^filterpower); 

% filter 
filtertimes = 20; 
Xf = Xf .* filter.^filtertimes; 

% plot 
Xfa = abs(Xf); plot(Xfa); 

% iFFt 
Xfs = ifftshift(Xf); 
Xif = ifft(Xfs); 
% Xif = ifftshift(Xif); 
result = abs(Xif); 

plot(result(indices)) 
+1

因爲你在做逆變換之前已經採用了abs。 –

+0

你說得對。腹肌只用於繪製需要。然而,過濾目前也不起作用。 –

回答

4

第一個問題:

Xf = fftshift(data);  % NOT NEEDED 
    Xf = fft(Xf); 
    Xf = fftshift(Xf); 

FFT之前,不要fftshift數據。這種轉變只在fft後才需要。這是因爲在這個過程中,基數n(可能是2)fft「抽取」了數據。您之前無需修復它,因爲它沒有被刪除。

第二問題:

Xfs = ifftshift(Xf); 
    Xif = ifft2(Xfs);    
    Xif = ifftshift(Xif); % NOT NEEDED 

ifftshift重新抽取的數據(撤銷fftshift),該IFFT需要作爲輸入。如果輸入已經被抽取,ifft的輸出重建原始信號。之後不要移位。

第三個問題:

Xfs = ifftshift(Xf); 
    Xif = ifft2(Xfs);  % USE ifft INSTEAD OF ifft2  
    Xif = ifftshift(Xiff); 

世界你爲什麼要切換到2D IFFT突然?

我沒有詳細看過濾器代碼,但我想說一句,如果你想要一個低通濾波器,它需要圍繞中點對稱。否則你的頻率響應是不對稱的,你會在一堆想象中結束。

並請更改您的標題。這不是一個「傅立葉過濾器」。這是一個使用窗口方法和fft的低通濾波器。窗口,你在頻率空間中應用一個窗口。

好的,這是遲到了,我正在來回胡思亂想......只是想幫助。對我來說更快爲您寫代碼。

如果您在代碼中尋找過濾器的效果,那麼您將無法完成這項工作,因爲過濾器的截止頻率過高和/或數據中正弦波的頻率太低。這是一個版本,我增加了輸入正弦波的振盪頻率:

clc; clear all; 
xaxis = linspace(1, 10, 1000); 
data = xaxis + sin(xaxis*10); 
% plot(xaxis, data); 

% FFT 
Xf = data; 
Xf = fft(Xf); 
Xf = fftshift(Xf); 

% generate super-gaussian filter function 
Nf = numel(data); 
xAxisf = linspace(-5,5,Nf); 
widthfilter = 0.1; 
filterpower = 2; 
filter = exp(-(xAxisf.^2./widthfilter^2).^filterpower); 

% filter 
filtertimes = 1; 
Xf = Xf .* filter.^filtertimes; 

% plot 
Xfa = abs(Xf); plot(Xfa); 

% iFFt 
Xfs = ifftshift(Xf); 
Xif = ifft(Xfs); 
result = abs(Xif); 

plot(result); hold on; plot(data,'r'); 
    legend('filtered','data'); 

要睡覺。晚安!做了我的公共服務:p

+0

fft2來自我從中複製它的代碼。但是,這並沒有太大的改變。這種轉變可能並非必要,但也不會改變它。低通濾波器應該是對稱的。我不明白爲什麼它不應該是對稱的。 –

+0

請將新代碼添加到您的帖子中 – thang

+0

用我當前的代碼更新了修改。我現在使用一個更大的數組作爲fft。 –