Sampledaten buffern
-
Hallo!
Ich versuche mittels FFT Frequenzen auszulesen. Um diese Frequenzen zu bekommen muss ich an die Sampledaten kommen un diese in gewissen Zeitabschnitten neu einlesen.
Wie buffere ich die Sampledaten denn am besten, so das ich möglichst keinen Verlust von Sampledaten habe?
Danke
MFG
Hansi
-
Wie buffere ich die Sampledaten denn am besten, so das ich möglichst keinen Verlust von Sampledaten habe?
Wie wärs mit nem buffer?
:pMal ganz abgesehen davon, dass du eh ein problem hast wenn deine Abtastrate so hoch ist, dass die FFT nicht mehr nachkommt, da dein Buffer dann wächst und wächst und wächst, aber niemals mehr kleiner wird solange samples rein kommen.
Würde dann eher das problem an der wuzel anpacken, also die sample-rater runterfahren oder ne schnellere FFT implementation bauen.
-
Naja, musst du dir halt die entsprechende API angucken die du verwenden willst. Normalerweise hat man bei DirectSound nen RingBuffer und bei den waveInXxx Funktionen schaust du einfach dass du dem System immer mindestens 2-3 Buffer übergeben hast die quasi "reserve" sind. Also z.B. für 4 Buffer "record" aufrufen (k.A. wie die Funktion genau heisst), dann auf einen warten, Daten auswerten/wegschreiben, und gleich wieder "record" drauf aufrufen.
Windows kümmert sich dann darum dass keine "Lücke" entsteht solange immer wenn der aktuelle Buffer "voll" geworden ist bereits ein weiterer leerer in der Queue steht.
-
Hallo! Danke euch beiden! Ja ich hatte im Vorfeld schon bisschen getestet, aber mir gingen wie angesprochen ein paar Sampledaten verloren.
@hustbaer wie genau funktioniert das denn? Hab das Prinzip irgendwie nicht verstanden...
Danke
MFG
Hansi
-
Wie funktioniert was? DirectSound oder waveInXxx? DirectSound ist etwas kompliziert, die waveInXxx Funktionen sind relativ einfach.
- Device aufmachen (waveInOpen)
- Buffer vorbereiten (waveInPrepareHeader)
- und ans Device übergeben (waveInAddBuffer)
(Steps 2 und 3 für ein paar Buffer wiederholen) - Aufnahme starten wenn du genug Buffer vorbereitet hast (waveInStart)
- Buffer die fertig werden verarbeiten (was du auch immer damit machen willst), dann "freigeben" (waveInUnprepareHeader), und dann mit (2) und (3) wieder dem Device übergeben damit das neue Daten reinschreiben kann