只是爲了提醒自己如何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')
完整的低通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')
正如你所看到的,重建要好得多這種方式。
您的過濾器需要與信號對稱。你爲什麼期望min和max不會改變?沒有理由。 – thang 2015-03-02 16:35:05
請注意,嘗試在頻域中應用像這樣的「磚牆」過濾器會產生令人討厭的人爲現象 - 您需要在頻域(通常是窗口函數)中使用平滑函數。還要注意你的濾波器增益沒有被標準化,並且@thang指出,你的濾波器應該是對稱的,否則你會得到複雜的時域輸出數據。 – 2015-03-02 16:42:07