PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wavedata


[EF]peppa
2003-01-19, 05:20:03
Hab da ein Problem. Ich moechte die Frequenzen einzellner Samples einer Wavedatei auslesen.

Bei 8Bit, 11025kHz wird die Wavedata wie folgt berechnet:

type
TVolumeLevel = 0..127;
var
w: double; // omega ( 2 * Pi * Frequency)
Frequency{Hz}, Duration{mSec}: Integer;
DataCount, Samplerate, i: Integer;
Volume: TVolumeLevel;
SoundValue: Byte;
MS: TMemoryStream;
begin
Frequency := 1200;
Duration := 1000;
Volume := 60;
Samplerate := 11025;

MS := TMemoryStream.Create;
// hier noch wave-header in MS schreiben

DataCount := (Duration * SampleRate) div 1000; // sound data
w := 2 * Pi * Frequency;

for i:=0 to DataCount-1 do
begin
SoundValue := 127 + Trunc(Volume * Sin(i * w / SampleRate));
MS.Write(SoundValue, SizeOf(Byte));
end;
MS.SaveToFile(c:\1.wav');
// dann man hat man ein wavefile dass eine sek lang 1kHz von sich gibt
end;

So weit so gut.

Wenn ich von einem Sample die Frequenz auslesen will:
w := (ArcSin((SoundValue - 127) / Volume)) / i * SampleRate;
Frequency := Trunc(w / 2 / Pi);


Ich kann aus dem Waveheader die Bitrate, SampleRate, ect auslesen. Aber woher zum Teufel soll ich die Lautstaerke(vom Sample) herbekommen um mir mit der Formel die Frequenz des Samples auszurechen??? Mir fehlt einfach ein Wert(volume) um auf Omega(w) zu kommen! Irgendwas muss ich uebersehen haben. Kann mir wer auf die Spruenge helfen?

mfg peppa

zeckensack
2003-01-19, 14:21:18
Ein einzelnes Sample kann garkeine Frequenz haben :bäh:

Was du suchst nennt sich Forier Transformation (google hilft). Soviel sei gesagt: das wird anstrengend.