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
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
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?
wenns nur um die koeffizienten geht dann kannst du dir ja die delphi dourcen des audio-projekts ansehen : http://www.mikrocontroller.net/download/audiodsp-snapshot.tar.gz 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.
>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?
>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.
Hier das aus dem Pascalprogramm rekonstruierte C-Programm:
1 | #define sfSemiTone 1.0594630943592952645618252949463
|
2 | #define refSemiToneA 57.0
|
3 | #define PI 3.14159265358979323846
|
4 | |
5 | float power (float Basis, float Exponent) { |
6 | return exp(Exponent * log(Basis)); |
7 | }
|
8 | |
9 | // rechnet halbton in frequenz um
|
10 | float p2f (float n) { |
11 | return 440 * pow(sfSemiTone, n - refSemiToneA); |
12 | }
|
13 | |
14 | int main(void) { |
15 | |
16 | float p, q, x; |
17 | float a0, a1, a2, b0, b1, b2; |
18 | float fo, n, k, kq, qr; |
19 | |
20 | p = 240; // Beispiel |
21 | q = 2; |
22 | |
23 | fo = p2f (min (120, p)); |
24 | k = tan (PI * fo / 44100); |
25 | kq = k * k; |
26 | q = max (-2, min (2, 2*q)); |
27 | qr = sqrt (power (10, -q)); |
28 | n = (1 + qr * k + kq); |
29 | |
30 | b0 = ((qr * k + kq) / n); |
31 | b1 = 0; |
32 | b2 = (-(qr * k + kq) / n); |
33 | a0 = -(2 * (kq - 1)) / n; |
34 | a1 = -(1 - qr * k + kq) / n; |
35 | |
36 | printf("fo = %f\n", fo); |
37 | printf("k = %f\n", k); |
38 | printf("kq = %f\n", kq); |
39 | printf("q = %f\n", q); |
40 | printf("qr = %f\n", qr); |
41 | printf("n = %f\n", n); |
42 | |
43 | printf("B0 = %f\n", b0); |
44 | printf("B1 = %f\n", b1); |
45 | printf("B2 = %f\n", b2); |
46 | printf("A0 = %f\n", a0); |
47 | printf("A1 = %f\n", a1); |
48 | }
|
// 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
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
Den Filter Builder (EXCEL - sheed zur Berechnung) kann ich auf der TI Seite nicht mehr finden :-(
>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 :-(
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?
1 | #define PI 3.14159265358979323846
|
2 | int main(void) { |
3 | |
4 | // Bandpass
|
5 | // Bandpass 160 Hz bis 320 Hz
|
6 | // Sollwerte TAS3103 aus Musterbeispiel
|
7 | // b0 = 0.004922403444228 = 0x0000A14C
|
8 | // b1 = 0.000000000000000 = 0x00000000
|
9 | // b2 = -0.004922403444228 = 0x0FFF5EB3
|
10 | // a1 = 1.989121026148440 = 0x00FE9B84
|
11 | // a2 = -0.990155193111544 = 0xFF814298
|
12 | |
13 | float p, q, x, bb, sa, fun, fob; |
14 | float a0, a1, a2, b0, b1, b2; |
15 | float fo, n, k, kq, qr; |
16 | |
17 | sa = 96000; // Abtastfrequenz |
18 | fun = 160; // untere Frequenz Hz |
19 | fob = 320; // obere Frequenz |
20 | |
21 | fo = fun + (fob - fun) / 2; // Mittenfrequenz |
22 | bb = fob - fun; // Bandbreite |
23 | q = fo / bb; // Güte q = fo / Bandbreite |
24 | k = tan (PI * fo / sa); |
25 | kq = k * k; |
26 | qr = sqrt (q); |
27 | n = (1 + qr * k + kq); |
28 | |
29 | b0 = ((qr * k + kq) / n); |
30 | b1 = 0; |
31 | b2 = (-(qr * k + kq) / n); |
32 | a0 = -(2 * (kq - 1)) / n; |
33 | a1 = -(1 - qr * k + kq) / n; |
34 | |
35 | printf("sa = %f\n", sa); |
36 | printf("fun = %f\n", fun); |
37 | printf("fob = %f\n", fob); |
38 | printf("fo = %f\n", fo); |
39 | printf("bb = %f\n", bb); |
40 | printf("q = %f\n", q); |
41 | printf("k = %f\n", k); |
42 | printf("kq = %f\n", kq); |
43 | printf("qr = %f\n", qr); |
44 | printf("n = %f\n\n", n); |
45 | |
46 | printf("B0 = %f\n", b0); |
47 | printf("B1 = %f\n", b1); |
48 | printf("B2 = %f\n", b2); |
49 | printf("A0 = %f\n", a0); |
50 | printf("A1 = %f\n", a1); |
51 | }
|
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
@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
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
>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.
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=2bc2fd9ec8ccf89eb5e349165db3a9a4&threadid=7754&perpage=25&pagenumber=18 Gruß
>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
@nixcheck Filterbuilder >Man kann ihn aber wohl hier herunterladen: >http://www.diyaudio.com/forums/showthread.php?s=2bc2fd9ec8ccf89eb5e349165db3a9a4&threadid=7754&perpage=25&pagenumber=18 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. ;-)
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 ;-)
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äß.
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.
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.
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;-)
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).
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.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.