Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR Filter Optimierung eines PDM Signals auf STM32F407 simuliert mit Matlab


von Niels J. (niels)


Angehängte Dateien:

Lesenswert?

N'Abend,

ich ersuche hiermit die Hilfe einiger DSP Gurus ;)

Zu den Umständen:
Es geht darum, dass ich hier ein STM32F4 Discovery Board liegen haben, 
mit dessen MEMS Mikrofon ich mich beschäftige. Das Mikrofon gibt per I2S 
PDM Signale raus, die zwar bemerkenswert einfach z.B. per UART zu 
übertragen sind, sich aber nicht so schön verarbeiten lassen, weil das 
Mikrofon erst bei einer Sampling Rate von ~1 MHz anfängt zu übermitteln.

Zum dem, was ich bisher getan habe:
Also habe ich mich ein wenig weiter in das Thema eingearbeitet, das PDM 
Signal auf den Computer übermittelt, mit Maltab einen FIR Filter 
erstellt, diesen auf den STM32 portiert, die gefilterten Daten wieder an 
Matlab gesendet, da ein wenig rumgespielt, bla bla bla...

Zu dem Problem:
Soweit funktioniert auch alles ganz gut. Aber eben nur gut und nicht 
schön, vor allem nicht klanglich schön. Wenn ich die Signale dann 
akustisch ausgebe ist da schon ein ziemlich starkes Rauschen drin egal 
wie ich den FIR Filter noch verändert habe, es wurde nicht besser
(Zu sehen im "FIR_filtered.jpg", zu hören im "st_fir_8k.wav");

Was in dem Signal an "Potential" drin steckt merke ich, wenn ich auf 
eine komplette Aufnahme eine FFT anwende, dann die Frequenzen stutze und 
alles wieder zurück wandle. Klingt viel besser, sieht auch besser aus 
(Zu sehen im "FFT_filtered.jpg", zu hören im "ml_fft_8k.wav") Allerdings 
ist die FFT auf 2.000.000 Werte ausgeführt. (Ein Hoch auf das 21. 
Jahrhundert und schwachsinnig viel Rechenpower :D)
Das geht auch in Echtzeit mit weniger Werten, aber bisher nur auf dem 
Computer, und ich glaube nicht, dass der STM32F407 125 8192-lange FFTs 
pro Sekunde ausführen kann.

Da ich aber an sich auch noch gar nicht so viel Ahnung von DSP habe, 
kann es ja auch sein, dass ich den FIR Filter einfach nur suboptimal 
konzipiert habe, deswegen die Bitte an euch, einmal drüber zu gucken, ob 
sich da noch was machen lässt, und wenn ja was (und wie).

Im Anhang habe ich mein bisheriges Vorgehen einmal aufgearbeitet, ich 
hoffe übersichtlich genug.

Beste Grüße und schonmal Dank vorab für evtl. Anregungen

Niels

PS.:
Das Audio Signal bitte nicht ernst nehmen mir ist bei der Aufnahme 
irgendwie  nichts besseres eingefallen. Aber es passt sehr gut, wenn 
irgendwas nicht klappt ;)

: Bearbeitet durch User
von Raymund H. (raymund_h)


Lesenswert?

Wenn ich mir das .m ansehe, dann liegt das Problem des FIR bei der 
Stopbandunterdrückung.

Dieser hat nur 127 taps? Es wird 1/128 dezimiert? Das ist ziemlich 
schlecht und ein großer Teil des Rauschens außerhalb des Bandes von 
Interesse wird dabei in den hörbaren bereich gespiegelt.

Mach doch mal eine FFT über das FIR und schaue dir die 
Stopbandunterdrückung an.

Das FFT Filter hingegen hat so viel taps wie das audio lang ist also ca 
2e6. Die Stopbandunterdrückung ist dann per Definition unendlich, also 
praktisch nahe am Optimum wenn auch das Rechteckfilter zu großen 
zeitlichen Einschwingeffekten führt.

Für so ein Signal bietet sich die Dezimierung und Filterung wie auch in 
DS (Delta Sigma) Wandlern an, zwecks Rechenaufwand.

von Niels J. (niels)


Lesenswert?

N'Abend

Raymund H. schrieb:
> Dieser hat nur 127 taps? Es wird 1/128 dezimiert? Das ist ziemlich
> schlecht und ein großer Teil des Rauschens außerhalb des Bandes von
> Interesse wird dabei in den hörbaren bereich gespiegelt.

Da lag der Hase also im Pfeffer. Das test weise erweitern auf 511 Taps 
hat schon wahre Wunder bewirkt, auch bei nur 8k Wiedergabe. Auf die 127 
Taps war ich vorher gekommen, weil Fs ja bei 1 MHz liegt und ich als 
Ausgabe ~8 kHz haben wollte (1.000.000 / 8.000 = 125 ~ 128). Wenn ich 
das PDM-Signal aber z.B. in einen 512 Werte langen Ringbuffer 
unterbringe und alle 8 kHz darauf zu greife sollte das auch erstmal 
seinen Zweck erfüllen.

Raymund H. schrieb:
> Für so ein Signal bietet sich die Dezimierung und Filterung wie auch in
> DS (Delta Sigma) Wandlern an, zwecks Rechenaufwand.

Wunderbar, ein weiterer Ansatz, dann habe ich ja wieder was zum 
(ein)lesen ;)

Besten Dank schon mal

Niels

von Detlef _. (detlef_a)


Angehängte Dateien:
  • t.m (2,05 KB)

Lesenswert?

Hallo Niels,

ich habe mal erheblich gebastelt, weil ich auch diese wunderbaren MEMS 
MICs habe und die demnächst auch an der Start bringen werde. Da kamen 
mir Deine Mitschnitte gerade recht. In deren Spektren ist ja wunderbar 
das fette Rauschen bei hohe Frequenzen zu sehen, 'noise shaping', 
wunderbar.

Du bildest den Mittelwert aus 512 samples Deines PDM Signals und greifst 
darauf mit 8kHz zu. Dazu brauchst Du die 512 Werte nicht abzuspeichern, 
da gibts nen Trick, der heißt CIC Filter, die englische Wikipedia ist da 
besser:
http://en.wikipedia.org/wiki/Cascaded_integrator%E2%80%93comb_filter

Aber auch mit den Mittelwertfiltern war das Rauschen noch fett zu hören. 
Wenn man es nicht mehr hören konnte war die Sprache zu dumpf, weil der 
Filter nicht steil genug abfiel, das hat mir nicht gefallen.

Ich habe jetzt zum Filtern des PDM Signals ein elliptisches Filter 
entworfen, das steil absackt und 100dB Dämpfung bei hohen Frequenzen 
macht, das war nötig, 80dB reichten nicht. Das macht ein wunderbar 
rauschfreies Ausgangssignal.

Das Filter ist 4.Ordnung, mit zwei Nullstellen/Polstellenpaaren (es wäre 
es nochmal wert zu checken, ob 2.Ordnung auch reichen könnte). Das 
Filter läuft auf der hohen Abtastrate des PDM Signals, nicht dezimiert.

Dieses Filter habe ich in zwei Pol-/Nullstellen Pärchen (biquads) 
geteilt und die Koeffizienten angepaßt, damit die Rechenlast machbar 
wird indem man die Multiplikationen durch shift/add ersetzen kann. Vllt. 
kann der ARM auch schnell genug multiplizieren, maß man mal sehen.

Gerechnet wird in 32Bit integer, die Rechenlast beträgt pro 
Ausgangssample (ungefähr, hohe Abtastrate, siehe angehängte Matlab 
source, verbesserbar weil die Eingangswerte sind nur +/- 1)

1.Filter forward  Coeff.: 3 shift/6 add
1.Filter feedback Coeff.: 4 shift/7 add
2.Filter forward  Coeff.: 1 shift/5 add
2.Filter feedback Coeff.: 2 shift/9 add

Das ganze muss bei meinen MICs mit 3MHz laufen, 30 Millionen shifts und 
81 Millionen Additionen sind nicht unrealistisch.

Soweit erstmal, script ist nicht ausführlich kommentiert, gern bei 
Interesse mehr.

War eine interessante Frage, THX.

Cheers
Detlef

PS: 2.Ordnung reicht nicht, rauscht
PPS: wabbwabbwabbwaaaaaaa :)

: Bearbeitet durch User
von Niels J. (niels)


Lesenswert?

Detlef _a schrieb:

> ich habe mal erheblich gebastelt, weil ich auch diese wunderbaren MEMS
> MICs habe und die demnächst auch an der Start bringen werde. Da kamen
> mir Deine Mitschnitte gerade recht. In deren Spektren ist ja wunderbar
> das fette Rauschen bei hohe Frequenzen zu sehen, 'noise shaping',
> wunderbar.
> k
> Du bildest den Mittelwert aus 512 samples Deines PDM Signals und greifst
> darauf mit 8kHz zu. Dazu brauchst Du die 512 Werte nicht abzuspeichern,
> da gibts nen Trick, der heißt CIC Filter, die englische Wikipedia ist da
> besser:
> http://en.wikipedia.org/wiki/Cascaded_integrator%E2%80%93comb_filter

Und ein weiterer Filter zum lesen, wunderbar ;)

> Ich habe jetzt zum Filtern des PDM Signals ein elliptisches Filter
> entworfen, das steil absackt und 100dB Dämpfung bei hohen Frequenzen
> macht, das war nötig, 80dB reichten nicht. Das macht ein wunderbar
> rauschfreies Ausgangssignal.

Sehr interessant, ich werde mir gleich mal die Akkustische Ausgabe aus 
deinem .m File anhören. "Klingt" ja so, als ob da noch richtig was geht.

> Das ganze muss bei meinen MICs mit 3MHz laufen, 30 Millionen shifts und
> 81 Millionen Additionen sind nicht unrealistisch.

Wie kommen die 3 MHz bei dir zu Stande? 192k mit 16 bit Auflösung?

> War eine interessante Frage, THX.

Da nicht für, war ja nicht ganz uneigennützig die Frage ;)

> PS: 2.Ordnung reicht nicht, rauscht.

Gut zu wissen.


Raymund H. schrieb:
> Für so ein Signal bietet sich die Dezimierung und Filterung wie auch in
> DS (Delta Sigma) Wandlern an, zwecks Rechenaufwand.

Mal kurz zum Verständnis:
Der Bitstream des Delta Sigma Wandlers entspricht doch eigentlich genau 
dem, was das PDM Signal darstellt, oder wo liegt da der Unterschied? 
Unter der Annahme, dass dem so ist, muss ich das Signal im Grunde ja 
"nur" durch einen Tiefpassfilter und Decimator schicken, um ein 
wesentlich niedriger "gesampletes" PDM Signal zu bekommen, richtig? 
(Zumindest laut dieser Seite: 
http://www.beis.de/Elektronik/DeltaSigma/DeltaSigma_D.html ) Und habe 
ich nicht genau das Schon zu Anfang, evtl. auch mit zu geringer Breite 
gemacht?


Was ich mich aber langsam frage ist, welchen Vorteil man durch ein MEMS 
Mikrofon hat... Wenn ich mir das mal so ansehen, 3 MHz Sampling Rate, 
diverse digitale Filter.. Wäre ein normales Kondensatormikrofon  nicht 
doch zweckmäßiger? Das soll übrigens nicht heißen, dass ich die Flinte 
ins Korn werfen will oder so, ich habe sowieso noch keinen so konkreten 
Nutzen, als dass ich auf Zweckmäßigkeit achten müsste.

Aber das sieht schon nach einer recht ordentlichen Belastung aus.
> Das ganze muss bei meinen MICs mit 3MHz laufen, 30 Millionen shifts und
> 81 Millionen Additionen sind nicht unrealistisch.

Da Frage ich mich dann auch, wie ST es geschafft hat zusätzlich dazu 
auch noch einen Speex Encoder und ein paar weitere Codecs zu 
implementieren.

Beste Grüße

Niels

: Bearbeitet durch User
von Detlef _. (detlef_a)


Lesenswert?

Hi,

>>>
> Das ganze muss bei meinen MICs mit 3MHz laufen, 30 Millionen shifts und
> 81 Millionen Additionen sind nicht unrealistisch.

Wie kommen die 3 MHz bei dir zu Stande? 192k mit 16 bit Auflösung?
<<<<

Ich habe MICs von dieser Firma http://www.knowles.com/,  da schickt man 
maximal 3MHz Takt rein und raus kommen Bits, die man dezimieren muss.

>>>>>
Raymund H. schrieb:
> Für so ein Signal bietet sich die Dezimierung und Filterung wie auch in
> DS (Delta Sigma) Wandlern an, zwecks Rechenaufwand.
<<<<<<

Raymund meint wahrscheinlich auch die CIC Filter.

>>>>>>
ich habe sowieso noch keinen so konkreten
Nutzen, als dass ich auf Zweckmäßigkeit achten müsste.
<<<<<<
Die MEMS MICs gehen bis 80kHz, damit kann man super Fledermäuse 
belauschen.

Dieses Filter eignet sich auch super für nen kleines CPLD oder FPGA, 
dafür ist das ein Klacks.

Cheers
Detlef

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.