Hallo in die Runde. Dies hier ist mein erster Beitrag, aber ich habe hier schon viel mitgelesen und denke, dass ich hier die richtige Community anspreche. Falls mein Beitrag besser in den Mikrocontroller-Bereich passt, verschiebt ihn gern dahin.
Ich suche eine Art externe Soundkarte, die mir ein PDM-Signal in USB Audio oder, noch besser (v.A. um keine Bit-Tiefe zu verlieren) in zwei analoge Audiosignale umwandelt.
Aktuell verwende ich dafür ein nRF5340 Audio DK mit einer minimalen Beispielfirmware, was ich gern ablösen würde, da es mir inzwischen zu viele Workarounds enthält.
https://www.nordicsemi.com/Products/Development-hardware/nRF5340-Audio-DK
Spezialanforderung dabei ist die Frequenz des Audiosignals, das ich gern mit 192kSamp/s abtasten würde, um am Ende bei (knapp unter) 96kHz Nah-Ultraschall zu landen. Der Codec auf dem nRF Board unterstützt dies zwar noch, der nRF selbst kann das entstehende Signal dann aber selbst nicht mehr abtasten, weshalb ich aktuell den analogen Kopfhörerausgang des nRF-Boards nutze (der direkt vom Codec kommt) um das Signal zu extrahieren.
Anhand des vorigen Absatzes sieht man schon, mit wie vielen Krücken das ganze aktuell läuft. Der nRF wird dabei lediglich zur Konfiguration des Codecs verwendet und eigentlich ja gar nicht mehr gebraucht, bringt aber potentiell wieder Störsignale in das Gesamtsystem ein.
Daher kommt also meine Bestrebung einen Ersatz dafür zu finden.
3,072 MHz PDM Takt, oder auch 6 MHz falls sinnvoll, dann aber mit einem anderen Mikrofon
Unterstützt zwei parallel angeschlossene Mikrofone (eins bei fallender, eins bei steigender Taktflanke, wie bei PDM üblich)
gewünschtes Audio-Ausgangssignal:
am liebsten beide Kanäle (aber nicht zwangsläufig), also zwei parallele Ausgänge, minimal einen Ausgang mit wählbarer Flanke (erster oder zweiter Kanal dann "händisch" auswählbar)
96 kHz als höchste Frequenz (oder knapp darunter, damit ich bis ~90kHz sinnvoll sehen kann) --> Also Abtastung mit 192 kSamp/s Die Problematik bzgl. Integration des Mikrofons und entsprechender Signalanteile, die bei Ultraschall durch nahegelegene Bauteile entstehen etc. ist mir bekannt, damit muss ich wohl leben...
Bisher erwogene Alternativen (und deren Schwächen):
Audio Codec DKs (vielleicht unterstützt eins davon ja wirklich das, was der Codec selbst auch kann):
Unbedingt zu erwähnen hier natürlich das "Digital Swiss Army Knife for Audio" MCHStreamer Kit ( https://www.minidsp.com/products/usb-audio-interface/mchstreamer ): läuft leider ebenfalls nur auf 48kHz, ist aber bestimmt für viele andere Anwendungen sinnvoll, daher hier erwähnt.
Letzter Ausweg: versuchen selbst etwas zu bauen unter Zuhilfenahme von z.B. Adafruit PDM to I²C und I²C Auslesen, klingt für mich aber auch sehr nach Bastellösung bzw. Problemverschiebung, oder?
Was meint ihr dazu? Seht ihr noch zusätzliche Alternativen oder ist es einfach nicht / oder nicht sinnvoll möglich, weil meine Anforderungen falsch gestellt sind? Ich bin mir schon der Tatsache bewusst, dass weder das Mikrofon, noch das Hardwaredesign am Ende "optimal" für den Zielfrequenzbereich geeignet sind, aber irgendeine sinnvollere Lösung als meinen jetzigen Aufbau mit nRF5340 DK muss es doch geben, oder?
Vielen Dank für eure Unterstützung und für die Geduld bis hier hin weiterzulesen.
Schau mal ADAU7002 als PDM-I2S Brücke (geht bis 96kHz).
Danach kannst du ein "York Audio USB-Modul" nehmen. Das kannst du als I2S Master/Slave konfigurieren und unterstützt ebenfalls 96kHz.
ADAU7002: anscheinend hat der einen fixen PDM clock, der sich direkt aus der sample-rate berechnet. Ist das üblich für PDM? Das York Audio USB-Modul kannte ich bisher noch nicht. Sieht gut aus.
ESP32 mit I2S DAC wäre auch eine Idee. Einen ESP32 hab ich auch schon hier.
Wahrscheinlich läuft es also darauf hinaus, dass ich mir selber etwas zusammenstecken muss. Falls jemandem noch weitere Off-The-Shelf-Komponenten einfallen, fruee ich mich gern über weitere Ideen.
Ein D-Flipflop mit nachgeschaltetem R-C Glied ist wohl die einfachste Möglichkeit eines PDM zu Analog Wandlers.
Im Anhang eine mögliche Schaltung. Für 2 Kanäle benötigst du nur das R-C Glied, den Koppelkondensator und die Ausgangsbuchse doppelt (LR auf Ground für beide Kanäle).
Noch einfacher, und würde wahrscheinlich auch funktionieren:
Funktionieren wahrscheinlich schon, nur wahrscheinlich in extrem schlechter Qualität.
Damit das tauglich wird muss der Tiefpass extrem steilflankig sein und damit digital.
Mich würde aber das Hörergebnis interessieren, falls es jemand ausprobiert.
Hi,
ich habe mal die MEMS mics an eine I2S Schnittstelle und den PDM Strom mit einem IIR Filter bearbeitet. Danach hab ich dezimiert. Das hat verglichen mit FIR filtern sehr gut funktioniert. FIR klingt dumpf wenn die Grenzfrequenz zu niedrig ist oder rauschig wenn sie zu hoch ist.
Besonders viel Spaß gemacht hat die Implementierung des IIR. Das bekommt einen digitalen input 0/1 und man benötigt nur jeden 16. Ausgangswert. Dieser Wert läßt sich direkt aus dem Zustand des IIR und dem reingekommenen 16Bit Wort über eine Tabelle berechnen. Das geht auch schnell für IIRs höherer Ordnung.
Um einen PDM Datenstrom gut zu filtern und zu dezimieren benötigt man keine dezidierte Hardware, das schafft der uC nebenbei im Interrupt. Ich erinnere mich nicht mehr an die Bitbreiten und SNRs.
Ja, so gehts' auch, aber langsam. Er rechnet auf den PDM Daten ein 512er FIR mit Tabelle und 16Bit Eingangsdaten. Das sind 512/16 Multiplikationen pro 16Bit PDM Wort, wenn ich das richtig verstanden habe. Er sagt ja selbst, dass es viel Rechenleistung frisst. Für ein IIR 4.Ordnung benötigt man eine Handvoll Multiplikationen pro 16Bit PDM Wort. Ein IIR 4.Ordnung ist ausreichend für sehr gute Qualität des Ausgangssignals, viel besser als ein 512erFIR, das entweder dumpf ist oder rauscht. Die 4. Ordnung hatte ich in diesem Forum mal anhand von realen PDM Daten ausgemetert.
Noch einfacher, und würde wahrscheinlich auch funktionieren:
Funktionieren wahrscheinlich schon, nur wahrscheinlich in extrem
schlechter Qualität.
So ist es. Die PDM Daten sind ja überwiegend Rauschen. Nicht nur wegen der Rechtecke.
Damit das tauglich wird muss der Tiefpass extrem steilflankig sein und
damit digital.
Man kann das auch analog machen mit einem LR-Filter z.B., aber eben nicht nur mit 6db/oct.
Digital ist auch nicht unbedingt einfacher. Die oft eingesetzen CIC liefern kein gutes Ergebnis.
Mich würde aber das Hörergebnis interessieren, falls es jemand
ausprobiert.
Ich habe eine 4.8MHz basiserte 6-Kanal-Spracherkennung gebaut. Das holt das maximale aus den 60dB THDN Mikros heraus. Die kleinen MEMS-Dinger bleiben aber leistungsbeschränkt.
Eine gute Kapsel für Mikros, wie wir sie in der Mikrofontechnik verwenden, ist damit nicht zu erreichen.
Um einen PDM Datenstrom gut zu filtern und zu dezimieren benötigt man
keine dezidierte Hardware, das schafft der uC nebenbei im Interrupt.
nun ja ... kommt eben auf die Ansprüche an: Eine klassische Hogenauer-Dezimation geht nur runter bis kurz über die Audiogrenzfrequenz, also bei den 3MHz z.B. 128:1. 256 böte sich eher an, wäre aber schon zu tief. Damit liegt man in etwa bei 28kHz, hat aber bis 500kHz noch massive Störspektren. Das mit 192 oder gar 96 anzunehmen, würde also Aias einschleppen.
Da muss also zwingend ein FIR rein, denn man aber auch mit ausreichender Frequenz abtasten muss.
Und er muss ziemlich lang oder mehrstufig werden. Wenn man das gut und für mehrere Kanäle machen will, ist da ein FPGA unschlagbar, oft genug unverzichtbar - besonders, weil hinterher auch noch ein Frequenzgangkorrektur reinmuss: Je nachdem wie die Mikros verbaut sind und wie sie verschaltet werden, ist der ja alles andere als linear.
Ich fahre z.B. 4.8MHz MEMS mit 48MHz-Interpolation auf 1024 samples. Greift also bis 48kHz. Dann wird auf 4,8MH gesampelt und wieder herunterdezimiert, bis 4,8kHz mit Bandbegrenzung auf 24kHz. Dann ein drittes mal auf 4.8Hz wieder mit Bandbegrenzung 24kHz. Faktisch hat man damit bei 24kHz dann -6dB und bei 20kHz die -3dB. Man kriegt sogar schon einen leichten Hochpass ins Signal um 20Hz abwärst zu reduzieren.
2016 hatte ich mal MEMS mit IIR gefiltert. Beitrag "FIR Filter Optimierung eines PDM Signals auf STM32F407 simuliert mit Matlab"
Das hat super funktioniert. Was ich damals noch nicht konnte: Nach dem Filtern werden die Werte ja um z.B. Faktor 16 dezimiert, nur jeder 16-te Ausgangswert des IIR ist von Interesse. Die MEMS liefern nur 0/1, damit kann über Tabellen berechnet werden wie bei gegebenem Zustand des IIR und bekanntem 16Bit Wort vom MEMS der Zustand des IIR nach den 16 Bits input aussieht. In den Tabellen stehen Polynomkoeffizienten. Das geht super schnell.
Im dortigen thread wird im Übrigeng genau mein Einwand diskutiert- nämlich die Problematik der erforderlichen Tiefe / Anzahl der TAPs.
Egal: Die FIR sind grundsätzlich mal genauer und besser, sowie meßtechnisch leichter zu handhaben, weil man die Bänder passend biegen kann, brauchen aber gewaltig Rechenzeit (und das auch und vor allem wegen der minimal erforderlichen Meßperiode um ein Fenster sinnvoll anwenden zu können).
Nur mit einem FPGA bekommt man bei den 3MHz die Oberwellen und die Grundwelle von der Länge her sauber hin und ist mit Parallelisierung auch noch fein genug, um weiter abtasten zu können. Ansonsten bleibt nur das übl(ich)e Kaspern mit einem CIC als vorgeschaltetem Dezimator.
Z.b. könnte man mit 192.000 64fach rechnen und einen 128Tap bauen. Der kommt auf knapp 24kHz mit 4 von 7 bit raus. Dann das Gleiche 8mal abgetastet mit Viertelband bei 24kHz GF, greift bis auf 12kHz bringt etwa 8 von 14bit brutto. Ab dann ein langer Filter mit 1024 bei ca 192000, greift bis nach unten, bringt 6 von 10Bit und damit geschätzt 10 Bit "analoge" Auflösung bei 24 Bit.
In CIC bringt bei fast Null Rechenaufwand mit der möglichen Dezimation von 32 zur Samplingfrequenz nur 5 Bit Brutto mit massenhaft Oberwellen. Nimmt man einen 8x3 reicht man auf 11kHz runter, darf aber mehre davon parallel laufen lassen, um ausreichend Samples zum Abtasten zu bekommen, nötig ist, um die Oberwellen nicht als Alias zu bekommen, wenn man direkt mit 96kHz sampelt.
Mal was anderes:
Mittlerweile gibt es ja Mikrofone, die statt PDM I2S ausgeben. Damit spart man sich dann den Filter. Hat ein PDM Mikrofon da noch Vorteile?
Was ich erstaunlich finde: Im Mikrocontroller bedeutet die Implementierung des Filters doch einigen Aufwand, aber man scheint das ganze auf die Fläche des kleinen Mikrofons reduzieren zu können.
Kommt auf die Anwendung an. Den PDM-Datenstrom selber zu dezimieren, erschafft die Möglichkeit, ganz bestimmte Bereiche des Spektrums früh herauszufiltern und effektiv eine höhere Auflösung zu erzielen, als es möglich ist, wenn man es den Chip machen lässt, der ja auf PCM dezimiert und dabei das ganze Spektrum gleich behandeln muss. Fürs Audio im hörbaren Bereich wird es zumindest dann aber keinen Unterschied machen, wenn das I2S mit 2x32 Bit ausgeben wird, weil man dann genug Auflösung hat und später zu filtern. Oft kommen aber nur 2x24 Bit.
In beiden Fällen ist das auch in sich nicht immer maximal aufgelöst, d.h. die Datenqualität aus "analoger" Sicht nutzt den digitalen Raum nicht voll aus. Kommt auf den Chip und die Qualität an. Wenn die Mikros das selber machen, ist man von deren Einsatzfokus abhängig. Um über klassische Audio-Chips drüber zu kommen, muss man aber sehr gut prozessieren, weil die intern überabtasten, dithern und sehr gut filtern - je nach Typ.
Interessant wird die Angelegenheit spätestens dann, wenn man Ultraschall, oder Infraschall prozessieren möchte. Die Mikros nehmen das ja durchaus auf, aber die Chips sind darauf nicht ausgelegt. D.h. der PDM Datenstrom wird dahingehend beschnitten und ein I2S ist es dann erst recht.
Oft genug ist sogar der PDM-Datenstrom sogar schon beschnitten, d.h. der Modulator ist so ausgelegt, daß sein Spektrum nur das überträgt, was Fokus der Applikation ist. Typische Audio-Mikros und Chips auf Consumer-Audio haben damit viele Spektralanteile ausserhalb des Hörbaren überhaupt gar nicht erst drin. Ultraschallverarbeitung wird z.B. regelmäßig dadurch behindert, daß das hochfrequente Modulatorspektrum dort stark rauscht. Auch nach unten hin sind die Modulatoren begrenzt. Studiomikrofone übertragen schon ab 5Hz bis weit in 50kHz, das wird aber von normalen Chips nicht erfasst. Schon analog im Bereich der Verstärkerelektronik nicht, auch was die Auslegung des Modulators angeht nicht, und bei der Dezimation schon mal gar nicht.
Wenn du das aber ab der analogen Stufe selber machst, also die Kapselinformation elektrisch passend verstärkst und dann wandelst, kann du mit dem FPGA sowohl den Modulator entsprechend aufbauen, als auch die analoge Elektronik so auslegen, dass z.B. die Höhen besonders (oder überhaupt mal erst!) verstärkt werden, wodurch man dann in dem Bereich ein erheblich besseres S/N bekommt. Vor allem hat der Modulator dann auch die erforderliche Amplitudenreserve.
Da muss man sich aber mit Rauschmodulationsverfahren befassen oder darf Entsprechendes auch gerne mal selber erfinden. BTDT.
Als ein Beispiel kann man die Auswertung von Beschleunigungssensoren in z.B. Lautsprechermembranen nennen, die man besonders geschickt anfahren und auswerten muss, um sehr schnelle Regelungen damit bauen zu können. Mit einem FPGA kannst du ja ohne Weiteres auf einem einzigen Pin einen 300MHz Modulator bauen.
Nach dem ich gerade ein wenig damit experimentiert habe: Eine weitere relativ einfache Möglichkeit wäre ein STM32 mit DFSDM Peripherie (Digital filter for sigma delta modulators).
Von ST gibt es das X-CUBE-MEMSMIC1 Software Paket mit diversen Beispielen.
Ein NUCLEO-L476RG Board (STM32 mit DFSDM) und ein SPH0641LU4H-1 funktioniert problemlos mit 192 kHz Abtastrate als USB Audio-In Device, damit deckt man den Ultraschall-Bereich des Mikrofons (um die 80 kHz) ab. Die dazu erforderlichen Anpassungen am ST Beispielcode sind überschaubar.
Das ist ähnlich dem, das ich auch verbaut habe. Geht wie erwähnt mit 4,8MH - hat aber bereits einen Modulator drin, der auf bestimmte Frequenzen fokussiert. Daher gilt das was ich oben beschrieb. Immerhin scheint er sich umzuschalten, wenn man den Ultraschall-Modul nimmt. Das unterstreicht, was ich dazu geschrieben habe. Man muss das anpassen. Inwieweit der das nun tut und wie ist aus dem Datenblatt nicht zu nehmen.
Auch sehe ich noch nicht, wie die gelinkte LIB da arbeitet:
Wenn ich mir das Datenblatt ansehe und die Kurve im Ultraschallmodus, gibt es da FIR-mäßig einiges zu tun, wenn man das nutzen will.
Und: Ultraschall bis 80kHz ist auch nur der untere Teil. Das "Fledermausspektrum" geht eher bis 300kHz. Damit vor allem kann man auch technisch was anfangen. Z.B. Objekte erkennen und vermessen.