2016-04-26 20 views
4

MATLABで信号フィルタリングを行っています。今、私はハニング窓を使用してバンドパスフィルタリングウィンドウで50Hzの信号を抽出したいMATLABで狭帯域フィルタを設計する

Fs = 8000;     %// Sampling frequency 
T = 1/Fs;     %// Sample time 
L = 16000;     %// Length of signal 
t = (0:L-1)*T;    %// Time vector 

y = 40*sin(2*pi*50*t) + 500*sin(2*pi*51*t) + 500*sin(2*pi*49*t); 

Signal y

:私は3つの異なる周波数を有する信号を書きました。ここで
は、フィルタ設計に私のコードです:このフィルタはすることができないのはなぜ

yfilter = filter(Hd.Numerator,1,y); 

NFFT = 2^nextpow2(L); 
Y = fft(yfilter,NFFT)/L; 
f = Fs/2*linspace(0,1,NFFT/2+1); 

figure; 
subplot(2,1,1); 
plot(yfilter); 
subplot(2,1,2); 
plot(f,2*abs(Y(1:NFFT/2+1))) 

filtered Signal

  • :その後

    function Hd = HannFilter1 
    
    Fs = 8000;   %// Sampling Frequency 
    
    N = 4096;  %// Order 
    Fc1 = 49.5;  %// First Cutoff Frequency 
    Fc2 = 50.5;  %// Second Cutoff Frequency 
    flag = 'scale'; %// Sampling Flag 
    win = hann(N+1); 
    
    b = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag); 
    Hd = dfilt.dffir(b); 
    

    を、私はこのようfilterを使用してフィルタリングします50Hzの信号を抽出しますか?

  • 私はこのシミュレーションで何か間違っていますか?
  • 50Hz信号をどのようにフィルタリングできますか?

50Hz信号の最高サンプルレートはどれですか?非常に重要な質問!現実世界では、バランスシステムのように、主信号は約20Hzであり、環境は非常に騒々しく、私の解決策によるフィルタリングは正解を与えません。この場合、どのようにして最良のフィルタリングアルゴリズムを使用または選択できますか?

サンプルレートは8000Hzなると私はが唯一の20000サンプルバッファリングすることができた場合には、どのようには、狭帯域通過フィルタを設計することができますか?

+0

これは不条理な性質の通過帯域です。フィルタの周波数応答を確認しましたか? –

+0

はい、フィルタの応答はOKですが、私が見つけた面白い点があります!私が49Hzと51Hzの信号の振幅を10から500に減らすと、すべて正常に動作します!なぜ?! –

+0

もう一つのポイントがあります!フィルタリングされた信号の振幅の最大値は他の信号と強く関連しています! (49Hzと51Hz)が49Hz信号の振幅が2000(500から)に増加すると、フィルタ結果の振幅が大きくなっています。主信号(50Hz)の振幅は固定されています!私は夢中になる!!!!! –

答えて

0

だから、私は減少サンプルレートによって問題を解決し、このコードでサンプルデータを増やす:

Fs = 1000;     % Sampling frequency 
T = 1/Fs;      % Sample time 
L = 60000;      % Length of signal 
t = (0:L-1)*T;    % Time vector 

for j=1:20 

r1 = 5 + (1000-5).*rand(1,1); 
r2 = 5 + (1000-5).*rand(1,1); 

y = 10*sin(2*pi*14.8*t) + r1*sin(2*pi*14.2*t) + r2*sin(2*pi*15.5*t) + 1.1*rand(size(t)); 


yfilter = filter(Hd.Numerator,1,y); 
max(yfilter(40000:50000)) 

end 

私のフィルタは、KAISER(FIR Badpassフィルタ)である(Mattと言われていた):

Fs = 1000; % Sampling Frequency 

Fstop1 = 14.2;   % First Stopband Frequency 
Fpass1 = 14.6;   % First Passband Frequency 
Fpass2 = 15;    % Second Passband Frequency 
Fstop2 = 15.2;   % Second Stopband Frequency 
Dstop1 = 1e-06;   % First Stopband Attenuation 
Dpass = 0.057501127785; % Passband Ripple 
Dstop2 = 1e-06;   % Second Stopband Attenuation 
flag = 'scale';   % Sampling Flag 

% Calculate the order from the parameters using KAISERORD. 
[N,Wn,BETA,TYPE] = kaiserord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 ... 
          1 0], [Dstop1 Dpass Dstop2]); 

% Calculate the coefficients using the FIR1 function. 
b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag); 
Hd = dfilt.dffir(b); 

であり、フィルタの振幅は20反復およびランダムノイズ信号である。

max(yfilter(40000:50000)) 

10.01 
10.02 
10.01 
10.00 
10.01 
10.03 
10.01 
10.02 
.... 

それは私にとって素晴らしい結果であり、フィルタリングされた信号は、次のとおりです。 Filtered Signal

が、いくつかの問題がある:

1 - 私のサンプルデータの長さは、私は待って、1000Hzを速度をサンプリングすることによって一方では、60000バイトであり、データを収集するために60秒間、それはあまりにも長い時間です! サンプルデータの長さを約3000サンプルに減らすと、フィルタの係数の数が約4097であるため、結果が非​​常に悪いです。 長さが3000サンプルでフィルタの係数が約4097バイトのとき、フィルタの係数を小さくすると、フィルタリングされた信号の結果は非常にノイズが多いです。

2 15 Hzの信号に対して最も良いサンプルレートは何ですか?

ありがとうございました。

関連する問題