AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Sinuston im Wav-Format
Thema durchsuchen
Ansicht
Themen-Optionen

Sinuston im Wav-Format

Ein Thema von blablab · begonnen am 31. Okt 2010 · letzter Beitrag vom 8. Feb 2011
Antwort Antwort
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#1

Sinuston im Wav-Format

  Alt 31. Okt 2010, 17:08
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 sndPlaySound(MemStream.Memory, SND_MEMORY or SND_ASYNC or SND_LOOP); ab.
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
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

AW: Sinuston im Wav-Format

  Alt 31. Okt 2010, 22:46
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#3

AW: Sinuston im Wav-Format

  Alt 1. Nov 2010, 07:30
Hallo,

Funktionsgenerator >>> http://www.delphipraxis.net/133107-f...tml#post906409

könnte auch noch den Quellext raussuchen.
Markus H.
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Sinuston

  Alt 2. Nov 2010, 09:11
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.
Angehängte Dateien
Dateityp: rar 20001Hz.rar (483,2 KB, 27x aufgerufen)

Geändert von blablab ( 2. Nov 2010 um 10:52 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

AW: Sinuston

  Alt 2. Nov 2010, 13:07
...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?
Wie alt bist Du?
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 !!!

http://www.satsignal.eu/software/toneburst140.zip

Geändert von hathor ( 2. Nov 2010 um 13:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

AW: Sinuston im Wav-Format

  Alt 2. Nov 2010, 13:20
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.
Das könnte auch an deinen Lautsprechern liegen
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.
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Sinuston im Wav-Format

  Alt 2. Nov 2010, 13:58
@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.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: Sinuston im Wav-Format

  Alt 2. Nov 2010, 14:22
@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.
Und Du solltest LESEN lernen...

Ich habe nicht von mir geschrieben - mit dem oben verlinkten Programm ist knapp oberhalb von 14kHz nichts mehr MIT MEINEN OHREN zu hören.
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.

Geändert von hathor ( 2. Nov 2010 um 14:24 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

AW: Sinuston im Wav-Format

  Alt 2. Nov 2010, 15:32
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#10

AW: Sinuston

  Alt 8. Feb 2011, 00:19
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 ..
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz