2015-03-02 417 views
6

我在matlab中使用前向和後向fft實現了一個簡單的低通濾波器。 它原則上工作,但最小值和最大值不同於原始值。Matlab低通濾波器使用fft

signal = data; 
%% fourier spectrum 
% number of elements in fft 
NFFT = 1024; 
% fft of data 
Y = fft(signal,NFFT)/L; 
% plot(freq_spectrum) 

%% apply filter 
fullw = zeros(1, numel(Y)); 
fullw(1 : 20) = 1; 
filteredData = Y.*fullw; 

%% invers fft 
iY = ifft(filteredData,NFFT); 
% amplitude is in abs part 
fY = abs(iY); 
% use only the length of the original data 
fY = fY(1:numel(signal)); 
filteredSignal = fY * NFFT; % correct maximum 

clf; hold on; 
plot(signal, 'g-') 
plot(filteredSignal ,'b-') 
hold off; 

生成的圖像看起來像這樣

enter image description here

我在做什麼錯?如果我對兩個數據進行歸一化,則過濾後的信號看起來是正確的

+1

您的過濾器需要與信號對稱。你爲什麼期望min和max不會改變?沒有理由。 – thang 2015-03-02 16:35:05

+2

請注意,嘗試在頻域中應用像這樣的「磚牆」過濾器會產生令人討厭的人爲現象 - 您需要在頻域(通常是窗口函數)中使用平滑函數。還要注意你的濾波器增益沒有被標準化,並且@thang指出,你的濾波器應該是對稱的,否則你會得到複雜的時域輸出數據。 – 2015-03-02 16:42:07

回答

14

只是爲了提醒自己如何MATLAB店頻率內容爲Y = fft(y,N)

  • Y(1)是恆定的偏移
  • Y(2:N/2 + 1)是一套正頻率
  • Y(N/2 + 2:end)的是一組負頻率的.. (通常我們會畫這個的縱軸)

爲了製作一個真正的低通濾波器,我們必須保持低正頻率的低頻負的頻率。

下面是在頻域中的乘法矩形過濾器這樣的一個例子,因爲你所做的:

% make our noisy function 
t = linspace(1,10,1024); 
x = -(t-5).^2 + 2; 
y = awgn(x,0.5); 
Y = fft(y,1024); 

r = 20; % range of frequencies we want to preserve 

rectangle = zeros(size(Y)); 
rectangle(1:r+1) = 1;    % preserve low +ve frequencies 
y_half = ifft(Y.*rectangle,1024); % +ve low-pass filtered signal 
rectangle(end-r+1:end) = 1;   % preserve low -ve frequencies 
y_rect = ifft(Y.*rectangle,1024); % full low-pass filtered signal 

hold on; 
plot(t,y,'g--'); plot(t,x,'k','LineWidth',2); plot(t,y_half,'b','LineWidth',2); plot(t,y_rect,'r','LineWidth',2); 
legend('noisy signal','true signal','+ve low-pass','full low-pass','Location','southwest') 

enter image description here

完整的低通fitler做一個更好的工作,但你會注意到重建有點「波浪」。這是因爲在頻域中與矩形函數的乘法與convolution with a sinc function in the time domain相同。用sinc函數進行卷積可以用鄰域的非常不均勻的加權平均代替每個點,從而產生「波浪」效應。

由於the fourier transform of a gaussian is a gaussian,高斯濾波器具有更好的低通濾波器特性。高斯衰落很好地衰減到零,所以它在卷積期間不包括加權平均中的遠隔鄰居。這裏是一個高斯濾波器保留正面和負面的頻率的例子:

gauss = zeros(size(Y)); 
sigma = 8;       % just a guess for a range of ~20 
gauss(1:r+1) = exp(-(1:r+1).^ 2/(2 * sigma^2)); % +ve frequencies 
gauss(end-r+1:end) = fliplr(gauss(2:r+1));   % -ve frequencies 
y_gauss = ifft(Y.*gauss,1024); 

hold on; 
plot(t,x,'k','LineWidth',2); plot(t,y_rect,'r','LineWidth',2); plot(t,y_gauss,'c','LineWidth',2); 
legend('true signal','full low-pass','gaussian','Location','southwest') 

enter image description here

正如你所看到的,重建要好得多這種方式。

+1

非常好的解釋。我承認,我傾向於忘記這個國際空間是摺疊的,並且需要在雙方進行過濾。 – 2015-03-03 08:18:19