Testtöne für unser Hobby
#1
Ich habe einen alten Beitrag von 2015 entdeckt. Der Titel lautete 
Pieps-Erzeugung für den Tonband-Messbedarf !

Wollte mir diese eben erstellen, doch leider fehlt mir die Praxis damit. 


Benötigt wird



1.) 1000 Hz bei 0 dB über 180 Sekunden

2.) 10 kHz bei -10 dB über 180 Sekunden

3.) 3150 Hz bei - 10dB über 180 Sekunden

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

5.) Sweep linear 20Hz bis 20KHz bei -20 db über 1 Minute

6.) Sweep logarithmisch 20Hz bis 20KHz bei -20 db über 1 Minute


WAV-Dateien, 16Bit, 44,1 KHz, 



wer kann mir so ein Test Tone Paket per mail zukommen lassen ?
Gruß Alex
Zitieren
#2
Hallo Alex,

gerade wollte ich schreiben "das kannst Du doch ganz einfach mit Audacity machen"... aber dann habe ich gesehen, dass das im erwähnten Beitrag schon beschrieben ist: Pieps-Erzeugung für den Tonband-Messbedarf (etwas Audacity-Praxis).

Ich mache die gewünschten Töne aber gerne fertig und poste sie dann hier (bin nur gerade am falschen Rechner) - wenn niemand bis dahin schneller war.

Viele Grüße
Andreas
Zitieren
#3
Hey Andreas,

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.

vielen Dank Andreas
Zitieren
#4
Hallo Alex,

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

Viele Grüße
Andreas

Viele Grüße
Andreas
Zitieren
#5
Ich hatte vor den PC zu benutzen. Mono Signale sollen es werden in 48Khz

Gruß Alex
Zitieren
#6
https://www.zeitnitz.eu/scope_de

da ist ein Tongenerator bei


Angehängte Dateien Thumbnail(s)
   
Gruß Ulf

TF-Berlin
Zitieren
#7
Hallo,

schon wieder auf dem Sprung - ich hoffe, keine Flüchtigkeitsfehler gemacht zu haben. Hier erstmal die Dateien, Erläuterungen und Code gerne später.

Viele Grüße
Andreas


Edit: Doch Flüchtigkeitsfehler... Korrektur zwei Beiträge weiter unten. Anhang hier entfernt.
Zitieren
#8
Danke Dir vielmals Andreas.
Zitieren
#9
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 silence(t):
    '''t Sekunden Stille'''
    return np.zeros(int(fs * t), dtype=float)

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)

def write(filename, signal):
    soundfile.write(filename, signal, fs)


# 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
        ]))

Die Hilfsfunktionen hatte ich schon (siehe https://github.com/andreas-schmidt/tapetool), von daher war es eine kleinere Übung.

Viele Grüße
Andreas


Angehängte Dateien
.zip   testtoene-2.zip (Größe: 8.72 MB / Downloads: 26)
.txt   gen_alex.py.txt (Größe: 1.71 KB / Downloads: 21)
Zitieren
#10
aber letztendlich ist es recht schwierig die Testtöne DIN Gerecht aufs Band zu bekommen
Gruß Ulf

TF-Berlin
Zitieren
#11
Hallo Ulf,

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.

Viele Grüße
Andreas
Zitieren
#12
(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!
Viele Grüße
Jörg
Zitieren
#13
Hallo Andreas,

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.

Viel Grüße
Manfred
Zitieren
#14
(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.

Hier kann man es nachlesen, wobei ich mich leider sehr kurz fassen musste:
https://app.box.com/s/1pnmkoixx60tvhahv09iiwqte1p0d0cm
Grüße
Peter


_____________________

Ich bin, wie ich bin.
Die einen kennen mich, die anderen können mich.
(Konrad Adenauer)
Zitieren
#15
Hallo!

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.

Viele Grüße
Linus
Zitieren
#16
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 Wink 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:

Code:
mf = silence(10)
mf += lvl(-20) * sin(10, 1000)
mf += lvl(-25) * sin(10, 3150)

mf /= np.max(mf)
mf *= lvl(-20)

write('foo.mp3', mf)

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 Smile

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.
Zitieren
#17
Nice! Ja, Python ist schon sehr mächtig :-) Multifrequenz funktioniert auch hervorragend. Vielen Dank!

Viele Grüße
Linus
Zitieren
#18
Ach, und wie bringe ich dem noch Stereo bei?

Viele Grüße
Linus
Zitieren
#19
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:

Code:
sig = 0.1 * sin(10, 440)
# array([ 0.        ,  0.0057564 ,  0.01149372, ..., -0.01719291,
#        -0.01149372, -0.0057564 ])

sig.shape
# (480000,)

sig_st = np.column_stack([sig, sig])
#  array([[ 0.        ,  0.        ],
#         [ 0.0057564 ,  0.0057564 ],
#         [ 0.01149372,  0.01149372],
#         ...,
#         [-0.01719291, -0.01719291],
#         [-0.01149372, -0.01149372],
#         [-0.0057564 , -0.0057564 ]])

sig_st.shape
# (480000, 2)

write('foo.wav', sig_st)
# foo.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 48000 Hz

(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...

Viele Grüße
Andreas
Zitieren
#20
Funzzt. Noch mal vielen Dank. Tolle Übung in Python.

Viele Grüße
Linus
Zitieren
#21
(17.11.2022, 16:17)Peter Ruhrberg schrieb:
(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.

Hier kann man es nachlesen, wobei ich mich leider sehr kurz fassen musste:
https://app.box.com/s/1pnmkoixx60tvhahv09iiwqte1p0d0cm

Wow, sehr cool. Danke Peter für die Einblicke.

Danke und Gruß Dirk
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste