mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP "IIR Biquad kaskade"oder "was auch immer". Hilfe :-(


Autor: Der Albi (der-albi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. Ich habe einen DAC-Wandler in Betrieb der einen kleinen
Filterblock implementiert hat.

Die Breschreibung lautet wie folgt:
"the DAC digital effects processing includes a fourth-order digital IIR
filter with programmable coefficients (one set per channel). This filter
is implemented as cascade of two biquad sections with frequency response
given by: <Anhang>"

Ich geb zu, von diesen Filtern nicht viel zu verstehen.
Ich hab die Formel einer Klammer mal in ein Programm geschrieben, sodass
man H(z) visualisieren konnte... die Koeffizienten als Schieberegler.
Interessant. Leider sagst mir die Kurve gar nichts wirkliches... ich
weiß auch nicht, in welcher einheit "z" ist.

Es gibt sicher Referenzen, wo beschrieben steht, wie man die vielen Ns
und Ds berechnen muss, damit ein Tiefpass mit 50-200Hz Grenzfrequenz und
+/-15dB verstärung herauskommt... und sicher auch, wie man damit einen
Hochpass gestaltet, der mit einer Grenzfrequenz von 6-15kHz um +/-13dB
abschwächt oder anhebt..


Ich hab gegoogelt.. und z.B: fertige Programme für sowas gesehen.. da
konnte man schön auswählen IIR 4. Ordnung  und die Parameter und das
PRogramm hat mir die Koeffizienten ausgespuckt. Das brauch ich nicht.
Ich will das ganze live im Mikrocontroller berechnen, da mir sonst die
LookUpTabellen zu groß werden. Die koeffizienten hängen ja soweit ich
weiß auch noch von der SamplingFreq. ab..

ich will mit dem Filter hauptsächlich Bass und Höhen/Mitten einstellen.

Kann mir jemand behilflich sein, rauszufinden, wie man ein solchen
Filter mit Koeffizienten versorgt?
Ich wäre sehr dankbar :-)

Achso.. und zum allgemeinen Verständniss für mich:
Ist das wirklich ein IIR 4. Ordnung oder sind das 2 Filter 2. Ordnung,
die hintereinander sind? Also z.B für Bass der erste und für höhen der
2te oder andersrum...?

MFG

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Albi wrote:

> Ich geb zu, von diesen Filtern nicht viel zu verstehen.
ja

> Interessant. Leider sagst mir die Kurve gar nichts wirkliches... ich
> weiß auch nicht, in welcher einheit "z" ist.

Das z hat der Transformation den Namen gegeben.

>
> Es gibt sicher Referenzen, wo beschrieben steht, wie man die vielen Ns
> und Ds berechnen muss, damit ein Tiefpass mit 50-200Hz Grenzfrequenz und
> +/-15dB verstärung herauskommt... und sicher auch, wie man damit einen
> Hochpass gestaltet, der mit einer Grenzfrequenz von 6-15kHz um +/-13dB
> abschwächt oder anhebt..

Willst Du nen Tiefpaß 50-200Hz, 15dB und nen Hochpaß 6-15kHz 13dB bauen? 
Wie breit soll der Übergangsbereich sein, wie steil also die 
Filterflanke. Oder was heißt obiger Satz sonst?

>
> Ich hab gegoogelt.. und z.B: fertige Programme für sowas gesehen.. da
> konnte man schön auswählen IIR 4. Ordnung  und die Parameter und das
> PRogramm hat mir die Koeffizienten ausgespuckt. Das brauch ich nicht.
> Ich will das ganze live im Mikrocontroller berechnen, da mir sonst die
> LookUpTabellen zu groß werden.

Dann muß Du das koeffizientenspuckende Programm auf dem Controller 
implementieren.

>Die koeffizienten hängen ja soweit ich
> weiß auch noch von der SamplingFreq. ab..

Das ist bei digitalen Filtern so.

>
> Achso.. und zum allgemeinen Verständniss für mich:
> Ist das wirklich ein IIR 4. Ordnung oder sind das 2 Filter 2. Ordnung,
> die hintereinander sind? Also z.B für Bass der erste und für höhen der
> 2te oder andersrum...?

Das sind zwei Filter 2.Ordnung hintereinander, die man als Hoch/Tiefpaß 
konfigurieren kann.

Du solltest zunächst mal Deine Filter specen, du weiß schon, mit Masken 
und so. Zweiter Schritt ist es dann die Filter zu entwerfen. Der dritte 
Schritt besteht in der Berechnung der Koeffizienten für verschiedene 
Grenzfrequenzen auf nem uC.

gute Nacht
Detlef

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort, auch wenn ich das Zitiere und 
Auseinanderpflücke nicht mag ;-)

Die Filtereigenschaften soll man direkt auf dem µC einstellen können.
Spezifizieren kann ich nur die Rahmenbedingungen (Bereiche der 
Grenzfrequenzen) für den Tiefpass und den Hochpass aber keine direkten 
Eigenschaften bis jetzt.
Sachen wie die Flankensteilheit kann ich jetzt noch nicht festelgen. Es 
muss gut klingen - es geht ja um Audio. Das muss ich live testen... geht 
aber nicht, solange ich keine Formeln habe.

>Dann muß Du das koeffizientenspuckende Programm auf dem Controller
>implementieren.
Supi. Leider passt ne WindowsExe nicht in meinen AVR32. Sry. :-P

Ich würde gerne auch verschiedene Filtercharakterisiken testen. Also 
Bessel, Tschebyscheff usw (hier geht es ja z.B um Flankensteilheit)

Per google habe ich in zwischen
http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
gefunden. Sehr interessant. Passt sogar für mich. Denke ich.

Leider ist die Beschreibung der Parameter recht knapp :-(.
Also wahrscheinlich ist sie ausreichend.. aber verstehen tue ich sie nur 
mäßig.

Fs: SamplingFreq - ok ;-)
f0: Beim Tiefpass die Eckfrequenz, die -3dB angibt?
    Beim Hochpass die Eckfrequenz, die -3db markiert?
w0: is klar.
Q, BW, S: würde ich jetzt als "Güfefaktor" verstehen.. Kann das aber im
          Zusammenhang mit Hoch/Tiefpass nicht deuten.
          Kann man damit die Flankensteilheit festelgen?

alpha: keine Ahnung, welche Berechnungsvorschrift sinnvoll ist oder
       was sie tut. Die Auswahl scheint damit zu fallen, wie man den
       Filter beschrieben will: mit Q, BW oder S. Wo ist der
       Unterschied?


Es wäre nett, wenn das jemand näher erläutern könnte.
Zusätzlich würde ich mich über die C-Implementation für den oben 
gezeigten Filter freuen. Dann würde anfangen auf dem PC eine kleine 
Simulation zu schreiben. Könnte ich jetzt schon.. aber vollkommen 
unwissend rumzustochern macht mich zum schluss nicht schlauer. Sone 
Simulation soll ja erkenntinisse bringen ;-)

MFG

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Albi wrote:
> Danke für deine Antwort, auch wenn ich das Zitiere und
> Auseinanderpflücke nicht mag ;-)
>

Ich finde das gut. Spart ne Menge Tipparbeit und man kann differenziert 
antworten.

> Die Filtereigenschaften soll man direkt auf dem µC einstellen können.
> Spezifizieren kann ich nur die Rahmenbedingungen (Bereiche der
> Grenzfrequenzen) für den Tiefpass und den Hochpass aber keine direkten
> Eigenschaften bis jetzt.
> Sachen wie die Flankensteilheit kann ich jetzt noch nicht festelgen. Es
> muss gut klingen - es geht ja um Audio. Das muss ich live testen... geht
> aber nicht, solange ich keine Formeln habe.
>
Dann solltest Du für Deinen Tief/Hochpaß jeweils den Beginn und das Ende 
des Transitionbandes vorgeben können, dito die Dämpfungen.

>>Dann muß Du das koeffizientenspuckende Programm auf dem Controller
>>implementieren.
> Supi. Leider passt ne WindowsExe nicht in meinen AVR32. Sry. :-P
>

Die WindowsExe braucht ja auch Windows, das paßt ebenfalls nicht auf den 
Controller. Es ist allerdings auch möglich, ohne Windows Programme zu 
schreiben.

> Ich würde gerne auch verschiedene Filtercharakterisiken testen. Also
> Bessel, Tschebyscheff usw (hier geht es ja z.B um Flankensteilheit)
>

Mach das. Aber nicht auf dem Controller, sondern mit Matlab/Scilab. Der 
Controller wird das filtern nur mit einer Integer-Implementation des 
Filters schaffen. Die integer Implementation eines in float gespecten 
Filters ist nen eigener hack. Also schön trennen: Was will ich? Wie 
kriege ich das auf dem Controller implementiert? Wenn Du das vermischt, 
scheitert das Vorhaben.

> Per google habe ich in zwischen
> http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
> gefunden. Sehr interessant. Passt sogar für mich. Denke ich.
>

Sieht gut aus, das Kochbuch. Aber ist nen Kochbuch, zum Verstehen is das 
nix.

> Es wäre nett, wenn das jemand näher erläutern könnte.
> Zusätzlich würde ich mich über die C-Implementation für den oben
> gezeigten Filter freuen. Dann würde anfangen auf dem PC eine kleine
> Simulation zu schreiben. Könnte ich jetzt schon.. aber vollkommen
> unwissend rumzustochern macht mich zum schluss nicht schlauer. Sone
> Simulation soll ja erkenntinisse bringen ;-)
>

Ja. Machs in Matlab/Scilab, das ist erstmal einfacher und die 
Visualisierung ist besser. C macht dann Sinn zusammen mit der 
integer-Implementation, das ist, wie gasagt, nen eigener hack.

Cheers
Detlef

Autor: Albi G. (deralbi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mit der Integer-Implementation werde ich keine Probleme haben. ;-)
Zumal die Implementation schon vorgegeben ist. (später im DAC)
Der Umgang mit den von dir genannten Programmen ist mir Fremd.
Eine extra einarbeitung halte ich zZ für sinnlos. Der EQ für meinen 
Mp3-Player ist nur ein kleines stück Software im Vergleich zum Rest.
Ja, auf der Einstellung darf man gerne drauf rumhacken. Zurecht. Ändert 
aber nix.


Ich habe also mal bissel rumprobiert. Mit dem Sachen aus diesem 
"Cookbook".
Habe ein Programm geschrieben, dass eine Sinuswelle aufsteigender 
Frequenz durch einen Tiefpass jagt. Danach wird das Ergebnis analysiert 
und die verbleibende Amplitude der Welle gemessen.
Mit dem Ergebniss bin ich unzufrieden. Das ist alles nicht schön 
visualisiert (das macht Arbeit) Qualitativ kann man die 
Verstärung/Abschwächung (Y-Achse) über den Frequenzbereich (x-Achse) 
aber ablesen. Siehe anhang. Die Spitze sieht definitiv nicht nach einem 
Tiefpass aus.

Insgesamt suche ich doch nur eine Formelsammlung mit deren Hilfe man die 
Koeffizienten a[0..2] und b[0..2] für einen Bessel, Tschebyscheff oder 
Butterworth-Filter (Lowpass/Highpass/Bandpass/Bandstop) berechnet.

Und zu den jeweiligen Parametern eine jeweilige kurze Erklärung.
Im Prinzip ist das Cookbook perfekt. Aber das berechnete kommt mir 
komisch vor.

Zur Zeit fühle ich mich so, als könnte ich in die Theorie ohne 
Grundkenntnisse höherer Mathematik keinen Fuß fassen. Zuviele Wörter in 
den Beschreibungen fürhen zu einem anderen Thema (wenn man sich die Mühe 
macht und nachschlägt).. dass man zum schluss auch wieder nicht 
versteht. Durch scheiß Zivi-Jahr blieb mir der Studienanfang bisher 
verwehrt.
Realistisch gesehen hab ich Quasi nur mit fertigen Formeln ne Chance.


Mit den Koeffizienten dieser Seite:
http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html
habe ich jetzt per Software einen IIR Filter auf dem µC implementiert. 
FixPoint, versteht sich. Das Ergebnis klingt gut und so wie gewünscht. 
(60Hz tiefpass -> Dessen ergbnis zu 80% plus 20% OriginalWave rummst gut 
:-P )

Leider hilft die Seite nicht weiter, da die Implementierung anders zu 
sein scheint. Hier gibt es ja nur 3 Koeffizienten. Das scheint mir zu 
wenig.
Der DAC wünscht ja 5 koeffizienten.

Deswegen auf einen SoftwareFilter auszuweichen ist auch unfug. Die 
Implementation ist zwar noch eher Suboptimal, aber die Minimale 
Prozessorgeschwindigkeit ist von 11Mhz auf 45Mhz für das Abspeilen von 
Wav gesteigen. Sinnlos.

Ich brauche Formeln. Ich brauch was Idiotensicheres. Ist leider so. :-(
hilfe

MFG

Autor: Albi G. (deralbi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hmmh. Noch ein Google-Erfolg:
http://www.musicdsp.org/archive.php?classid=3#38

Diesen Tiefpass habe ich mal mit 80Hz implementiert. Klingt gut.
Siehe Anhang.

Was mir jetzt aber insgesamt aufgefallen ist: Wenn ich den Filter
implementiere, nehme ich zum Schluss ein Zehntel des orignal Signals und
addiere dann 90% des gefilterten Signals hinzu. Damit habe ich dann
ordentlich Bass. Natürlich auf Kosten der Lautstärke :-(


Im DAC, wo das ganze später dann laufen soll geht das ja so gar nicht!
Ich habe ja gar keine Möglichkeit zu bestimmen, wieivle % der
Original-Welle hinzugemischt werden.
=> Ich brauche für die Bässe einen Filter der die Höhen abschwächt, aber
nicht gegen 0 sondern ab einer Grenzfrequenz auf ein definiertes Level
von x%.
=> Ich brauche für die Höhen einen Filter, der die Bässe abschwächt,
aber nicht gegen 0, sondern ab einer Grenzfrequenz auf ein definiteres
Level von x%

Nächtes Problem: Zur Zeiot arbeite ich mit Festkomma-Zahlen. Das
funktioniert gut.

im DAC habe ich nur 16bit-Register zur Ferfügung, die die Koeffizienten
speichern. 16bit signed hat nur 15Bits!! Die 1.0 scheint als +32768
definiert zu sein (entnehme ich der Formel aus meinem ersten Posting)
Dass heißt aber, dass keine Koeffizienten > 1.0 möglich sind.


Mein Tiefpass geht ja z.B. nicht mehr. :-( (ein Koeffizient ist kleiner
als -1.0)

Google sagt, das schreit nach ShelfFiltern.
LowShelf und einen HighShelf.
Aber passen hier die Koeffizienten noch in den Definitionsbereich?

Hilfe.

Autor: Albi G. (deralbi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So. Ich habe einen Low-Shelf-Filter drinne. Mein Programm zeigt den
qualitativen verlauf der Verstärkung. (Siehe Anhang)
Bis zum schwarzen Strich ist die Charakteristik so wie gewünscht.
Aber der nächste Teil (der monoton steigende Part) gefällt mir nicht. Da
werden die Höhen ja angehoben ohne Ende. Ungewollt.
Probiert habe ich den LowShelf ausm CookBook, diesen hier
(http://www.musicdsp.org/archive.php?classid=3#225) und noch einen
anderen.
Immer das selbe Ergebnis. Wie bekommt man alles nach der Grenzfreq.
konstant? Oder geht das nicht?

MFG

btw: langsam wirds langweilig :-( Alleinunterhaltung.

Nachtrag: Im µC klingt der LowShelf recht ordentlich auch eine Anhebung 
der Höhen, wie im Diagramm zu sehen hört man zumindest nicht. hmmhm.
Mist ist, dass nur 2 Koeffizenten betragsmäßig kleiner als 1 sind.
Kann man das Skalieren??

Das Sind die Koeffizienten für 20dB Bass bei f0=100hz, fs = 44.1kHz:

FixedPoint<int, FRAC> a1 = FixedPoint<int, FRAC>(1.012697f);
FixedPoint<int, FRAC> a2 = FixedPoint<int, FRAC>(-1.988025f);
FixedPoint<int, FRAC> a3 = FixedPoint<int, FRAC>(0.9760051f);
FixedPoint<int, FRAC> b1 = FixedPoint<int, FRAC>(-1.988329f);
FixedPoint<int, FRAC> b2 = FixedPoint<int, FRAC>(0.9883971f);

Die müssen alle unter 1.0 zw über -1.0. Leider kann man nicht alle 
einfach durch 2 Teilen :-(

Die Berechnungsvorschrift entstammt sogar diesem Forum:
Beitrag "Zeitvariante Filter"

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.