PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FR - Frequenzgänge von Lautsprechern messen



JFA
06.12.2016, 15:16
Hallo zusammen,

in den letzten Monaten habe ich eine ganze Reihe von Messprogrammen geschrieben. Gründe waren zum Einen, dass ich zu Hause ein taugliches brauchte (kein Windows, kein linux, kein Mac), und mir auf der Arbeit Arta und Limp ziemlich auf den Zünder gingen. Ich kann damit einfach nicht schnell genug arbeiten.

Ich will Euch gerne an einigen davon teilhaben lassen, teils aus Altruismus, teils aus purem Egoismus, weil viele Tester mehr und schneller Fehler finden als ein einzelner, und vielleicht auch Anregungen geben können.

Dies hier ist der erste Teil: Frequenzgänge von Lautsprechern messen.

Was braucht ihr: eine Tcl-Distribution, ich empfehle diese hier: http://www.activestate.com/activetcl/downloads

Installation: ganz einfach, irgendwo den Ordner entpacken

Starten: noch viel einfacher, Doppelklick auf fr.tcl im Basisverzeichnis

Einfach mal messen: Taste "m" drücken

Auch interessant: "F1" drücken

Etliche der Tricks und Kniffe werde ich im Laufe der Zeit hier schreiben, entweder in Eigeninitiative oder auf Anfrage.

Was mich am meisten interessieren würde: startet es überhaupt? Ich habe hier auf allen Rechnern ein eigenes Tcl (zwecks Entwicklungsumgebung), da kann schon mal einiges dabei sein, was in so einer offiziellen Distribution wie ActiveTcl vielleicht fehlt.

Kleine Einschränkung: zur Zeit ist die Audio-Ausgabe aus Kompatibilitätsgründen auf die gute alte WinMM-API eingeschränkt. Die ist zwar scheiße, aber funktioniert auch auf Windows XP. Ich könnte auch WASAPI, Kernel Streaming, Direct Sound und ähnlichen SchickiMicki, aber erstmal muss das altgammelige reichen.

Probiert es einfach mal aus!

Gruß
Jochen

rkv
06.12.2016, 17:08
(kein Windows, kein linux, kein Mac)

Was dann? OS/2 Warp, beOS? Unix? :p

JFA
06.12.2016, 19:46
Unix? :p

Bingo!

OpenBSD.

Falls Ihr einen Fehler findet, bitte unbedingt Screenshot machen und hier posten.

adicoustic
06.12.2016, 20:12
Läuft bei mir unter Windows 10. UI ist für Asketen gemacht :D
Immerhin hab ich es geschafft, eine Messung zu starten und zwei Cursor zu setzen. Das in der Hilfe erwähnte IR-Fenster bleibt mir verborgen. Auch das Starten der Makros hab ich noch nicht hingekriegt.

JFA
06.12.2016, 20:24
Stimmt. Das fehlt in der Anleitung.

Macros ausführen:
:macro {exec} <Macro>

exec ist optional.

Macros laden:
:macro load <Macro>

Beim Programmstart sind alle Macros im macro-Unterordner bereits geladen, aber falls man was ändert oder ein neues erzeugt kann man die so einfach neu laden.

IR-Fenster geht mit
:show IR

Ach, und das UI ist auf alles Nötige reduziert. Ich kann damit inzwischen extrem schnell arbeiten, weil ich nirgends groß rumklicken muss. Zum Beispiel kann ich die zuletzt gemessene Kurve einfach mit "p" (wie paste) als Overlay abspeichern. Im Gegensatz zu Arta bleibt dabei auch die Impulsantwort erhalten

Olaf_HH
06.12.2016, 21:15
Hatte Jochen mir auf dem Battle vorgeführt, Interessantes Teil

06.12.2016, 21:40
Also bei mir unter macOS startet das Programm nicht. ActiveTCL ist installiert.
-----------------
iMacLE:FR $ tclsh fr.tcl
invalid command name "tk_messageBox"
while executing
"tk_messageBox -message $::errorInfo -icon error -type ok"
(file "/Users/larseickmeier/Downloads/FR/lib/env.tcl" line 23)
invoked from within
"source [file join [pwd] lib env.tcl]"
(file "fr.tcl" line 7)
------------------

JFA
06.12.2016, 21:53
MacOS und Linux gehen noch nicht, weil die Libraries noch nicht dafür kompiliert sind. Theoretisch sollte es aber gehen, auch ohne Emulator.

Interessant ist allerdings, dass das Programm an der Stelle schon abbricht. Denn tk_messageBox ist eigentlich ein in Tcl/Tk eingebauter Befehl

eltipo
06.12.2016, 21:55
Sehr spannend,

ich werde mir das in einer ruhigen Minute mal zu Gemüte führen.
Danke dir dafür!

JFA
07.12.2016, 07:47
Wollte eigentlich nur die verbesserte Anleitung posten, bin dabei aber noch über einen Fehler gestolpert, also hier eine aktualisierte Version.

Außerdem ein Download-Link zu den Daten, die ich beim Pappenbattle gezeigt habe: https://we.tl/r7sgFXMq3i (https://we.tl/r7sgFXMq3i)

Sind knapp 50 MB. Datensparsamkeit kann man dem Programm nicht vorwerfen :rolleyes:

JFA
08.12.2016, 11:24
Mal ein kleines Tutorial um Euch zu zeigen, was man alles für nette Sachen mit dem Programm anstellen kann. Ich brauche recht häufig Zielkurven, also habe ich mir entsprechende Funktionen gebastelt. Für das Verständnis des Programms ist es wichtig, dass ich nicht einfach einen Befehl "Zielkurve" geschrieben habe, sondern den in einzelne Primitive zerlegt, diese implementiert und über die Makro-Schnittstelle offen gelegt habe.

1) Programm starten :rolleyes:

2) Messung starten (Taste "m". Befehl ":measure") oder alte Messung laden (Befehl ":l"). Hinweis: Befehle können einfach so, wie sie da stehen, eingebeben werden. Durch die Eingabe von ":" springt das Programm sofort in die Befehlszeile.
=> Messung.png

3) Das ist ein Mitteltöner mit einer fiesen Membranresonanz, ich möchte also möglichst tief und möglichst steil trennen. Damit der Hochtöner nicht allzu viel leisten muss (Servicefälle vermeiden!) trenne ich bei 2,5 kHz, 4. Ordnung ist mit akzeptablem Aufwand machbar. Zielpegel sind 80 dB.
Nach unten soll es dritter Ordnung sein, Trennung bei 500 Hz.

3.1) neue Dummy-Kurve erzeugen: :dirac
Im Hintergrund arbeitet das Programm immer mit Impulsantworten. Der Befehl ":dirac" erzeugt einen sogenannten Dirac-Impuls*, der für alle Werte außer t=0 0 ist. Dieser Impuls hat die aktuelle Abtastrate und die Länge des aktuell eingestellten Gates. Wichtig: alles, was mit normalen Messkurven geht, kann auch damit gemacht werden
=> dirac.png

3.2) Pegel anpassen
Die Kurve ist deutlich zu laut, sie muss skaliert werden. Der Pegel lässt sich mit zwei Arten bestimmen:
- über die Cursor: Kurve in der Liste rechts anwählen, Taste "1" drücken, Pegel ablesen
- oder den - für Macros - besseren Weg, über
:get #14 Magnitude 2500
Die #14 ist die Kurven-ID, Magnitude zeigt an, welchen Wert ich haben möchte, 2500 ist die Frequenz bei welcher der ausgelesen werden soll. Ergebnis ist ziemlich exakt 94 dB. Also müssen wir den Pegel um 14 dB verringern:
:expr #14 / {pow(10, 14/20.0)}
Hier gibt es drei Fallstricke zu beachten:
- "#14", "/" und "{pow..." sind alles Parameter für den :expr-Befehl, müssen deshalb durch Leerzeichen getrennt werden
- damit das Leerzeichen innerhalb von pow() nicht als Parametertrennung interpretiert wird, ist es in {} gesetzt
- der Bruch in 14/20.0 muss so geschrieben werden, weil 14/20 als Intergerdivision interpretiert würde, mit dem Ergebnis 0. Das "20.0" forciert Fließkommaberechnung. Alternativ geht auch double(14)/20, aber nicht double(14/20)
=> dirac_skaliert.png

4) Filtern
Jetzt kann man filtern
:filter #14 lowpass 2500 {Butterworth 4}
:filter #14 highpass 500 {Butterworth 3}
Butterworth ist die Charakteristik, 4 bzw 3 die Ordnung, der Rest dürfte klar sein
=> zielkurve.png

5) Umbenennen und Färben
:rename #14 "Ziel_MT" (Alternativ: Kurve anwählen, F2 drücken)
:color #14 lightgreen (Alternativ: Kurve anwählen, "c" drücken)

Jetzt ist das natürlich blöd, sowas immer von Hand eingeben zu müssen, deshalb habe ich ein Macro geschrieben, dass die Arbeit zum Teil abnimmt. Datei heißt "target.frm" und ist im Zip enthalten (Unterordner "macros"). Test:
:macro target lowpass 2500 Butterworth 4
(ja, die geschweiften Klammern fehlen mit Absicht)

* streng genommen ist es, weil zeitdiskret, ein Kronecker-Delta, damit kann aber außerhalb akademischer Kreise niemand was anfangen

JFA
15.12.2016, 10:14
Ein paar Bugfixes (und vermutlich ein paar Bugadds...)

JFA
17.12.2016, 18:01
Danke an Armin, der sich die Mühe gemacht hat: es scheint ein Problem der DLLs mit der 64 Bit Version von ActiveTcl zu geben. Im Moment müsst ihr die 32 Bit Version nehmen. Die läuft auch unter Win 64 Bit

Fehlermeldung: http://www.diy-hifi-forum.eu/forum/picture.php?albumid=1671&pictureid=29358

Weitere Informationen: http://stackoverflow.com/questions/16839030/invalid-argument-when-using-tcom-from-tcl-script-activetcl