2016-04-26 10 views
4

Ich arbeite an Signalfilterung in MATLAB. Ich schrieb ein Signal mit 3 verschiedenen Frequenzen:Entwerfen eines schmalen Bandpassfilters in 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

Jetzt möchte ich die 50 Hz-Signal durch Bandpassfilterung Fenster zum Extrahieren eines Hanning-Fenster.
Hier ist mein Code, den Filter zu entwerfen:

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); 

Danach, ich Filterung filter wie folgt aus:

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

  • Warum ist das Filter nicht in der Lage zu extrahiere das 50Hz Signal?
  • Ich mache etwas falsch in dieser Simulation?
  • Wie kann ich das 50Hz-Signal herausfiltern?

Was ist die beste Abtastrate für 50Hz-Signal? und sehr wichtige Frage! in der realen Welt, wie Balancing-System, ist das Hauptsignal etwa 20Hz und Umgebung ist sehr zu laut und Filterung durch meine Lösung gibt keine richtige Antwort. Wie kann ich in diesem Fall den besten Filteralgorithmus verwenden oder auswählen?

wenn meine Abtastrate 8000Hz und ich kann nur 20000 Proben gepuffert, wie kann Entwerfen eines Schmalbandfilter?

+0

Dies ist ein absurd Naturpaßband. Haben Sie den Frequenzgang Ihres Filters überprüft? –

+0

ja, Filter Antwort ist in Ordnung, es gibt einen komischen Punkt, dass ich es gefunden habe! Wenn ich die Amplitude von 49 Hz und 51 Hz Signal auf 10 (von 500) verringern, funktioniert alles gut! Warum?! –

+0

gibt es noch einen weiteren Punkt! Maximum der Amplitude des gefilterten Signals hängt stark von anderen Signalen ab! (49Hz und 51Hz) andererseits, wenn die Amplitude des 49Hz-Signals bis zu 2000 ansteigt (von 500), ist die Filterergebnisamplitude aufgewachsen !!! aber Hauptsignal (50Hz) Amplitude ist behoben! ich werde verrückt !!!!! –

Antwort

0

Also, ich lösen Problem durch Verringerung Abtastrate und durch diesen Code Beispieldaten erhöhen: (als Matt war Said)

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 

mein Filter ist KAISER (FIR Badpass Filter):

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); 

und Filteramplitude für 20 Iteration und Zufallsrauschsignal ist:

max(yfilter(40000:50000)) 

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

das ist ein tolles Ergebnis für mich und gefilterte Signal ist: Filtered Signal

aber es gibt ein Problem:

1- meine Beispieldatenlänge ist 60000 Bytes, in anderen durch Rate bei 1000Hz Abtasten, ich warte für 60 Sekunden zum Sammeln von Daten, und das ist zu lange Zeit !!! Wenn ich die Sample-Datenlänge auf etwa 3000 Samples verringern, ist das gefilterte Ergebnis so schlecht, weil die Filterkoeffizienten etwa 4097 sind. Wie kann ich mein Signal filtern, wenn die Länge 3000 Samples beträgt und die Filterkoeffizienten etwa 4097 Bytes sind? Wenn ich die Koeffizienten des Filters erniedrige, ist das Ergebnis des gefilterten Signals so laut.

2- Was ist die beste Abtastrate für 15 Hz-Signal?

danke.

Verwandte Themen