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
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 :)
:
Bearbeitet durch User
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.