Bandpass Filter

MasterOD

treuer Stammgast
Ich suche einen Algorithmus für einen Bandpass, bzw. eine Erklärung dazu. Ich will einen Filter schreiben, der aus einem Signal in "Echtzeit" (d. h. immer recht kurze Blöcke von nur ein paar Samples) einen bestimmten Frequenzbereich rausfiltert. Anfang und Ende sollen frei bestimmbar sein, z. B. alles von 968-1023 Hz.

Kennt sich da wer aus?
 
DSPs sind hier garantiert nicht der Schwerpunkt :D

Ich würde auch nur googeln
Aber bei den kurzen Blöcken dürfte dasselbe Problem wie bei der FFT auftreten:
Eine richtige Fensterung ist enorm wichtig, sonst hast Du in den Randbereichen nur Blödsinn

Gruss
Tim
 
Wenn ich ne FFT mach bekomm ich ja n Array mit der 'häufigkeit' der Frequenzen zurück.
Kann ich dann einfach hingehen und in dem gewünschten bereich die werte um nen beliebigen faktor verkleinern?
Wie rechne ich das Array dann wieder zurück? Gibs sowas wie ne reverse FFT?


Ich hab nen ne formel im netz gefnden: IIR
(IIR Audio Biquad Filter)

Kann man damit was anfangen?
(Kennt jemand ein Forum wo sich DSP Profis tummeln?)
 
Erstmal Grundlagen verstehen. Im Tietze-Schenk findet man Einiges.
Ausserdem
http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation
Nochmal zur Fensterung:
Wenn Du ein bestimmtes Fenster untersuchst, dann ist an den Rändern ein Sprung von kein Signal -> Signal (oder umgekehrt)
Dieser Sprung verfälscht das Gesamtspektrum, da er ja in Wirklichkeit nicht vorhanden ist. Deswegen gibt es verschiedene Fenster-Methoden, den Randbereich zu betrachten.

:D
Tim

PS: Wenn Du was Gutes mit google gefunden hast, dann schreib´s ruhig mal
 
Ich hab mir mal ein paar Dokus zur Digitalen signalverarbeitung zusammen gegoogelt und lees mich mal ins thema ein.

ich hab aber noch ne andere frage....

Ich will die Wave Dateien nicht komplett in den Speicher laden, also hab ich mir gedacht, ich lad die datei stückweise und hau die teile in den DirectSoundBuffer.
Ich teil den Buffer in zwei Teile à 2 Sekunden (nur in gedanken der buffer bleibt am stück) auf und lade wenn ich grad im einen teil bin den anderen neu.
Beim Laden des ersten Teils gibs keine Probleme, nur beim laden des zweiten teils...
Mit
DSB.writebuffer 0,bufferlengts/2,bytearray,DSBLOCK_DEFAULT
lade ich den ersten teil.

ich kann aber den zweiten ledier nicht nicht durch
DSB.writebuffer bufferlength/2,bufferlength/2,bytearray,DSBLOCK_DEFAULT
nicht den zweiten teil laden (da stürtzt mir vb immer ab.
dann hab ich das mal so probiert:


Private Sub tmrDurchlauf_Timer()
Dim DCursor As DSCURSORS

DSB.GetCurrentPosition DCursor

If BufferSektion = 0 And DCursor.lPlay > BufferLength/2 Then
Get #DateiNr, 45 + BufferCount * BufferLength/2, soundBytes
BufferCount = BufferCount + 1

DSB.WriteBuffer 0, BufferLength/2, soundBytes(0), DSBLOCK_DEFAULT
BufferSektion = 1
ElseIf BufferSektion = 1 And DCursor.lPlay < BufferLength/2 Then
Get #DateiNr, 45 + BufferCount * BufferLength/2, soundBytes
BufferCount = BufferCount + 1

DSB.Stop
DSB.GetCurrentPosition DCursor
DSB.SetCurrentPosition BufferLength/2
DSB.WriteBuffer 0, BufferLength/2, soundBytes(0), DSBLOCK_FROMWRITECURSOR
DSB.SetCurrentPosition DCursor.lWrite

DSB.Play DSBPLAY_LOOPING
BufferSektion = 0
End If
End Sub



Das reinladen klappt aber ich hab jedes mal wenn der 2. Teil geladen wird ne (minimale) unterbrechung im sound (wegen den Stop und Start).

Kennt wer ne bessere lösung?
 
Oben