Forum: Digitale Signalverarbeitung / DSP / Machine Learning PDM einfach demodulieren


von -gb- (Gast)


Lesenswert?

Hallo, ich habe auf einem Nexys4 FPGA-Board ein Microphon das die Daten 
als PDM ausgibt. Im Datenblatt steht:

PDM data connections are becoming more and more popular in portable 
audio applications, such as cellphones and tablets. With PDM, two 
channels can be transmitted with only two wires. The frequency of a PDM 
signal usually falls in the range of 1MHz to 3MHz. In a PDM bit stream, 
a 1 corresponds a positive pulse and a 0 corresponds a negative pulse. A 
run consisting of all ‘1’s would corresponds to the maximum positive 
value and a run of ‘0’s would corresponds to the minimum amplitude 
value.

Also in kurz:
Lauter '1' entsprechen der maximalen Amplitude, lauter '0' der minimalen 
Amplitude.

Hier http://www.cs.tut.fi/sgn/arg/rosti/1-bit/ sieht es aber in den 
ersten beiden Graphen anders aus, da sind lauter '1' die maximale 
Steigung und lauter '0' die minimale Steigung (größtes Gefälle).

Was stimmt denn nun?

Ich will das also dekodieren so dass ich am Ende alle paar Takte einen 
Wert für die Amplitude rausfällt.
Jetzt bilde ich einen gleitenden Mittwlwert über 256 Samples, summiere 
also alle '1' auf und das gebe ich dann aus aber es klingt ... 
bescheiden.
Gibt es da andere einfache Lösungen ohne digitale Filter zu verwenden?

Danke!

von Gustl B. (-gb-)


Lesenswert?

Hab es gelöst, in der Tat funktioniert es mit dem gleitenden Mittelwert, 
ich hatte es nur falsch umgesetzt, zuerst hatte ich:

Der Mittelwert wird über 255 Samples gebildet und dann beim 255ten 
Sample übergeben an eine andere Komponente die den Wert dann als PWM 
ausgibt (Audio).

Das rauschte irre. Jetzt gebe ich den Mittelwert viel öfter an die PWM 
Komponente. Dazu ist diese natürlich auch sehr viel höher getaktet, 
genauer mit 200 MHz und die PDM Komponente mit 200/64 = 3,125 MHz.

Jetzt klingt es einigermaßen brauchbar, klar noch nicht ganz so gut wie 
wenn ich das PDM-Signal direkt an den Audioausgang verbinden würde, aber 
ich finde eine sehr einfache und brauchbare PDM nach PWM Wandlung.
Die Beschreibung aus dem Datenblatt war auch korrekt, es ist also die 
Amplitude und nicht die Steigung.

von Detlef _a (Gast)


Lesenswert?

In diesem thread gings' auch um PDM, dort habe ich mal mit besseren 
Filtern als Mittelwertfiltern probiert

Beitrag "FIR Filter Optimierung eines PDM Signals auf STM32F407 simuliert mit Matlab"

Cheers
Detlef

von Gustl B. (-gb-)


Lesenswert?

Ui, ja klingt interessant aber ... ich kenne mich nicht mit 
Signalverarbeitung aus. Irgendwann mit viel Zeit lerne ich das mal.

von Detlef _. (detlef_a)


Lesenswert?

>>>Gibt es da andere einfache Lösungen ohne digitale Filter zu verwenden?

Ohne Zeit um Lernen von Signalverarbeitung kann man auch einfach nen 
Tiefpass ranhängen (R und C), das klappt bei PDM auch, krächzt halt 
bißchen oder ist dumpf.

Cheers
Detlef

: Bearbeitet durch User
von -gb- (Gast)


Lesenswert?

Ja könnte man aber ich wollte ja Amplitundenwerte die ich dann 
weiterverarbeiten kann. Hat auch ganz brauchbar geklappt.

von Burkhard K. (buks)


Lesenswert?

-gb- schrieb:
> Ja könnte man aber ich wollte ja Amplitundenwerte die ich dann
> weiterverarbeiten kann. Hat auch ganz brauchbar geklappt.

Ein Blick in das Mikrophon-Datenblatt ADPM421 offenbart, dass das 
ADC-Signal im Mikrophon eine aufwendige Filterung durchlaufen hat 
(Fourth-order Σ-Δ modulator, Angaben zur Samplefrequenz und zur 
Filterlänge fehlen leider). Offensichtlich ist dieses Mikrophon zur 
direkten Ausgabe des PWM-Signals via LP (wie beim Nexys4) oder zum 
Anschluss an einen geeigneten SigmaDSP-Codec gedacht (s.a. 
http://www.analog.com/media/en/technical-documentation/application-notes/AN-1323.pdf).

So wie ich das verstehe, verlierst Du beim "Auslesen" der 
Amplitudenwerte in Speicherworte die durch den Σ-Δ Modulator gewonnene 
effektive Auflösung. Also statt >= 16bit effektiv im PDM-Signal kommst 
Du vielleicht auf 7- oder maxiaml 8-bit (auch in AoE 13.9.4 
nachzulesen).

Gruß,
Burkhard

von Gustl B. (-gb-)


Lesenswert?

Ja, richtig aber gibt es eine einfache Methode sonst aus dem PDM-Signal 
schön weiterverarbeitbare Werte zu bekommen? Wenn ich das PDM dirket auf 
den Audioausgang gebe klingt es super aber ich wollte es eben als Übung 
mal nach PWM wandeln.

von derguteweka (Gast)


Lesenswert?

Moin,

So wie ich das seh', kommt also aus dem Mikro ein Signal mit 1bit Breite 
und 2.4MHz Takt. Das ganze muss durch einen digitalen Tiefpass, der eine 
Grenzfrequenz so um die 15KHz hat.
Wenn dem so ist, mit was fuer einer Samplefrequenz sollen denn die 
"breiten" Samples aus dem Tiefpass rauskommen und wieviele Bit sollen 
die breit sein?

Gibts in der Entwicklungsumgebung nicht irgend einen Core-Generator, mit 
dem man solche Filter designen kann, ohne sich drum zu kuemmern, wie die 
genau funktionieren?

Gruss
WK

von Gustl B. (-gb-)


Lesenswert?

Den Coregenerator gibt es, wollte ich aber vermeiden weil ich sehr 
ungerne Black-Boxes in meinem Design habe. Ausserdem haben diese 
generierten Dinger so komische Interfaces die ich dann erst irgendwie 
bespaßen müsste ...

von Burkhard K. (buks)


Lesenswert?

Gustl B. schrieb:
> Den Coregenerator gibt es, wollte ich aber vermeiden weil ich sehr
> ungerne Black-Boxes in meinem Design habe. Ausserdem haben diese
> generierten Dinger so komische Interfaces die ich dann erst irgendwie
> bespaßen müsste ...

Ich denke es hängt vom weiteren Verarbeitunsweg ab, ob ein einfaches 
Moving-Average Filter reicht oder ob Du einen entsprechenden 
Butterworth-LowPass brauchst. Wenn Du ein FIR-Filter selbst, also ohne 
CoreGenerator, bauen willst, lohnt evtl. ein Blick nach opencores.org.

BTW: Das Mikrophon kann Datenraten von 1 bis 3.3 MHz; im Digilent 
Beispiel-Design zum Nexys4-Board läuft es mit 2 MHz. Die Samplefrequenz 
für das Filter sollte der des Mikros entsprechen, die Bittiefe den 
Anforderungen Deines Designs.

Leicht OT, ich besitze das Nexys4 seit ein paar Tagen ebenfalls und habe 
das umgekehrte Problem zu lösen, nämlich Daten, die mit 12bit Tiefe aus 
einem ADC kommen über das eingebaute Analog-Filter auszugeben (wenn ich 
keinen externen Audio-Codec verwenden will).

Gruß,
Burkhard

von Gustl B. (-gb-)


Lesenswert?

Du willst die Daten über die Mono-Klinkenbuchse ausgeben? Das geht doch 
sehr gut mit PWM?

Hab leider gerade keine Zeit für irgendwas mit Signalverarbeitung. Ich 
wollte nur mal das Mikrophon in Betrieb nehmen und das passt ja so 
einigermaßen ...

von Michael W. (Gast)


Lesenswert?

Er will ja den Eingang des Mikros verarbeiten und nicht was ausgeben, 
oder?

Eigentlich sind diese MEMS-Mikros nichts anderes, als Mikros+Delta-Sigma 
und müssten sich auch entsprechend filtern lassen. Man muss entspreched 
viele Samples aufintegrieren und dividieren.

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.