www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Biquad Koeffizienten bestimmen


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich will einen Stereo-Vorverstärker mit Equalizer und Ansteuerung mit µC 
bauen. Um eine analoge Lösung zu umgehen (wegen der vielen 
Kondensatoren), nehme ich einen Audio DAP TAS3002 von TI.
http://focus.ti.com/lit/ds/symlink/tas3103.pdf (Datenblatt)

Die Ansteuerung vom µC her klappt. Leider habe ich von digitaler 
Signalverarbeitung nur wenig Wissen, so dass es mir schwer fällt, die 
Biquad-Koeffizienten für den Equalizer (a1, a2, b0, b1, b2) für die 
jeweilige BP-Frequenz zu bestimmen. Matlab und ALE habe ich nicht zur 
Verfügung.

Gibt es ein freies Tool, was mir helfen könnte? Meine Suche war bisher 
ohne wirkliches Ergebnis.

Gruß
Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Link oben war falsch, hier der richtige:
http://focus.ti.com/lit/ds/symlink/tas3002.pdf

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also filterkoeffizienten zu ermitteln gibt es einige tools. z.b. filter 
solutions von nuhertz.
aber auch im web gibts einige adressen (sorry habe gerade keine parat)
schau auch mal in das buch "Digitale Signalverarbeitung" von Udo Zölzer.
Da stehen auch formeln für peaking/shelving filter drin.
In meinem Audio-Projekt nutze ich die Formeln vom Udo Zölzer (sind in 
Delphi/Pascal geschrieben).
Geh mal auf "Audio-Projekt mit Spartan 3-FPGA".
Da gibts einen Snapshot des SVN Repositories. Da kannst du dir die 
Sourcen anschauen.
Habe selbst mit TAS3103 gearbeitet. Mein TAS3004 funktioniert zwar auch, 
aber da funktionieren die Filter leider nicht (warum habe ich nicht 
herausgefunden).

Gruß
Rene

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tipps. Wirklich weiter bin ich nicht gekommen. Das Nuhertz 
Filterprogramm habe ich installiert, komme aber nicht klar damit.

Bei der Google-Suche taucht immer wieder der Hinweis auf "Filterexpress 
Version 4 der Fa. SYSTOLIX" (Freeware) auf. Leider sind alle 
Downloadlinks dorthin tot. Gibts das Programm nicht mehr? Vielleicht hat 
es noch jemand auf seiner Platte?

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenns nur um die koeffizienten geht dann kannst du dir ja die delphi 
dourcen des audio-projekts ansehen :

http://www.mikrocontroller.net/download/audiodsp-s...

unter \delphi\dap_demos\common\coeffs.pas

werden die koeffizienten berechnet. vielleicht hilfts weiter.

beim nuhertz programm muß man selbst noch etwas "hand anlegen" da die 
koeffizienten nicht in der form b0,b1,b2,a1,a2 berechnet werden.
also umstellen.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wenns nur um die koeffizienten geht dann kannst du dir ja die delphi
>dourcen des audio-projekts ansehen :
>http://www.mikrocontroller.net/download/audiodsp-s...

Ich habe mich damit beschäftigt. Da ich kein Delphi habe, habe ich die 
betreffenden Routinen in C nachprogrammiert. Nun habe ich einige 
Musterkoeffizienten von anderen TAS.. Projekten versucht damit 
nachzuvollziehen. Leider kommen damit nicht die gleichen Koeffizienten 
raus.

>beim nuhertz programm muß man selbst noch etwas "hand anlegen" da die
>koeffizienten nicht in der form b0,b1,b2,a1,a2 berechnet werden.
>also umstellen.

Hast Du ein Beispiel parat?

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Leider kommen damit nicht die gleichen Koeffizienten raus.

aufpassen ! ich verwende bei meinen koeffizienten (tp,bp,hp,notch) eine 
halbton-skala.

allerdings bin ich mir auch nicht 100% sicher ob die im tas300x nicht 
eine andere direktform implementiert haben.
es gibt 2 arten das zu implementieren (einmal mit 2, einmal mit 4 
verzögerungsgliedern).
es lassen sich (soweit ich das verstanden habe) beide ineinander 
umrechnen.
vielleicht liegt da der hase im pfeffer.

>Leider kommen damit nicht die gleichen Koeffizienten raus.

kannst du mal ein beispiel nennen (sprich beispiel koeffizienten-satz 
und einen berechneten mit den dazugehörigen parametern) ?

das du ein beispiel hast finde ich bemerkenswert. hatte (damals) auch 
danach gesucht aber nichts brauchbares gefunden.

>Hast Du ein Beispiel parat?

leider nicht da ich mit nuhertz nur kurz "gespielt" habe.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier das aus dem Pascalprogramm rekonstruierte C-Programm:
#define sfSemiTone 1.0594630943592952645618252949463
#define refSemiToneA 57.0
#define PI 3.14159265358979323846

float power (float Basis, float Exponent) {
  return exp(Exponent * log(Basis));
}

// rechnet halbton in frequenz um
float p2f (float n) {
  return 440 * pow(sfSemiTone, n - refSemiToneA);
}

int main(void) {

    float p, q, x;
    float a0, a1, a2, b0, b1, b2;
    float fo, n, k, kq, qr;

    p = 240; // Beispiel
    q = 2;

    fo = p2f (min (120, p));
    k  = tan (PI * fo / 44100);
    kq = k * k;
    q  = max (-2, min (2, 2*q));
    qr = sqrt (power (10, -q));
    n  = (1 + qr * k + kq);

    b0 = ((qr * k + kq)  / n);
    b1 = 0;
    b2 = (-(qr * k + kq)  / n);
    a0 = -(2 * (kq - 1))    / n;
    a1 = -(1 - qr * k + kq) / n;

    printf("fo = %f\n", fo);
    printf("k = %f\n", k);
    printf("kq = %f\n", kq);
    printf("q = %f\n", q);
    printf("qr = %f\n", qr);
    printf("n = %f\n", n);

    printf("B0 = %f\n", b0);
    printf("B1 = %f\n", b1);
    printf("B2 = %f\n", b2);
    printf("A0 = %f\n", a0);
    printf("A1 = %f\n", a1);
}

// Bandpass
// Bandpass 160 Hz bis 320 Hz
// Sollwerte TAS3103 aus Musterbeispiel
// b0 = 0.004922403444228 = 0x0000A14C
// b1 = 0.000000000000000 = 0x00000000
// b2 = -0.004922403444228 = 0x0FFF5EB3
// a1 = 1.989121026148440 = 0x00FE9B84
// a2 = -0.990155193111544 = 0xFF814298
(laut Datenblatt ist es ein IIR-Filter 2. Grades)

und das bekomme ich raus:
B0 = 0.868319
B1 = 0
B2 = -0.868319
A0 = -1.406953
A1 = -0.933675

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
p = 240; <- hier liegt das problem. das meinte ich mit halbtonskala
q = 2;


versuchs mal so :

    p = 240; // Beispiel jetzt in HZ
    q = 2;   // Beispiel jetzt mit "echtem" Güte-Parameter

    f0 = p;
    k  = tan (PI * fo / 44100);
    kq = k * k;
    qr = sqrt (q);

die halbtonskala ist KEINE frequenz. ich brauch(t)e die halbtonskala um 
den filter "synthesizer-kompatibel" zu machen.
ebenso das q. q gibt direkt die güte an. so wie du es verwenden wolltest 
ist es normiert auf -1 - +1 (ebenfalls für meine synthesizer sachen -> 
resonanz bei filtern)

vergleiche die werte nochmals.
es kann aber trotzdem noch sein das die beim tas300x eine andere 
direktform verwenden. bin mir da nicht ganz sicher.

gruß
rene

Autor: nixcheck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Filter Builder (EXCEL - sheed zur Berechnung) kann ich auf der TI 
Seite nicht mehr finden :-(

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Filter Builder

dieses tool hätte mich auch noch interessiert. allerdings funktionierte 
meine koeffizientenberechnung mit dem TAS3103 so gut das ich letzlich 
darauf verzichtet habe.
andere filter (höherer ordnung) habe ich relativ schnell selbst 
herleiten/zusammenbauen können.
wäre aber trotzdem ein schönes tool gewesen :-(

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dank Deiner Hilfe bin ich wieder etwas weiter gekommen. Das Programm 
habe ich oben bei den Eingangswerten etwas angepasst. Jetzt folgender 
Effekt:
- A0 und A1 stimmen ziemlich genau
- B0 und B2 haben den doppelten Wert gegenüber dem Musterbeispiel
genaue Werte siehe Bild der Anlage

Wenn ich die Samplingfrequenz auf 192kHz setze, stimmt auch B0 und B2 
weitgehend überein. Das dürfte aber kaum stimmen da die TAS nur bis 
96khz sampeln können. Siehst Du noch irgenwo einen Rechenfehler?
#define PI 3.14159265358979323846
int main(void) {

// Bandpass
// Bandpass 160 Hz bis 320 Hz
// Sollwerte TAS3103 aus Musterbeispiel
// b0 = 0.004922403444228 = 0x0000A14C
// b1 = 0.000000000000000 = 0x00000000
// b2 = -0.004922403444228 = 0x0FFF5EB3
// a1 = 1.989121026148440 = 0x00FE9B84
// a2 = -0.990155193111544 = 0xFF814298

    float p, q, x, bb, sa, fun, fob;
    float a0, a1, a2, b0, b1, b2;
    float fo, n, k, kq, qr;

    sa  = 96000;     // Abtastfrequenz
    fun = 160;     // untere Frequenz Hz
    fob = 320;     // obere Frequenz

    fo  = fun + (fob - fun) / 2; // Mittenfrequenz
    bb  = fob - fun;  // Bandbreite
    q  = fo / bb;     // Güte q = fo / Bandbreite
    k  = tan (PI * fo / sa);
    kq = k * k;
    qr = sqrt (q);
    n  = (1 + qr * k + kq);

    b0 = ((qr * k + kq)  / n);
    b1 = 0;
    b2 = (-(qr * k + kq)  / n);
    a0 = -(2 * (kq - 1))    / n;
    a1 = -(1 - qr * k + kq) / n;

    printf("sa  = %f\n", sa);
    printf("fun = %f\n", fun);
    printf("fob = %f\n", fob);
    printf("fo  = %f\n", fo);
    printf("bb  = %f\n", bb);
    printf("q   = %f\n", q);
    printf("k   = %f\n", k);
    printf("kq  = %f\n", kq);
    printf("qr  = %f\n", qr);
    printf("n   = %f\n\n", n);

    printf("B0 = %f\n", b0);
    printf("B1 = %f\n", b1);
    printf("B2 = %f\n", b2);
    printf("A0 = %f\n", a0);
    printf("A1 = %f\n", a1);
}

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich bekomme die Berechnung nun auch mit dem Nuhertz-Programm "Filter 
Free 2007" hin. Die Werte des Musterbeispiels kann ich damit weitgehend 
bestätigen. (Mus demnach im c-Programm irgendwo noch ein Fehler sein.)

Bandpass 160 Hz bis 320 Hz
Sollwerte TAS3103 aus Musterbeispiel
b0 = 0.004922403444228 = 0x0000A14C
b1 = 0.000000000000000 = 0x00000000
b2 = -0.004922403444228 = 0x0FFF5EB3
a1 = 1.989121026148440 = 0x00FE9B84
a2 = -0.990155193111544 = 0xFF814298

Ergebnis, siehe Bild Anlage

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@matthias

freut mich das ich helfen konnte :-)

sag mir mal bescheid ob es bei deinem tas3002 klappt.
habe bei mir das problem das sobald ich einen filter-koeffizienten-satz 
reinschreibe nur noch rauschen rauskommt (egal ob ein signal anliegt 
oder nicht).
schreibe ich allerdings einen lautstärkekoeffizienten hinein (also b0 = 
x, b1=b2=a1=a2=0) funktionierts (lautstärke ändert sich).
egal wie ich es mache das dingen fängt sofort an zu rauschen.
jetzt weiß ich nicht ob ich zu blöd bin das teil zu programmieren oder 
ob es eine macke hat. letzteres vermute ich eher, denn selbst wenn ich 
bass/treble werte setze (die ja vom tas300x selbst "berechnet" werden) 
rauschts nur noch.
dynamikeinheit habe ich noch nicht getestet. mir gings auch erstmal nur 
um den tas als codec, und das hat funktioniert (wäre auch schlecht wenn 
nicht :-)
ich verwende übrigens einen tas3004.

gruß
rene

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Testboard mit dem TAS3002 zur Zeit nicht zur Verfügung (war 
nur geborgt), bin aber dabei mir selber einen Vorverstärkter damit zu 
bauen. Kanns also jetzt nicht praktisch testen. Leider bekommt man die 
TAS300x nur schwer zu kaufen, Digikey hat sie aber auf Lager.

Hast Du noch eine Idee, warum bei b0, b2 die doppelten Werte rauskommen?
Ich wollte die Routine zur Berechnung der Koeffizienten mit in den µC 
übernehmen, um die Bandpässe während der Laufzeit anpassen zu können.

Gruß Matthias

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Leider bekommt man die TAS300x nur schwer zu kaufen

habe meinen als sample bei ti bestellt. probiers mal. die sind 
eiegentlich (hoffentlich immer noch) recht locker drauf, solange man es 
nicht überstrapaziert.

genauer habe ich mir den sachverhalt mit den doppelten werten nicht 
angeschaut.

check es mal mit einem tiefpass gegen, wenns geht. vllt. habe ich beim 
delphi programm auch einen fehler gemacht, da ich den bandpass noch 
nicht so ausgiebig getestet habe.
der tiefpass müsste passen. den habe ich mit anderen implementationen 
(von meiner ehemaligen firma) gegengeprüft. die passen bis aufs letzte 
bit genau.

Autor: nixcheck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TAS3002 + TAS3004 gibt es noch bei DigiKEY. Die werden von TI aber nicht 
mehr für Neuentwicklungen empfohlen.
@ hättest du vor Jahren als ich dich mal um Details zu deinem TAS board 
gefragt habe geantwortet hättest du vielleicht damals schon den Link zum 
Filterbuilder von mir bekommen (den konnte man damals noch bei TI runter 
laden und ich dachte du hast den schon). Ich hab dann aber dein Projekt 
(und die TAS im allgemeinem) aus den Augen verloren.
Ich möchte den nicht hier einstellen , weil ich nicht weiß ob TI das mit 
den Urheberrechten sieht. Man kann ihn aber wohl hier herunterladen:
http://www.diyaudio.com/forums/showthread.php?s=2b...

Gruß

Autor: nixcheck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry mit @ meinte ich TheMason

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hättest du vor Jahren als ich dich mal um Details zu deinem TAS board
>gefragt habe geantwortet hättest du vielleicht damals schon den Link zum
>Filterbuilder von mir bekommen

sorry wenn ich das damals überlesen habe. war keine absicht.
ich bin mittlerweile von den tas weg, da mir der beschaltungsaufwand für 
den tas als codec zu hoch ist, und die zusatzfunktionen (filter) wären 
halt nur interessant gewesen wenn auch die resonanz für das 
audio-projekt etwas höher gewesen wäre (bevor ich den 
audio-projekt-artikel geschrieben habe).
nun bin ich bei den tlv-codecs und da werde ich (solange es die noch 
gibt) erstmal bei bleiben.
mehr brauche ich fürs audio-projekt ja nicht.
nochmals sorry das ichs überlesen hab.

gruß
rene

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@nixcheck

Filterbuilder

>Man kann ihn aber wohl hier herunterladen:
>http://www.diyaudio.com/forums/showthread.php?s=2b...

Ich habe es mir die Excel-Tabelle dort runtergeladen. Leider 
funktioniert es nicht, da offenbar die Berechnungsfunktionen fehlen. Die 
Zip-Datei enthält nur eine einzige Datei. Oder bin ich zu blöd dafür. 
;-)

Autor: nixcheck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du darfst (must) Werte nur in die blauen Felder eintragen (steht inputs 
-drüber). Ich habe sie eben zum testen nochmal runtergeladen funzt 1A. 
Ich verwende allerdings auch OpenOffice (version 2.3). Das ist nicht nur 
kostenlos sondern wohl auch kompatibler zu Excel als Excel ;-)

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den blauen Feldern ist mir klar. Es klappt aber trotzdem nicht. 
Bei Office 2000 geht es garnicht, bei Office 97 nur mit den Werten, die 
im Original eingetragen sind, sobald man andere Eingangswerte einträgt, 
kommt Fehler, das die Berechnung nicht erfolgen kann, sinngemäß.

Autor: nixcheck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte ich auch (Excel in der Firma) da da wohl einige Komponenten / 
Module nicht Installiert waren. Zuhause dem verwende ich nur OpenOffice 
- ohne Probleme. Vielleicht ist bei deinem Download oder beim Entpacken 
was schief gegangen. Ich würde es noch mal runterziehen. Ansonsten: 
OpenOffice ist kostenlos.

Autor: nixcheck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schmeiß mich weg vor lachen. Das gleiche Excel ! Sheet (die selbe 
Datei) das mir unter OpenOffice 2.3 einwandfrei die Koordinaten 
berechnet und wunderschön den Frequenzgang darstellt habe ich heute mal 
mit Excel 97 testen können => läuft nicht. OK das Erstellungsdatum ist 
16.06.2000. Aber du (Matthias) schreibst ja das es unter Office 2000 
auch nicht funzt.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs auch nochmal runtergeladen. Läuft nicht, deshalb hat TI es 
vielleicht vom Server genommen. Weißt Du, wo man die verwendeten 
Funktionen im Excel findet? Die müssen doch irgendwo in der Datei 
gespeichert werden. Ich bin leider kein Excel-Spezi. Komisch ist, das 
beim starten der Datei die Grafik für einen Sekundenbruchteil angezeigt 
wird;-)

Autor: nixcheck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da sind keine Makros im einsatz alle Verwendeten Formel stehen in den 
jeweiligen Zellen. Ansicht ist ein und ausschaltbar über Extras > 
Optionen > Ansicht > Bearbeitungsleisten (Häckchen setzen). Wird aber 
nicht viel nützen (zu komplexe verknüpfungen)/ wird sich kaum 
nachvollziehen lassen. Du kannst aber unter Extras > Optionen > 
Berechnen mal mit den Häckchen spielen vieleicht nützt es was. Wobei ich 
nicht verstehe wieso du dir das nicht einfacher machst (OpenOffice).

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe Openoffice installiert. Damit funktioniert der Filterbuilder nun 
auch bei mir. Bei Excel braucht man offenbar noch ein zusätzliches 
Plugin. Danke nochmal für den Tipp.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es nun doch noch unter Excel (2000) zum laufen bekommen. Unter 
Optionen - Add-In muß "Analyse Funktion VBA" angehakt werden. Dann läuft 
der Filterbuilder problemlos.

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.