Forum: Digitale Signalverarbeitung / DSP IR aus Frequenzkurve?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von ver (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

 wie lässt sich aus einer spektralen Kurve mit x Frequenz und y 
Amplitude die Impulsantwort für einen FIR Filter berechnen?

Gibt es dafür eine Formel, ein Schlagwort und oder ein kostenloses 
(online) Tool?

von Marek N. (bruderm)


Bewertung
0 lesenswert
nicht lesenswert
Inverse Z-transformation liefert die diskrete Impulsantwort.

von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

ver schrieb:
> wie lässt sich aus einer spektralen Kurve mit x Frequenz und y
> Amplitude die Impulsantwort für einen FIR Filter berechnen?

Wenn du nur die Amplitude und nicht den Phasengang hast, wird's keine 
eindeutige Loesung geben. Ansonsten geht das per (inverser) 
Fouriertransformation.

Als kostenloses Tool gibt's z.b. GNU Octave oder irgendwelches 
Python-basiertes Zeugs.

Gruss
WK

von Jan K. (jan_k)


Bewertung
-1 lesenswert
nicht lesenswert
FIR Filter -> die Koeffizienten des Filters sind genau die y-Werte der 
Impulsantwort.

von Jan K. (jan_k)


Bewertung
0 lesenswert
nicht lesenswert
Okay, da hab ich wohl etwas zu schnell überflogen :/

Deine Kurve ist der Amplitudengang (also der Betrag des Frequenzganges, 
siehe https://de.wikipedia.org/wiki/Frequenzgang)? Dann ist das die 
Fouriertransformierte deiner Impulsantwort.

D.h. du müsstest die inverse Fouriertrafo (iFT) berechnen und dann die 
Koeffizienten der Impulsantwort ablesen. Die Länge deiner Fourier Trafo 
bestimmt deine Filterordnung.

Damit das ohne Phase (du hast ja anscheinend nur den Betrag der 
komplexen Zahl, die die iFT erwartet) funktioniert musst du imo 
ausnutzen, dass FIR Filter idR. eine lineare Phase haben. Dann kannst du 
dir den Datensatz der Phase möglicherweise selbst generieren.

Was die Länge des Filters angeht, so bestimmst du die durch die Länge 
der iFT. Du brauchst vermutlich eine Fensterfunktion, damit du keine 
starken Oszillationen bekommst.

Stichworte sind
- FIR Filter design with window method
- FIR Filter system identification (siehe z.B. 
https://de.mathworks.com/help/signal/ref/invfreqz.html)

von Dergute W. (derguteweka)


Bewertung
1 lesenswert
nicht lesenswert
Moin,

Jan K. schrieb:
> funktioniert musst du imo
> ausnutzen, dass FIR Filter idR. eine lineare Phase haben.

Kleiner "Funfact" am Rande: Die Regel, damit FIR Filter eine lineare 
Phase haben, geht so: Die Werte der Koeffizienten muessen punkt- oder 
achsensymmetrisch zur Mitte des Filters sein.

Hier bedeutet das: Wenn die Phase voellig wurscht ist und nur der 
Amplitudengang zaehlt, dann wird ein FIR-Filter mit weniger 
Koeffizienten auskommen, die sind aber wahrscheinlich nicht symmetrisch.
Wenn zum speziellen Amplitudengang noch eine lineare Phase gewuenscht 
ist, dann wuerde ein FIR Filter "laenger", aber dafuer mit symmetrischen 
Koeffizienten.

Gruss
WK

von Jürgen S. (engineer) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Marek N. schrieb:
> Inverse Z-transformation liefert die diskrete Impulsantwort.

Die Frage ist, wie man die aus einer nicht-analytisch beschreibbaren 
Punktemenge bestimmt. Hier muss IMO erst mal eine Ausgleichsfunktion 
her, um die Messfehler rauszunehmen.

Dergute W. schrieb:
> Hier bedeutet das: Wenn die Phase voellig wurscht ist und nur der
> Amplitudengang zaehlt, dann wird ein FIR-Filter mit weniger
> Koeffizienten auskommen,
Naja, viel kann man da aber i.d.R. nicht sparen

von ver (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke, Ihr bietet mir ja jetzt ne Menge an.
Als Noob sind das gleich mehrere Berge vor mir.

Jürgen S. schrieb:
> Marek N. schrieb:
>> Inverse Z-transformation liefert die diskrete Impulsantwort.
>
> Die Frage ist, wie man die aus einer nicht-analytisch beschreibbaren
> Punktemenge bestimmt. Hier muss IMO erst mal eine Ausgleichsfunktion
> her, um die Messfehler rauszunehmen.
Welche Messfehler? Meine Kurve ist doch schön rund.

>
> Dergute W. schrieb:
>> Hier bedeutet das: Wenn die Phase voellig wurscht ist und nur der
>> Amplitudengang zaehlt, dann wird ein FIR-Filter mit weniger
>> Koeffizienten auskommen,
> Naja, viel kann man da aber i.d.R. nicht sparen
Spart man nicht die Hälfte? Bzw. ist die phasenlineare Version nicht 
symmetrisch gespiegelt und somit doppelt so lang?

Jan K. schrieb:
> FIR Filter idR. eine lineare Phase haben. Dann kannst du
> dir den Datensatz der Phase möglicherweise selbst generieren.

Also einfach linear von 0 bis 1?

So wirklich kapiere ich das alles noch nicht...

Siehe angehängte Abbildung:
Habe jetzt experimentell herausgefunden, dass wenn ich (A) einen Cosinus 
mit gedämpfter Schwingung symmetrisch spiegel, (B) dies als 
Coeffizienten für einen FIR Filter nehme, die Cutoff-Frequenz der 
Frequenz des Cosinus entspricht (C) und bei schwacher Dämpfung eine Art 
Bandpass entsteht bzw. sich schon fast eine Resonanz ausbildet.

Mit mehreren solcher gedämpften Cosinus in unterschiedlichen 
Mischungsverhältnissen lässt sich eine komplizierteres Filter bauen.

Welche die jeweils richtige Dämpfung eines jeweiligen Cosinus für die im 
ersten Post gezeigte Kurve ist, wenn ich für jeden Eintrag der Tabelle 
einen Cosinus mit entsprechender Aplitude nehme, ist mir jedoch noch 
nicht klar.

Und vermutlich ist diese experimentelle, naive Herandgehensweise 
hinreichend ineffizient!?

von ver (Gast)


Bewertung
0 lesenswert
nicht lesenswert
* nochmal zur Erklärung der Abbildung:
(A) ist der gedämpfte Cosinus 440Hz (B) gespiegelt und als Koeffizienten 
genutzt und (C) weißes Rauschen gefiltert mit dem Peak bzw Cutoff bei 
440Hz.

Die Kurvenform im ersten Post möchte ich als Filterform.

von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

ver schrieb:
> Und vermutlich ist diese experimentelle, naive Herandgehensweise
> hinreichend ineffizient!?

Jepp :-)

Haeng' doch mal statt dem Bild deiner gewuenschten Filterfunktion die 
gewuenschten Werte fuer die Amplitude (linear, dB, Neper ;-)? ) bei den 
jeweils normierten Frequenzen als Tabelle, moeglichst als .txt file hier 
an einen Post.

Gruss
WK

von ver (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dergute W. schrieb:
> gewuenschten Werte fuer die Amplitude (linear, dB, Neper ;-)? ) bei den
> jeweils normierten Frequenzen als Tabelle

ja mache ich gerne.
Bin mir jetzt nicht sicher, in welchem Format für Euch am sinnvollsten?
Bin da für Wünsche offen.

Wieviele Werte wollt ihr?
Amplituden in dB, ja.
Frequenzen, linear? logarithmisch?
> jeweils normierten Frequenzen
ist das mit Normierung gemeint:
 https://www.eit.hs-karlsruhe.de/mesysto/teil-a-zeitkontinuierliche-signale-und-systeme/zeitkontinuierliche-signale/normierung-von-signalen.html?type=1

?

von Dergute W. (derguteweka)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Hier mal n Beispiel, wo ich mir aus deinem Bild im ersten Post halt mal 
ein .txt file zusammengereimt habe, naemlich dieses hier:
#frequenz   amplitude
0.0            0.0
0.1            0.316
0.2            0.447
0.3            0.548
0.4            0.632
0.5            0.707
0.6            0.775
0.7            0.836
0.75           1.0
0.8            0.836
0.9            0.5
1.0            0.0

Das speichere ich unter z.b. dem Namen firdata.txt ab.
(Da geht dann die Frequenz nicht von z.b. 0..20kHz sondern von 0..1, 
damit das dann 0..20kHz "in Echt" ergibt, muesstest du dein Signal mit 
40KHz abtasten und filtern)

Dann rufe ich GNU Octave auf, dort tipper ich dann mal z.b. folgende 
Befehle, um aus den Daten aus dem Textfile ein FIR zu basteln (Ist 
wahrscheinlich nicht die beste Option, aber so ungefaehr koennts gehen):
load firdata.txt
F=firdata(:,1)
H=firdata(:,2)
B=fir2(32, F, H)
freqz(B)
Der Frequenzgang schaut dann aus, wie auf dem Bild.
Die Koeffizienten waeren dann in B und sehen so aus:

   0.000041516
  -0.000120039
  -0.000689309
   0.000847593
  -0.002759575
   0.001142413
  -0.003202075
  -0.002525494
  -0.004392716
  -0.000398240
  -0.023356514
   0.020245775
  -0.064699116
   0.039641247
  -0.113566500
  -0.074860852
   0.567899857
  -0.074860852
  -0.113566500
   0.039641247
  -0.064699116
   0.020245775
  -0.023356514
  -0.000398240
  -0.004392716
  -0.002525494
  -0.003202075
   0.001142413
  -0.002759575
   0.000847593
  -0.000689309
  -0.000120039
   0.000041516

Gruss
WK

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.