www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP iirnotch in matlab


Autor: Sebastian Hain (sebihain)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du nimmst 1kHz samplerate, obwohl Du in der Einleitung von 500Hz 
sprichst. w0 ist auch (vermutlich) bezogen auf 500Hz. Die Nullstellen 
von num/den ausrechnen, dann weiß Du Bescheid!

Cheers
Detlef

Autor: Sebastian Hain (sebihain)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tommi Huber (drmota)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Tommi Huber (drmota)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch das Simulinkmodell.

Autor: Sebastian Hain (sebihain)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.