Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi BASS.DLL und BASS_ChannelGetData (https://www.delphipraxis.net/48907-bass-dll-und-bass_channelgetdata.html)

Jens Schumann 2. Jul 2005 09:55


BASS.DLL und BASS_ChannelGetData
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich bastel mir gerade so zum Vergnügen eine MP3-Player.
Jetzt möchte ich auch einen kleinen Ozilloscope Effekt darstellen.
Dafür hole ich mir mit folgender function die die Daten
Delphi-Quellcode:
TWaveData = array[0..2047] of Cardinal;

function TJsMP3Player.WaveData: TWaveData;
begin
  BASS_ChannelGetData(FChannel,@Result,2048);
end;
In der BASS Hilfe steht, dass der 3. Parameter ist Anzahl der Sample angibt, wenn
nicht eine FFT Flag verwendet wird. Im LoWord von TWaveData ist der linke Kanal und im
HiWord ist der rechte Kanal.

Ich bekomme auch 2048 Samples zurück. Dummerweise enthalten aber nur die ersten 512 Samples
scheinbar sinnvolle Daten (Siehe Anlage 1. Wert linker Kanel; 2. Wert recher Kanal).

Warum bekomme ich nicht 2048 sinnvolle Samples?

Gandalfus 2. Jul 2005 11:10

Re: BASS.DLL und BASS_ChannelGetData
 
es sind immer nur die hälfte der Sampels Sinnvoll.

Zitat:

When requesting FFT data, floating-point values ranging from 0 to 1 are returned. Only the first half of the FFT is useful, so that's what BASS returns. For example with a 2048 sample FFT, it'll return 1024 values - the 1st value being the DC component, the 2nd the amplitude at 1/2048 of the channel's sample rate, then the amplitude at 2/2048, 3/2048, etc... A Hanning window is applied to the sample data to reduce leakage, unless the BASS_DATA_FFT_NOWINDOW flag is used.

Jens Schumann 2. Jul 2005 11:13

Re: BASS.DLL und BASS_ChannelGetData
 
Zitat:

Zitat von Gandalfus
es sind immer nur die hälfte der Sampels Sinnvoll.

512 ist grob geschätzt 1/4 von 2048.
Das bezieht sich auf die FFT. Das liegt im Wesen des FFT Algo's (die "nicht sinnvolle" Hälfte sind negative Frequenzen)

Gandalfus 2. Jul 2005 13:02

Re: BASS.DLL und BASS_ChannelGetData
 
btw.
Was wird bei einem Ozilloscope überhaupt angezeigt? Bei einer normalen Visualisierung ja die Amplitude der einzelnen Sinusschwingungen aber was beim Ozilloscope?

Jens Schumann 2. Jul 2005 13:26

Re: BASS.DLL und BASS_ChannelGetData
 
Hallo,
FFT steht für Fast Fourier Transformation. Die FFT zeigt das Frequenzsektrum eines Tones bzw des Zeitsignales. D.h. die FFT zeigt die einzelnen Frequenzen aus denen sich das Zeitsignal zusammensetzt. Ein Ozilloscope zeigt das Zeitsignal. Also die Amplitude zu einem Zeitpunkt t.

Gandalfus 4. Jul 2005 12:28

Re: BASS.DLL und BASS_ChannelGetData
 
ja aber die Amplitude von was?

dizzy 4. Jul 2005 13:50

Re: BASS.DLL und BASS_ChannelGetData
 
Zitat:

Zitat von Jens Schumann
Delphi-Quellcode:
TWaveData = array[0..2047] of Cardinal;

Die BASS.DLL liefert dir keine Cardinals, sondern SmallInts ;). So, und zwar mit SmallInts habe ich es auch in meinem Player verwendet.
Da du Cardinals hast, stimmt zwar die Aussage mit Hi- und Loword, aber so kannst du direkt indiziert auf die beiden Kanäle zugreifen, und dein Array wird entsprechend kürzer, so dass die Zufallswerte am Ende wegfallen dürften :).

Jens Schumann 4. Jul 2005 18:28

Re: BASS.DLL und BASS_ChannelGetData
 
Zitat:

Zitat von Gandalfus
ja aber die Amplitude von was?

Die Amplitude des Zeitsignals

Jens Schumann 4. Jul 2005 18:43

Re: BASS.DLL und BASS_ChannelGetData
 
Zitat:

Zitat von dizzy
Die BASS.DLL liefert dir keine Cardinals, sondern SmallInts ;). So, und zwar mit SmallInts habe ich es auch in meinem Player verwendet.
Da du Cardinals hast, stimmt zwar die Aussage mit Hi- und Loword, aber so kannst du direkt indiziert auf die beiden Kanäle zugreifen, und dein Array wird entsprechend kürzer, so dass die Zufallswerte am Ende wegfallen dürften :).

Hallo dizzy,
die Definition habe ich aus den Beispielen zur BASS.DLL.
Delphi-Quellcode:
Type TWaveData = array [ 0..2047] of DWORD;
Deshalb bin ich davon ausgegangen, dass ich 2048 gültige Werte für DWords (entspricht Cardinal) erhalte. Das macht 4096 SmallInts. D.h. mein Array wird größer. Wenn ich 512 DWord bekomme erhalte ich aber nur 1024 SmallInts. Die Beispiele suggerieren mir aber etwas anderes :freak:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:10 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