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 ;)
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.
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
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 :)
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
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