mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Auslegung digitaler Filter - Abtastraten


Autor: Björn W. (bjoernwe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte ein digitales IIR Filter (Butterworth, 2. Ordnung) erstellen, 
um die fünfte Harmonische eines Motors zu filtern.
Dafür habe ich mir ein Modell mit MATLAB/Simulink erstellt, um die Sache 
mal durchzuspielen.

Dabei habe ich eine eher grundsätzliche Frage, die Abtastfrequenz 
angeht.

Angenommen, ich habe auf dem Controller eine Abtastfrequenz von fs=20kHz 
zur Verfügung. Mein Motor läuft mit eine Drehzahl, sagen wir 100 U/s, 
was dann im Modell einem dreiphasigen Strom mit einer Kreisfrequenz von 
w_rot=100*2*pi entspricht. Diesen Verlauf taste ich  mithilfe von 
Zero-Order_hold Gliedern  mit der Abtastfrequenz fs=20kHz ab, um das 
Signal zu digitalisieren.
Das Filter, ein Bandpass, habe ich in MATLAB ebenfalls mit der 
Abtastrate fs=20kHz designt.

Nun wurde mir gesagt, dass die Abtastraten für mein Filter und die 
Zero-Order-Hold Glieder gleich zu wählen sind, nämlich jeweils die volle 
mögliche Abtastrate fs. Allerdings kommt dabei bei mir nur Müll raus, 
der Filterausgang bleibt auf annähernd Null, was für eine Filterung der 
falschen Frequenz spricht. Der einzige Fall, in welchem mein Filter 
funktioniert, ist, wenn ich die Abtastrate der Zero-Order-Hold-Glieder 
um den Faktor 2*pi erhöhe, also auf fs=2*pi*fs.
(In Echt habe ich diese Frequenz zwar nicht zur Verfügung, aber im 
Modell kann man es ja erst mal machen.)

Kann mir jemand sagen, wieso es nicht mit der gleichen Abtastrate 
klappt,  sondern wieso es NUR mit 2*pi*fs klappt? Gibt es da einen 
festen Zusammenhang?

Ich vermute, ich habe irgendwo einen Denkfehler, wann muss ich bei der 
Berechnung die Kreisfrequenz mit *2*pi anwenden und wann die direkte 
Frequenz? Oder hätte ich die Motordrehzahl gleich mit 100 statt 100*2*pi 
angeben müssen??

Bin für jede Hilfe dankbar!

Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Björn W. schrieb:
> Nun wurde mir gesagt, dass die Abtastraten für mein Filter und die
> Zero-Order-Hold Glieder gleich zu wählen sind,

Wer behauptet so etwas? Einzig müssen die Filterparameter und die 
Abtastrate zusammenpassen um die gewünschte Grenzfequenz zu erreichen.

Autor: Björn W. (bjoernwe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerd schrieb:

> Wer behauptet so etwas? Einzig müssen die Filterparameter und die
> Abtastrate zusammenpassen um die gewünschte Grenzfequenz zu erreichen.

Ja genau, dass die beiden gleich sind ergibt sich ja aus der Berechnung 
meiner Filterkoeffizienten, in die ich ja die Filterabtastzeit bereits 
einsetzen muss.

Dass ich die ZOH-Abtastrate auf die selbe setzen will hat den 
Hintergrund, dass ich ja eine Berenzte Abtastrate von meinem Controller 
vorgegeben habe und die ja möglichst ausnutzen will, um möglichst hohe 
Drehzahlen zu fahren.

Autor: N. M. (mani)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfachste Vermutung: du hättest in Matlab Omega angeben müssen und hast 
f angegeben?

Wie hast du denn den Filter in Matlab berechnet?
Filter Toolbox?
Oder selbst ausgerechnet?

Autor: Detlef _. (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Matlab kann Butterworth Filter basteln:

 butter Butterworth digital and analog filter design.
    [B,A] = butter(N,Wn) designs an Nth order lowpass digital
    Butterworth filter and returns the filter coefficients in length
    N+1 vectors B (numerator) and A (denominator). The coefficients
    are listed in descending powers of z. The cutoff frequency
    Wn must be 0.0 < Wn < 1.0, with 1.0 corresponding to
    half the sample rate.

Die Grenzfrequenz ist, wie die Hilfe sagt, normiert auf 'half the sample 
rate', i.e. Nyquistfrequenz.
Also: Abtastrate 20ks/s, Nyquist also 10ks/s. Die Grundfrequenz des 
Motors ist 100/s, du willst die 5. Oberwellen rausschmeissen, also 
Grenzfrequenz z.B. 150Hz:

[B,A]=butter(2,150/10000);

Klappt wunderbar, hat mit zero-order und w statt f nichts zu tun.

cheers
Detlef

clear
t=0:1/20000:1;
rein=sin(2*pi*100*t)+sin(2*pi*500*t);
[fb,fa]=butter(2,150/10000);
raus=filter(fb,fa,rein);
return

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.

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