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!
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.
>>>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
-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
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.
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
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 ...
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
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 ...
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.