Forum: Digitale Signalverarbeitung / DSP / Machine Learning moving window DFT auf DSP, begrenzter SRAM


von MadTulip (Gast)


Lesenswert?

Moin moin.

Auf meinem DSP habe ich einen konstanten Strom von 2000Hz gesampleten 
Zeitdaten (vorgefiltert um Freq. über 1kHz zu entfernen(Nyquist). Diese 
Daten erreichen mich in Stücken von 125 Sample je Paket und werden in 
der Größe in ein Protokoll eingebettet wieder aus dem DSP geschickt. 
Diese Größe sei fix.

Ich möchte jetzt diese Zeitdaten Freq filtern. z.B. einen 50Hz Nodge 
Filter gemeinsam mit einer DC entfernenden Hochpass bei 0,5Hz.

Ich bin mir jetzt nicht sicher, ob ich das mit dieser Blockgröße machen 
kann, oder ob ich mindestens eine Fenstergröße von 1000 oder 2000 Sampel 
brauche.

Wenn ich die Zeitdaten mit einem Filtervektor von der Größe 1000 falte, 
dann irgendwas zwischenspeicher und dann mit dieser Vorbedingung das 
nächste Paket filter, müsste der Filter doch ab 2000/125 Paketen 
"eingeschwungen" sein (keinen Leck Effekt mehr aufweisen) und sinnvolle 
Ausgaben liefern oder?

Man sieht sicher schon an diesem letzten Absatz, wo die 
Verständnissprobleme liegen. Die Faltung mit einem Zeitvektor der den 
Filter darstellt sei als Funktion gegeben. Der Zeitvektor sei gegeben. 
Was speicher ich zwischen? Ist dieser Aufbau prinzipiell möglich? 
Wieviel Speicher benötige ich dafür? Stichworte, Beispielcode oder 
nähere Erläuterungen währen sehr hilfreich.

Vielen Dank für eure Zeit!

von MadTulip (Gast)


Lesenswert?

Oder anders:

Kann ich mit einem konstanten Strom von 125 Sample großen Paketen eine 
Filterung mit DFT auf Daten durchführen, welche bei 2kHz gesampelt 
worden sind ? Wieviel Speicher in Samples brauche ich dafür mindestens 
und wie sollte man soetwas machen ? Ich möchte jetzt nicht die 125 
Sample großen Pakete solange speichern, bis ich gleichzeitig 2000 Sample 
habe und darauf den Filter anwenden! - dafür reicht der SRAM nicht.

von Karl (Gast)


Lesenswert?

Also ich hab das mal so gelesen, dass du Daten in 125er Paketen 
bekommst, die aber eigentlich nur filtern willst. Also eine DFT/FFT wäre 
bei dir ein Weg für die Filterung, aber nicht notwendig.

Dann solltest du dir überlegen, was für ein Filter du tatsächlich 
brauchst. Also Übertragungsfunktion finden.

Im Hinblick auf den Speicher wäre ein IIR Filter nicht schlecht, falls 
das nicht wegen seiner Eigenschaften ausscheidet. Ansonsten bliebe ein 
FIR, da sollte dann die Ordnung klein sein. Du musst aber mindestens die 
Filterordnung an Speicherstellen bereithalten. Ich kenne keinen Weg, mit 
weniger auszukommen.

Grüße!

von Detlef _. (detlef_a)


Lesenswert?

Das geht ohne Probleme. Für den 50Hz notch würde ich ein IIR 2.Ordnung 
nehmen, die wurden hier schon lang und breit diskutiert. Und für den 
DC-Entferner tuts' je nach Anforderung auch ein Filter kleiner Ordnung. 
Die kannst direkt auf Deinen 125er Stücken filtern, das wird gehen.

Cheers
Detlef

von MadTulip (Gast)


Lesenswert?

Ok, vielen Dank schonmal für die Antworten.

Ich habe jetzt mit Matlab R2009b "fdatool" einen IIR Filter designed.
Apass1 = 2 dB
F_pass1 = 47Hz
F_stop1 = 49Hz
Astop2 = 40 dB (attenuation)
F_stop1 = 51Hz
F_pass2 = 53Hz
Apass2 = 2 dB
Das ganze kann man direkt als C-Code ausgeben lassen in welchem einem 
dann Numerator, Denominator, Numerator Läenge und Denominator Länge als 
die berechneten Variablen erstellt werden. Ich vermute es handelt sich 
hier um die Koeffizienten der Übertragungsfunktion des Filters. Das 
praktische daran direkt die Übertragungsfunktion zu speichern ist ja im 
Vergleich mit der Faltung mit der Impulsantwort eines FIR Filters im 
Zeitbereich, dass man wesentlich weniger Bytes SRAM für die 
Koeffizienten der Übertragungsfunktion als für die ganze (infinite :)) 
Impulsantwort braucht. Ich hoffe richtig verstanden zu haben, dass Ihr 
vorgeschlagen habt die Zeitdaten lieber als Parameter an eine 
Übertragungsfunktion zu übergeben, als mit der Impulsantwort dieser 
Übertragungsfunktion zu falten? Danke für den Tip.

Auf C Seite wollte ich mit dieser Übertragungsfunktion nun mit der 
Funktion "dsp32_filt_iir" des AT32UC3 Framework DSPLib

http://asf.atmel.no/avr32/services/dsp/dsplib/examples/dsp16_fir/at32uc3b0256_evk1101/doc/html/a00012.html#gacde330d4789e2c1de70baeb93555ff53

auf meine Zeitdaten anwenden. Leider kann ich für diese Lib nur für den 
FIR Teil Beispiele finden und bin mir bei deren Parametern noch nicht 
ganz im Klaren.

Ich bin mir auch immer noch nicht ganz sicher, ob die kürze von 125 
Samples welche bei 2kHz aufgenommen worden sind wirklich ausreichen um 
sie zu filtern. Ich meine mich von der Verwendung von FIR Filtern noch 
daran zu erinnern, dass z.b. ein kurzes Datenstück, welches mit einem 
hohem Offset beginnt und bei diesem hohen Offset auch das ganze 
Datenstück über bleibt, (z.B. nen Sinus von 10Hz mit einer Amplitude von 
0.0001 V aber 3V Offset) nach der Faltung mit dem FIR fast genauso 
aussieht wie der Filterkernel selbst. Das ist ja auch verständlich, wenn 
man sich das 3V Offset als Einheitssprung vorstellt und den aufgesetzten 
minimalen Sinus mal ignoriert.

Na, ich denke ich werde IIR morgen erstmal in Matlab ausprobieren. Evtl. 
ist das ja auch nur ein Problem der FIR und kommt bei den IIR garnicht 
vor.

Vielen Dank für eure Ratschläge bisher!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.