ja genau den Beitrag habe ich ebenfalls offen. Nur habe ich es in der Praxis so nicht hinbekommen.
Evtl. ist die Audacity Software vom Beitragsersteller und meine eine ganz andere Version.
Ich bin mit der Amplitude Einstellung nicht zurecht gekommen.
willst Du eine CD davon brennen, und brauchst deswegen 44.1 kHz? Sollen die Signale deswegen auch Stereo sein? Wenn Du den Rechner direkt als Signalquelle nimmst, würde würde ich eher wie üblich 48 kHz oder 96 kHz nehmen, und Mono-Signale generieren.
Ich weiß nicht, wie die aktuellen Audacity-Versionen an der Stelle aussehen (meine ist etwas älter, auf Ubuntu 16.04), vielleicht kann man die Amplitude jetzt auch in dB eingeben. Ansonsten muss man den Pegel vorher umrechnen: 0 dB ist 1, -10 dB ist 0.316, -20 dB ist 0.1
So, kleine Korrektur: Es hatte sich eine Copy-Paste-Fehler eingeschlichen, statt 3150 Hz hatte Nr. 3 auch 1000 Hz. Außerdem waren die Pausen zwischen den Einzelfrequenzen 3 statt 2 Sekunden lang. Ich hoffe, das war alles... die neue Datei hängt an, die alte lösche ich raus.
Zur Vollständigkeit noch das Skript, mit dem ich sie erzeugt habe:
Code:
import numpy as np
from scipy.signal import chirp
import soundfile
# Abstastrate
fs = 48000
def lvl(db):
'''Umrechnung von dB in Pegel'''
return 10**(db/20.)
def sin(t, f):
'''Sinus, Länge t Sekunden, Frequenz f Hz'''
T = int(t * fs)
return np.sin(np.arange(T) * 2*np.pi * f/fs)
def sweep(t, f1, f2, method='logarithmic'):
'''Sweep, t Sekunden, von f1 bis f2, log oder lin'''
return chirp(np.arange(fs*t),
1.*f1/fs,
fs*t,
1.*f2/fs,
method=method,
phi=270)
# 1.) 1000 Hz bei 0 dB über 180 Sekunden
write('01-1k.wav', lvl(0) * sin(180, 1000))
# 2.) 10 kHz bei -10 dB über 180 Sekunden
write('02-10k.wav', lvl(-10) * sin(180, 10000))
# 3.) 3150 Hz bei -10 dB über 180 Sekunden
write('03-3150.wav', lvl(-10) * sin(180, 3150))
# 4.) eine Reihe bei -20 dB über jeweils 10 Sekunden:
# 20 Hz, 50 Hz, 100 Hz, 200 Hz, 500 Hz, 1kHz, 2kHz, 5kHz, 8kHz,
# 10kHz, 12kHz, 14kHz, 16kHz, 18kHz, 20kHz und 22kHz,
# unterbrochen von 2 Sekunden Pause
freqs = (20, 50, 100, 200, 500, 1000, 2000, 5000, 8000,
10000, 12000, 14000, 16000, 18000, 20000, 22000)
write('04-einzelfreq.wav',
lvl(-20) * np.hstack([
np.hstack([silence(1), sin(10, f), silence(1)]) for f in freqs
]))
# 5.) Sweep linear 20Hz bis 20KHz bei -20 db über 1 Minute
write('05-linsweep.wav', lvl(-20) * sweep(60, 20, 20000, 'linear'))
# 6.) Sweep logarithmisch 20Hz bis 20KHz bei -20 db über 1 Minute
write('06-logsweep.wav', lvl(-20) * sweep(60, 20, 20000))
Außer Python3 (am besten aktuelle Version, oder was halt da ist, ich hab 3.5.2) braucht man die Pakete numpy, scipy und soundfile - man kann sie auf vielen systemen mit "pip install numpy scipy soundfile" installieren, wenn sie noch nicht da sind. Laufen lassen kann man das ganze dann mit "python3 gen_alex.py" (.txt vorher entfernen - ist nur, dass das Forum den Anhang schluckt), und die Ausgabe wird im aktuellen Verzeichnis erzeugt.
Inhaltlich: Am Anfang werden einige Helfer definiert, dass man sich unten nicht dauernd wiederholt. Dann gibt es für jedes gewünscht Signal einen kurzen Eintrag. Bei den Einzelfrequenzen habe ich Kürze über Lesbarkeit gestellt... ausführlicher sähe das so aus:
Code:
write('04-einzelfreq.wav', lvl(-20) * np.hstack([
silence(1), sin(10, 20), silence(1),
silence(1), sin(10, 50), silence(1),
silence(1), sin(10, 100), silence(1),
# und so weiter
]))
ja klar - solche Töne aus dem Rechner ersetzen höchstens einen Tongenerator, aber kein Bezugs- oder Messband! Man kann damit letztlich "nur" die Aufnahme prüfen oder einmessen, aber nicht die Wiedergabe: Für Spaltlage, absoluten Pegel und Wiedergabeentzerrung ist eine Aufzeichnung nötig, auf der das alles "amtlich richtig" ist.
(17.11.2022, 10:07)sensor schrieb: aber letztendlich ist es recht schwierig die Testtöne DIN Gerecht aufs Band zu bekommen
Peter hat ja seine Meßbanderstellungsstation hier schon mal gezeigt und mir auch mal seine Vorgehensweise erklärt.
Spätestens da wurde klar, daß man das nicht mal so eben erledigen kann.
Ein Pegelband zur Justage des Magnetflusses, ja OK - das bekomme ich ausreichend genau hin,
wobei ich selbst da jedes mal zuerst die Aufnahmemaschine checke und am Schluß auch das Ergebnis.
Aber das Erstellen von Bändern mit Frequenzreihen in der korrekten Verzerrung sollte man den Profis überlassen!
auch wenn ich sehr spät dran bin, vielen Dank für die schöne Testreihe.
Für eine so präzise Tonreihe brauchte man "Annodunnemals" einen sehr ordentlichen Tongenerator im Mischpult.
Zusammen mit Audacity und dessen Pegelanzeige ergibt sich jetzt sogar der Komfort der alten Lichtzeigerinstrumente bis 60 dB ohne umzuschalten. Mit umschalten konnten die Altvorderen dann noch einmal 20 dB mehr.
Die heutigen Möglichkeiten mit dem Computer zu sehr geringen Kosten sind schon grandios.
Die Lichtzeigerinstrumente für Stereo waren damals unerschwinglich für Normalsterbliche und die zwei zugehörigen Verstärker waren im Preis auch nicht von Pappe.
Zu Ulfs Gedanken angeregt durch den sehr amüsanten Text von Matthias zu Audacity fällt mir folgendes wieder ein::
"Alexander Spoerl hatte in einem seiner Bücher Autofahrern empfohlen, sich für die kleine Reparatur unterwegs und zwischendurch eine Gewindefeile ins Bordwerkzeug zu legen, denn ein böhmischer Waldarbeiter würde bei dem Besitz einer solchen nützlichen Feile sofort eine Schraubenfabrik eröffnen." Wäre der besagte Waldarbeiter in unserem Forum, würde er sofort Meßbänder produzieren.
(17.11.2022, 13:41)Baruse schrieb: Peter hat ja seine Meßbanderstellungsstation hier schon mal gezeigt und mir auch mal seine Vorgehensweise erklärt.
Spätestens da wurde klar, daß man das nicht mal so eben erledigen kann.
Das Programm von Andreas funktioniert wunderbar. Wenn man die Dateiendung von wav auf flac ändert schreibt es auch gleich flac Dateien. Und mit dem Parameter 'PCM_24' in der soundfile.write Methode wird auch in 24 bit geschrieben. Nicht das es furchtbar wichtig wäre, aber es geht :-)
Was mich jetzt noch interessieren würde ist, ob man nicht auch eine Multifrequenz Datei schreiben könnte, ähnlich der, die Peter mal geteilt hat. Ich kann aber aus der Dokumentation nicht entnehmen was dafür der beste Weg wäre.
18.11.2022, 00:14 (Dieser Beitrag wurde zuletzt bearbeitet: 18.11.2022, 00:31 von andreas42.)
Hallo Linus,
(17.11.2022, 22:47)Linus schrieb: Wenn man die Dateiendung von wav auf flac ändert schreibt es auch gleich flac Dateien. Und mit dem Parameter 'PCM_24' in der soundfile.write Methode wird auch in 24 bit geschrieben. Nicht das es furchtbar wichtig wäre, aber es geht :-)
"Batteries included" - das erledigt alles das soundfile-Paket, auch die Konvertierung vom Float-Format der Samples, die man ihm gibt, in das jeweilige Dateiformat. Sowas muss man sonst auch von Hand machen. Gib in einer interaktiven Python-Session mal "import antigravity" ein spoiler
(17.11.2022, 22:47)Linus schrieb: Was mich jetzt noch interessieren würde ist, ob man nicht auch eine Multifrequenz Datei schreiben könnte, ähnlich der, die Peter mal geteilt hat. Ich kann aber aus der Dokumentation nicht entnehmen was dafür der beste Weg wäre.
Klar - soundfile schreibt einfach nur die Zahlen (also Samples) raus, die man ihm im Funkionsaufruf übergibt. Was inhaltlich im Signal drin ist, interessiert das Paket nicht, deswegen wird die Doku auch nichts dazu sagen.
Meinst Du damit ein Gemisch aus mehreren Einzelfrequenzen, die dann in der FFT wie ein Kamm aussehen? Das wäre dann eine Funktion wie "a1 * sin(f1) + a2 * sin(f2) + ..." - mit geeigneter Normierung (also so, dass nicht nur die Pegel relativ zueinander stimmen, sondern auch absolut).
In dem kleinen Skript oben habe ich die meisten Signale direkt im Funktionsaufruf generiert, z.B. "lvl(-10) * sin(180, 3150)", und nirgends zwischengespeichert. Es hindert Dich aber nichts daran, mehrere Frequenzen zu addieren, und das auch in einzelnen Schritten zu machen, zum Beispiel so ähnlich:
Auch wenn hier nirgends eine explizite Schleife steht - in "mf" wird in jedem Schritt ein Array von Floats manipuliert, also z.B. elementweise addiert. Die Notation ist so, wie man sie vielleicht von modernem Fortran, oder Matlab (?) kennt. Das macht alles NumPy, kompakte Einführung: https://numpy.org/doc/stable/user/quickstart.html
Inhaltlich: Ob die Normierung hier sinnvoll ist, weiß ich nicht so recht - sie sorgt halt einfach nur dafür, dass die Summe aller Werte nirgends größer als 1 wird (sonst wäre es ja digital übersteuert), und dass das ganze Gemisch danach einen Spitzenpegel 20 dB unter digitaler Vollaussteuerung hat.
Ich hoffe, das hilft weiter - sonst gerne weiterfragen
Viele Grüße
Andreas
Nachtrag: Auch hier geht es wieder kürzer, auf Kosten der Einsteiger-Lesbarkeit:
Code:
mf = sum([sin(10, f) for f in (1000, 2000, 3150, 6300, 10000)])
... zumindest wenn alle Einzelsignale den gleichen Pegel bekommen sollen. Danach natürlich noch normieren und so.
18.11.2022, 12:52 (Dieser Beitrag wurde zuletzt bearbeitet: 18.11.2022, 12:52 von andreas42.)
Hallo Linus,
für Stereo musst Du dem soundfile.write-Aufruf ein 2d-Array übergeben, das die Daten für linken und rechten Kanal enthält. Wenn da das gleiche drinstehen soll, kannst Du das Signal ja auch einfach wiederverwenden. Beispiel:
(habe mich zuerst verwirrt, weil ich in der Doku von audiofile statt soundfile nachgeschaut habe... und da ist die Reihenfolge von Zeilen und Spalten andersrum... also np.vstack statt np.column_stack)
Übungsaufgabe wäre jetzt, die Hilfsfunktion "write" mit einem optionalen Parameter "stereo" zu versehen, der dann obige Verdopplung bequem beim Schreiben vornimmt...
(17.11.2022, 13:41)Baruse schrieb: Peter hat ja seine Meßbanderstellungsstation hier schon mal gezeigt und mir auch mal seine Vorgehensweise erklärt.
Spätestens da wurde klar, daß man das nicht mal so eben erledigen kann.