0

次の Matlab スクリプトは、50 Hz と 120 Hz の正弦波で構成される信号をフィルター処理するためのものです。Fp= (2*PI * 30)/1000=0.184 として rad/s で周波数を計算しています。50 Hz と 120 Hz の両方を除外したいので、fp=0.184 と fst=0.185 のままにしました。しかし、フィルターの出力の FFT をプロットすると、50 Hz で正弦波が得られます。この 50Hz の正弦波がフィルタリング後でも発生するのはなぜですか?

プロットにピークがないことが理想的です。

フィルタリング前 ここに画像の説明を入力

フィルタリング後 ここに画像の説明を入力

Fs = 1000;                    % Sampling frequency
T = 1/Fs;    % Sample time
L = 1000;                     % Length of signal
t =(0:L-1)*T;                % Time vector 
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);  % Sum of a 50 Hz sinusoid and a 120 Hz sinusoid %
y = x + 2*randn(size(t));     % Sinusoids plus noise

y = x ;

plot(Fs*t(1:50),y(1:50));title('Signal');xlabel('time (milliseconds)')

%pause;

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1))) 
title('Single-Sided Amplitude Spectrum of y(t)');xlabel('Frequency(Hz)');ylabel('|Y(f)|')


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%       Now let us see Low Pass Filtering of this signal  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Fp= (2*pi * 30)/1000; %=0.184 %only frequncies less than 30Hz will be passed  

d=fdesign.lowpass('Fp,Fst,Ap,Ast',0.184,0.185,2,60);

designmethods(d);

Hd = design(d,'equiripple'); fvtool(Hd);

Filterd_Output = filter(Hd,y);

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Filtered_Freq = fft(Filterd_Output,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Filtered_Freq(1:NFFT/2+1)))
title('Single-Sided Amplitude Spectrum of Low Pass Filtered_Output')
xlabel('Frequency (Hz)');ylabel('|Filtered_Freq_Amplitude|')

更新 提案されたように、元のスペクトルとフィルター処理されたスペクトルを比較しました。これは私に多くを説明します。しかし、この 50 Hz でのスパイクをさらに減らす方法はありますか?

4

1 に答える 1

2

フィルターの正規化された周波数を誤って指定しています。Matlab は、周波数が [0, pi] ではなく [0, 1] であると想定しています。

交換

d=fdesign.lowpass('Fp,Fst,Ap,Ast',0.184,0.185,2,60);

d=fdesign.lowpass('Fp,Fst,Ap,Ast', 2*30/Fs, 2*35/Fs,2,60);

または代わりに

d=fdesign.lowpass('Fp,Fst,Ap,Ast', 30, 35,2,60, Fs);

期待どおりに動作するはずです。

于 2013-02-27T14:11:24.003 に答える