Seite 1 von 1
Generierung Sinus Töne
Verfasst: Mittwoch 29. April 2020, 17:14
von Jones.Indiana
Hallo an alle,
ich möchte in einem Programm kurze Töne generieren (sinus "beeps"). Habe es mit winsound probiert, was auch problemlos funktioniert. Allerdings hört sich das sehr "künstlich" an, und der onset scheint sehr harsch und abrupt...
Kennt jemand was saubereres, was auch einfach zu definieren ist mit Frequenz und Tonlänge?
Danke schon mal.
Re: Generierung Sinus Töne
Verfasst: Mittwoch 29. April 2020, 17:37
von __deets__
Der onset ist ja auch harsch und abrupt, wenn man von jetzt auf gleich einen Sinus-Ton voller Lautstaerke erzeugt. Wenn du da was anderes machen willst, empfiehlt sich, pyaudio zu benutzen, und die Audio-Buffer selbst zu erzeugen. Mit math.sin, und unter Verwendung einer Rampe fuer die Amplitude.
Re: Generierung Sinus Töne
Verfasst: Donnerstag 30. April 2020, 09:53
von Jones.Indiana
Danke Dir für die Antwort. Ich habe pyaudio auch schon mal über Suche gefunden, scheint jedoch nicht das zu erlauben was ich brauche. Es ist für ein Programm das für eine Versuchsreihe benötigt wird. Jedes mal wenn ich einen button in fenster klicke, erzeugt er einen Doppelbeep, der nach einem bestimmten Algorithmus (bzw je nach Antwortverhalten der Versuchsperson) z.B. seine Frequenz ändert. Ich muss nicht auf eine wav zugreifen oder den sound gespeichert haben.
Re: Generierung Sinus Töne
Verfasst: Donnerstag 30. April 2020, 10:00
von __deets__
Glaub mir, PyAudio ist geeignet. Nur weil die Beispiele aus Gruenden der Einfachheit WAVs benutzen, heisst das nicht, dass man im AudioCallback nicht problemlos ein weiteres numpy-array-schnipsel mit Sinuswerten erzeugen respektive zurueckliefern kann. Oder du generierst die dir im Speicher vor, und lieferst nur noch Buffer-Bereiche.
Re: Generierung Sinus Töne
Verfasst: Sonntag 17. Mai 2020, 09:29
von Jones.Indiana
Danke Dir deets für Deine Antwort. Habe jetzt ewig im Netz danach durchforstet. Aber sorry, da bin ich als Kurzfrist-User Python zu doof zu. Ich habe da für meine Abschlussarbeit (in Geisteswissenschaften) an der Uni einen Versuchsaufbau zu kreieren, der mir innerhalb eines Python Programms JETZT einen Sinuston von x ms Dauer mit f Hertz und einer linearen on/off Rampe von r ms Dauer abspielt. Weiss jemand wo es eine verständliche Quelle dafür gibt, mit deren Hilfe man sich da hineinknien kann?
Danke an alle.
Re: Generierung Sinus Töne
Verfasst: Sonntag 17. Mai 2020, 11:18
von __blackjack__
@Jones.Indiana: Kurze Suche im Netz brachte diese Bibliothek ans Licht:
https://sites.cs.ucsb.edu/~dutcher/soun ... index.html
Ansonsten sollte das aber grundsätzlich wirklich nicht so schwer sein sich Sinustöne mit linearer on/off ramp selbst zu basteln. Es ist ein bisschen Fleissarbeit und man muss sich in die Grundlagen von Python und Numpy einarbeiten.
Und dann das übliche beim Programmieren: Das gesamtproblem in kleinere Teilprobleme aufteilen. Und die auch wieder in Teilprobleme aufteilen. Solange bis die einzelnen Probleme so klein sind, dass man sie mit einer Funktion in wenigen Zeilen lösen kann. Teillösung testen, und wenn die tut, dann zur nächsten Teillösung weitergehen. Solange bis man am Ende eine Gesamtlösung hat.
Erste Aufteilung die ich machen würde, ist generieren der Sampledaten vom abspielen der Sampledaten zu trennen. Abspielen kann man ersatzweise auch erst einmal durch Speichern als WAV-Datei ersetzen, weil man dann ein beliebiges Programm zum Abspielen von WAV-Dateien zum testen der generierten Samples hernehmen kann. Wenn es einfach und schnell gehen soll würde ich mir dafür zumindest vorübergehend `scipy` als Abhängigkeit hernehmen, weil das in `scipy.io.wavfile` eine supersimpel zu verwendende `write()`-Funktion hat die nur den Dateinamen oder ein Dateiobjekt, die Samplerate, und die Daten haben will. Sonst müsste/könnte man sich da mit dem `wave`-Modul aus der Standardbibliothek selbst etwas für schreiben.
Dann das generieren: Erster Schritt Sinussamples mit x Hz und s Sekunden für eine Samplerate r generieren. Das sollte mit Numpy ein Einzeiler sein.
Zweiter Schritt „envelope“ für n Samples mit Samplerate r und s Sekunden ein- und ausblenden erzeugen. Also im Grunde ausgehend von n Einsen vorne und hinten entsprechend durch ”Rampen” von 0 bis 1 bzw. 1 bis 0 ersetzen.
Damit kann man die Sampledaten dann einfach multiplizieren.
Abspielen ginge dann beispielsweise mit PyAudio, aber notfalls kann man wahrscheinlich auch `winsound` verwenden wenn man die Daten als WAV im Speicher erzeugt. Es gibt auch noch ein paar andere Cross-Plattform-Bibliotheken die man zum Abspielen von Sound verwenden kann.
Re: Generierung Sinus Töne
Verfasst: Sonntag 17. Mai 2020, 12:35
von nezzcarth
Jones.Indiana hat geschrieben: Sonntag 17. Mai 2020, 09:29
Aber sorry, da bin ich als Kurzfrist-User Python zu doof zu. Ich habe da für meine Abschlussarbeit (in Geisteswissenschaften) an der Uni einen Versuchsaufbau zu kreieren, der mir innerhalb eines Python Programms JETZT einen Sinuston von x ms Dauer mit f Hertz und einer linearen on/off Rampe von r ms Dauer abspielt.
Ich vermute, du nimmst dafür eine Python-basierte Software für Experimente, oder wo kommt Python da ins Spiel? Solche Umgebungen haben jedenfalls die Funktionalität, die du brauchst oft schon eingebaut (
zum Beispiel OpenSesame). Mehr Details zur verwendeten Software wären daher für gezieltere Antworten hilfreich.
Re: Generierung Sinus Töne
Verfasst: Sonntag 17. Mai 2020, 13:17
von __blackjack__
Alternativ, wenn man sich externe Programme installieren/verwenden kann, lässt sich das auch mit ``sox``, dem „Schweizer Taschenmesser für Audiobearbeitung“ machen, das man mit dem `subprocess`-Modul von Python aus aufrufen kann.