iirnotch in matlab

OP #702472
Lesenswert?

hallo forum,

ich muss ein digitales notchfilter (50hz, fs=500hz) erstellen und 
berechnen. Habe mich hier im Forum umgesehen und einige sehr gute sachen 
gefunden. daraus  hab ich mir mal folgendes gebaut (meine 
matlabkentnisse sind sehr beschränkt!):

function test
fs=1000; % doppelte von F-Abtast
%
t = 0:.001:.239; % beliebiger Zeitraum
x = sin(2*pi*50*t)+sin(2*pi*150*t)+sin(2*pi*200*t);
%
[vFrequency,vAmplitude]=test_fft(x,fs);  % FFT mit Hamming Window

w0=50/250;
bw=w0/35;
[num,den]=iirnotch(w0,bw);
x_n=filter(num,den,x);
[f_notch,amp_notch]=test_fft(x_n,fs);

subplot(4,1,1);plot(t,x);title('gestörtes Signal')
subplot(4,1,2);plot(vFrequency, vAmplitude);title('FFT - gestörtes 
Signal')
subplot(4,1,3);plot(t,x_n);title('notch-filter Signal')
subplot(4,1,4);plot(f_notch,amp_notch);title('FFT - notch Signal')
return


Aber leider bekomme ich die 50hz nicht weg!!! Kann mir jemand sagen was 
ich da falsch gemacht habe???

hoffe auf eure hilfe (und hoffe ich hab nichts vergessen zu erwähnen)

vielen Dank
Sebi
OP #703040
Lesenswert?

Hallo Detlef,

ja da mit der Abtastf. ist mir ein fehler unterlaufen, aber wenn ich es 
ändere macht das filter trotzdem nichts. ich bekomme für num und den je 
drei werte. die setze ich dann brav wie matlab es sagt in 
(x_n=filter(num,den,x)) ein, aber die 50hz f. taucht immer noch auf.

w0 = f0/(f_abtast/2) und muss zwischen 0 und 1 liegen
bw = gibt die bandbreite des notch an <1

oder ist das falsch???  ich versteh gar nix mehr.

hoffe du kannst mir weiterhelfen.
Danke Sebi
#703616
Lesenswert?

Die Nullstellen von num und den ausrechnen: roots(num). Da kommen 
jeweils zwei konjugiert komplexe Werte raus. Für richtige num und den 
ist der Winkel dieser beiden Werte +/-(50/1000)*pi. Der Betrag von num 
muß eins sein, der Betrag von den muß gegen 1 gehen für kleiner werdende 
Bandbreite.

Statt iirnotch einfach so:
num = poly([exp(j*50*pi/1000) exp(-j*50*pi/1000)]);
betrag =0.97;
den = poly([betrag*exp(j*50*pi/1000) betrag*exp(-j*50*pi/1000)]);

Cheers
Detlef
#704078
Lesenswert?

Das Notchfilter  funktioniert. Mit

t = (0:1/1024:0.1-1/1024);          %Abtastzeit 1/1024 s
x = sin(2*pi*50*t)+sin(2*pi*150*t)+sin(2*pi*200*t);
y = fft(x);
m = abs(y);
f = (0:length(y)-1)*1023/length(y);
plot(f,y);
w0=50/512;
bw=w0/5;            %ist mit 5 schneller als mit 35
[num,den]=iirnotch(w0,bw);


num,den habe ich dann in ein Simulinkmodell verfrachtet. Dieses  Modell
zeigt (siehe Anhang) dass nach etwa 0.4s die Filterung stattfindet.
Angehängte Dateien:
OP #704583
Lesenswert?

Vielen Dank für eure Antworten,

hat jetzt geklappt. hab aber noch ein verständnisproblem.

w0 wird ja wie folgt definiert --> w0 = f0/(f_abtast/2)

dabei ist f0 die Frequenz die ich nicht haben will und f_abtast eben die 
abtastfrequenz. wenn ich jetzt aber mit w0=50/(500/2) das ganze laufen 
lasse funktioniert es nicht, aber wenn ich mit w0=50/500 setze 
funktioniert es???

und bw gibt mit die Bandweite an? je kleiner bw wird, desto 
wahrscheinlicher ist es, dass er die frequenz nicht mehr ganz filtern 
kann.

Sind diese Überlegungen richtig?? oder alles schachsinn?? kann mir da 
vielleicht jemand licht in mein dunkles hirn bringen?

vielen dank
Sebi

PS: kann jemand ein buch empfehlen das sich mit DSP beschäfftigt - und 
es von anfang an erklärt.(im bestfall noch dazu einfach!!!)   -   DANKE

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren