![]() |
Sinuston im Wav-Format
Hallo!
Ich möchte einen Sinuston mit variabler Frequenz erzeugen. Dazu benutze ich einen Memory-Stream, schreibe einen Wav-Header und die Audiodaten rein und spiele sie dann mit
Delphi-Quellcode:
ab.
sndPlaySound(MemStream.Memory, SND_MEMORY or SND_ASYNC or SND_LOOP);
Ich benutze immer genau eine Sinuskurve im Intervall von 0 bis 2*Pi. Diese Kurve wird von n Punkten repräsentiert. Um jetzt die Frequenz zu ändern, verändere ich einfach die Samle Rate. Eine Kurve aus 10 Punkten mit einer Sample rate von 10 hat 1Hz und mit der Sample rate 1000 hat sie 100Hz. Eigentlich funktioniert das recht gut, mein Problem ist aber, dass es "Sprünge" im gehörten Ton gibt. Das heißt zb bei einer Frequenz von 10.000 - 13.000Hz hört sich der Ton exakt gleich an. Von 13.000 auf 13.001Hz ändert sich der gehörte Ton plötzlich enorm. Bei niedrigeren Frequenzen ist der Effekt noch nicht so deutlich. Aber ab ca. 10.000 Hz gibt es immer längere Frequenzbereiche mit demselben Ton und dementsprechend sehr großen Sprüngen dazwischen. Wo genau dieses Sprünge sind, ist anscheinend davon abhängig aus wie vielen Punkten eine Sinuskurve besteht. Leider komme ich hier nicht weiter... Vielleicht liegt das Problem daran, dass man die Sample rate nicht beliebig wählen kann. Ich weiß aber nicht wie ich die Sprünge verhindern soll. Könnt ihr mir weiterhelfen??? Grüße blablab P.S. Bitte fragt mich nicht nach dem Sinn dieses Programms :) |
AW: Sinuston im Wav-Format
kannst du nicht die Formel zum Berechnen der WAVE-Daten so umstellen, dass sie variable Werte für f (= Frequenz) annehmen kann und dadurch auch die Länge deiner WAVE-Datei verändert werden kann? - Das wäre für mich die einfachere Lösung als an der Samplerate rumzudrehen.
Bernhard |
AW: Sinuston im Wav-Format
Hallo,
Funktionsgenerator >>> ![]() könnte auch noch den Quellext raussuchen. |
AW: Sinuston
Liste der Anhänge anzeigen (Anzahl: 1)
Inzwischen hab ich es so gemacht wie der Vorschlag von Bernhard und nicht mehr im Wave-Format sondern mit einem Stream. Und ich hab mir mal den Funktionsgenerator angeguckt, und ziemlich genau so hört es sich bei mir auch an. Wenn man zum Beispiel die Frequenz 19kHz einstellt, dann hört man zwar ganz leise diesen Ton, aber viel lauter einen ca. 3333Hz Ton. Wenn man das Programm 2mal startet und einmal laut 19kHz und einmal leise 3333Hz einstellt kann man das gut nachvollziehen.
Leider ist dieser Effekt bei großen Frequenzen ziemlich dominant. Schaltet man zb die Frequenzen ab 10kHz in 1kHz-Schritten hoch, so hört es sich an als würde der Ton tiefer werden statt höher. Insgesamt ist es also so: man kann sich darauf verlassen dass der ausgewählte Ton auch gespielt wird. Allerdings wird er vielleicht durch einen anderes Geräusch überdeckt. Ich benutze eine sampling rate von 192k. Bei ca. 14kHz befindet sich ein Wendepunkt. Hier sind Originalton und Nebeneffekt-Geräusch etwa gleich laut. Bei kleineren Frequenzen dominiert der Originalton und bei höheren der Nebeneffekt. Manche Frequenzen, die auf irgendeine Weise zur sampling rate passen, haben keinen Nebeneffekt. Bei einer sampling rate von 192k sind das zB 19200 Hz 12800 Hz 12000 Hz Also eigentlich diejenigen Frequenzen, die Teiler der Sampling rate sind. Allerdings hat komischerweise 16kHz ein Nebengeräusch. Eigentlich wäre ein leichtes Nebengeräusch nicht so schlimm. Aber ab 10kHz, also der halbe hörbare Bereich, ist es schon störend und ab ca. 15kHz ist es schon unbrauchbar. Deshalb nervt es mich schon... Hat jemand noch eine Idee? [Edit]: Als Anhang ein Hörbeispiel :) Ein ziemlich komischer Effekt bei 20001Hz mit einer Sample Rate von 9*20001. |
AW: Sinuston
Zitat:
Viele hören schon ab ca. 12kHz nichts mehr bei reinen Sinustönen. Bei Frequenzgemischen (2 oder mehr Frequenzen) entstehen zusätzliche Frequenzen, von denen manche in den "persönlichen" Hörbereich fallen können. Lass doch mal eine Audiometrie bei einem Hörgeräteakustiker oder HNO-Arzt machen. Du wirst staunen, was für Empfindlichkeitskurven heraus kommen. Das Hörvermögen ist nicht nur altersabhängig, sondern auch tageszeitabhängig und stressabhängig. ---------------------------------------------- Simple sinewave generator: In den Optionen Laufzeit-Packages verwenden = deaktivieren !!! ![]() |
AW: Sinuston im Wav-Format
Zitat:
Wenn ich den Funktionsgenerator ausführe höre ich bspw. bis 14 kHz noch einen Ton, aber ab 15 kHz nichts mehr. (Ob das an meinen Lautsprechern oder an mir liegt, bleibt natürlich offen.) Wenn ich mit den Signalgenerator auf meinem Handy 15 kHz abspiele höre ich zwar etwas - aber das sind nie und nimmer 15 kHz. So ab 4,5 kHz kommt da ein zweiter (tieferer) Ton rein und darüber wird der tiefe Ton immer höher lauter. Deine angehängte wav Datei ist in der Tat komisch. beim ersten Mal anhören kommt da so eine Art "Anlaufvorgang" bis am Ende der ton erreicht wird, beim nochmaligen Anspielen kommt aber sofort der Endton. Der ist aber nie im Leben 20000 Hz. (Wobei ich die 20000 Hz wahrscheinlich eh nicht höre) Ich könnte mir im übrigen auch vorstellen dass die Soundkarte den Ausgang mit einer konstanten Samplingrate betreibt, alle anderen müssten dann umgesetzt werden. Falls das so ist wäre es am schlauesten direkt die finale Samplingrate zu wählen, denn so eine Umsetzung ist immer verluftbehaftet. |
AW: Sinuston im Wav-Format
@hathor:
Ich glaube du solltest mal zum HNO, und zwar wirklich. Weil 12kHz sind schon sehr wenig, wenn der normale Hörbereich von 20 bis 20.000 Hz geht. Ich bin mir nicht sicher wie viel Hz ich maximal noch höre. 18kHz höre ich noch leise. Bei 19-20kHz wirds schwierig. Aber ich denke das ist noch in Ordnung. @jfheins: Also bei mir liegt es anscheinend nicht an den Lautsprechern, denn wenn ich verschieden Samplingraten ausprobiere dann bekomme ich früher oder später schon den richtigen Ton aus den Lautsprechern. Wegen der wav-Datei: Das ist aber auch nur das Extrem-Beispiel. Im Normalfall kommt zum Originalton nur ein zusätzlicher, tieferer Ton dazu. Aber laut meinem Aufnahmeprogramm ist in der Beispieldatei zusätzlich zu den komischen Effekten auch ein 20kHz ton mitdrin. Nur dass den ein normaler Mensch nicht hört, weil die Empfindlichkeit für diesen Ton viel niedriger ist als die für die komischen Geräusche. |
AW: Sinuston im Wav-Format
Zitat:
Ich habe nicht von mir geschrieben - mit dem oben verlinkten Programm ist knapp oberhalb von 14kHz nichts mehr MIT MEINEN OHREN zu hören.:lol: Das Programm funktioniert problemlos zwischen 20 und 20000 Hz und hat eine Declick-Funktion. Info zur Samplingrate: Laut Abtasttheorem muss die Samplingrate mindestens doppelt so hoch sein wie die höchste Frequenz. |
AW: Sinuston im Wav-Format
Es ist wichtig, dass der Sinuston im Speicher nicht nur eine Schwingung umfasst, sondern dass der Datenblock mindestens die Länge einer Sekunde hat.
Bei 16 Bit und 44,1khz wären das 16 / 8 * 44100 = 352800 Bytes. Wenn man kurze Blöcke ausgibt, dann kann eine Verzögerung dadurch entstehen, dass der Zeiger am Ende des Blocks zurück an den Anfang springen muss. Durch diese Verzögerung entsteht ein zusätzlicher Ton mit niedriger Frequenz. Was auch noch ganz wichtig ist, dass man die Sinusschwingung nicht bis an die Grenzen (-32768..32767) aussteuert. Wenn man die volle Aussteuerung benützt und der Soundchip verwendet intern Oversampling mit Digitalfilter, dann kommt es im Digitalfilter zu Überlaufeffekten => hässliche Störgeräusche. Also nur zu max. 85% aussteuern. |
AW: Sinuston
hast Du denn überhaupt eine Soundkarte die 192k unterstützt? sonst wird eh regesampelt, damit mischen sich aber dann anderer Frequenzen hinein. bei 48 kHz und einem 16 kHz Ton bleiben nur noch 3 Datenpunkte für eine Sinusschwinung, das ist dann eine Dreieckswelle mit Nebenfrequenzen ..
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz