Forum: Digitale Signalverarbeitung / DSP / Machine Learning Sigma-Delta-PCM-Konvertierung in C


von Delete M. (skywalker)


Lesenswert?

Situation:
Wir arbeiten mit einem FPGA (Xilinx Virtex-II-Pro) und wollen darauf 
einen sprachverarbeitenden Algorithmus implementieren. Dazu benutzen wie 
den Xilinx Softcore MicroBlaze. Die Steuerung der Peripherie (AC'97 
Audio Codec) erfolgt mittels VHDL, der sprachverarbeitende Algorithmus 
selbst soll in C umgesetzt werden.

Unser Problem:
Wir bekommen von dem Audio Codec (LM4550 AC'97 von National 
Semiconductor) PCM-Daten einer 18-Bit Sigma-Delta-PCM (binär) und wollen 
diese nun in C mittels einer FFT analysieren. Für die FFTs in C gibts 
diverse Funktionen, soweit uns bekannt ist jedoch nur für Integerwerte.
-> Gibt es in C irgend eine Funktion, welche binäre 18-Bit Codeworte 
einer Sigma-Delta-PCM in (für eine FFT-Funktion handhabbare) 
Integerwerte konvertiert?
-> Nach der Sprachverarbeitung: Gibt es auch eine Funktion, welche das 
Ganze umgekehrt macht (sozusagen eine Sigma-Delta-PCM in C)?
-> Gibt es irgendwo Quellen wo die Sigma-Delta-PCM gut erklärt ist? Wir 
stoßen bislang auf wunderhübsche Beispiele von Sigma-Delta-Wandlern samt 
Schaltplan/Blockschaltplan und allen drum dran, aber wie am Ende 
beispielsweise ein 18-Bit Codewort entsteht und was es bedeutet, das 
haben wir bislang noch nicht finden können.

von Gast (Gast)


Lesenswert?

Das geheimnissvolle Codewort dürfte einfach der gewandelte Analogwert 
sein. 18 Bit breit wobei ein Bit noch für das Vorzeichen drauf geht.

von Marko (Gast)


Lesenswert?

Was genau implementiert ihr denn da ?

von Delete M. (skywalker)


Lesenswert?

Gast wrote:
> Das geheimnissvolle Codewort dürfte einfach der gewandelte Analogwert
> sein. 18 Bit breit wobei ein Bit noch für das Vorzeichen drauf geht.

Wir haben noch ein paar weitere Infos gefunden. Bei der Sigma-Delta-PCM 
entsprechen die Codewörter dem prozentualen Anteil von Vref_max, wobei 
50% 0V entsprechen und 0% -Vref. Weiterhin stellen die Codewörter den 
Wert nicht direkt dar, sondern codieren ihn durch die Anzahl der Nullen 
und Einsen. 50% wären dann beispielsweise 010101...
Das erste Bit könnte noch ein Vorzeichenbit sein, aber uns ist noch 
unklar ob das bei diesem Codec so ist oder nicht.
Wenn das also so funktioniert wie wir uns das jetzt vorstellen, dann 
könnten wir die Umwandlung auch selbst vornehmen. Man müsste es eben mal 
bei Gelegenheit testen.

Vielleicht kennt ja noch Jemand eine C-Funktion, die das auch macht? 
Dann könnten wir uns das vielleicht sparen.

Marko wrote:
> Was genau implementiert ihr denn da ?

Wir implementieren den Sprachanalyse/Sprachsynthese Algorithmus von 
McAulay und Quartieri: 'Speech Analysis/Synthesis Based on a Sinusoidal 
Representation'
Einfach ausgedrückt wird ein Sprachsignal mit Hilfe einer FFT analysiert 
und als Triplets (Amplitude, Phase, Frequenz) gespeichert. Diese 
Triplets werden dann auf Peaks untersucht und nur die größten Peaks 
werden weiterverarbeitet. Die max. Peakanzahl soll bei etwa 40 liegen, 
sodass man (pro Frame) nach der Analyse noch höchstens 40 Triplets hat 
(vor ursprünglich mal 256 Triplets nach einer 512-FFT).
Danach werden die Frames durch Peak-Matching übereinander geschoben, 
damit die Frameübergänge möglichst weich und damit natürlich klingen 
sollen. Anschließend werden mit den übrigen Triplets die Amplituden und 
Phasen für jeden Frame interpoliert und damit Sinuswellen erzeugt, die 
miteinander (frameweise) überlagert und ausgegeben werden. Das Ganze 
soll dann in Echtzeit funktionieren.
Das MatLab-Modell vom Analyse-System ist soweit fertig, die Synthese 
wird hoffentlich noch diese Woche werden. Mein Partner hat sich derzeit 
mit dem MicroBlaze auseinandergesetzt.

von Tim (Gast)


Lesenswert?

Wo habt ihr denn dieses Paper ausgegraben ??? Kann mich daran erinnern, 
dass ich das vor über zehn Jahren mal in den Händen hatte.

von Delete M. (skywalker)


Lesenswert?

Tim wrote:
> Wo habt ihr denn dieses Paper ausgegraben ??? Kann mich daran erinnern,
> dass ich das vor über zehn Jahren mal in den Händen hatte.

Ja, das Paper ist von '86. Ausgegraben haben wir es nicht. Wir sind im 
Auslandssemester in Irland und realisieren diese Umsetzung als 
Bachelorarbeit (also das Thema wurde uns zugewiesen). Auch wenn das 
Paper alt ist, so ist das Verfahren dennoch gut und interessant in der 
Umsetzung. Und diese Hardwareimplementation hat bislang Niemand gemacht. 
Theoretisch könnte man dann am Ende zwei solche FPGA-Boards nehmen und 
den Analyse- und Syntheseteil trennen. Dann braucht man nur noch eine 
Verbindung zwischen beiden Boards zur digitalen Überragung der 
Sprachparameter und schon hat mein ein Sprachübertragungssystem. Ist auf 
jeden Fall eine nette Spielerei. ;)

von Michael (Gast)


Lesenswert?

Na ja, wenn Ihr es mit dem Ausgangssignal eines Delta-Sigma Modulators 
zu tun hättet, müsstet Ihr ein paar Filter mit hoher Geschwindigkeit 
rechnen (Delta-Sigma Demodulator). Dort kommen im Wesentlichen 1/0 
Bit-Folgen heraus bei denen im Schnitt 50% der Zeichen 0 bzw 1 sind.

Aber netterweise übernehmen das üblich Audio Codecs für euch. Das was 
ihr seht ist die sogenannte "PCM" oder Pulse Code Modulation (siehe 
Wikipedia).
Dies ist eine Repräsentation das 18 Bit-Wertes im zweierkomplement 
(siehe Wikipedia). Zweierkomplement ist vereinfacht gesagt eine 
Darstellung von positiven und negativen Zahlen mit Binärwerten ohne dass 
ein Wert doppelt vorkommt.

Meiner Meinung nach müsst Ihr die einlaufenden Audiosamples nur 
"korrekt" konvertieren. Der Microblaze ist ein 32 Bit uC. Das Zauberwort 
bei der Korrekten Umwandlung heißt Signextension.
Wenn Ihr einen 18Bit Integerwert in ein 32Bit Feld einlest, müssen die 
zusätzlichen Bits korrekt gesetzt sein :)

Beispiel:

18 Bit-Darstellung 2er kompl:
"-2" in 18 Bit-Darstellung 2er kompl:    11 1111 1111 1111 1110
"-1" in 18 Bit-Darstellung 2er kompl:    11 1111 1111 1111 1111
"0"  in 18 Bit-Darstellung 2er kompl:    00 0000 0000 0000 0000
"+1" in 18 Bit-Darstellung 2er kompl:    00 0000 0000 0000 0001

Darstellung 32Bit 2er Komplement
"-2":  1111 1111 1111 1111 1111 1111 1111 1110
"-1":  1111 1111 1111 1111 1111 1111 1111 1111
"0" :  0000 0000 0000 0000 0000 0000 0000 0000
"+1":  0000 0000 0000 0000 0000 0000 0000 0001

OHNE korrekte SIGN-EXTENSION:

"-2":  0000 0000 0000 0011 1111 1111 1111 1110  -> +262142
"-1":  0000 0000 0000 0011 1111 1111 1111 1111  -> +262143
"0" :  0000 0000 0000 0000 0000 0000 0000 0000  -> 0
"+1":  0000 0000 0000 0000 0000 0000 0000 0001  -> 1


Vielleicht lag es ja daran :)

von Delete M. (skywalker)


Lesenswert?

Danke für die Erklärung. Meine Kollege muss in den nächsten Tagen 
einfach mal testen welche Variante funktioniert. Auf jeden Fall haben 
wir nun eine Vorstellung davon wie man das machen könnte.

Erstmal danke an alle. Ich meld mich wieder wenn es etwas Neues gibt.

von Tim (Gast)


Lesenswert?

Gibt es was neues von der Front?

von Delete M. (skywalker)


Lesenswert?

Tim wrote:
> Gibt es was neues von der Front?

Aso, mein Kumpel hat die letzten Tage etwas rumgewerkelt und meinte das 
ist im Prinzip so wie Michael das erklärt hatte. Von daher erstmal 
danke.

Ansonsten sind wir mit dem Algorithmus schon weiter gekommen (siehe 
Thread mit der gesampelten Sinusfunktion erzeugen). Ich hab es geschafft 
in MatLab den Algorithmus zum Laufen zu bekommen. Die Qualität ist nicht 
besonders, aber die synthetisierten Stimmen sind verständlich und 
unterscheidbar. Das ist erstmal ausreichend, dass wir das nun in C 
reinmachen können. Momentan versucht mein Kumpel gerade eine 
FFT-Funktion in C zum Laufen zu bekommen (er liest sich gerade in die 
FTTW ein) und ich dokumentiere soweit erstmal das MatLab-Modell und den 
Algorithmus (theoretische Grundlagen).

von Tim (Gast)


Lesenswert?

Ihr habt doch ein FPGA zu Hand. Da wäre es doch schade alles auf 
soft-core Basis zu implementieren.
Gruss, Tim

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Tim wrote:
> Ihr habt doch ein FPGA zu Hand. Da wäre es doch schade alles auf
> soft-core Basis zu implementieren.
> Gruss, Tim

Aber wahrscheinlich zielführender. Als Neuling den Algorithmus von 
McAulay auf einem FPGA zu bringen ist schon sehr ehrgeizig.

von befro (Gast)


Lesenswert?

>Ich hab es geschafft
>in MatLab den Algorithmus zum Laufen zu bekommen. Die Qualität ist nicht
>besonders, aber die synthetisierten Stimmen sind verständlich und
>unterscheidbar.

Könntest Du ein Beispiel MP3 File posten? Mich würde mal interessieren, 
wie sich sowas anhört.

Gruß,
befro

von Delete M. (skywalker)


Lesenswert?

Tim (Gast) schrieb:
> Ihr habt doch ein FPGA zu Hand. Da wäre es doch schade alles auf
> soft-core Basis zu implementieren.
> Gruss, Tim

Der Softcore läuft doch auf dem FPGA. Der FPGA selbst enthält zwei 
PowerPC Prozessoren. Also HardCore. Eine reine Hardwareimplementation 
über VHDL existiert schon. Mit den richtigen Tools würde das vermutlich 
sogar einfacher gehen (MatLab mit System Generator for DSP in Verbindung 
mit Xilinx XPS). Unser Betreuer möchte aber nicht, dass wir diesen Weg 
gehen. Sein Ansatz ist, dass die Zukunft in den SoftCores liegt. Daher 
nehmen wir den. Durch den Prozessor (egal ob Hard oder Soft) kann man 
die DSP-Algorithmen über C auf den FPGA bekommen. Von daher spielt es 
keine Rolle ob es ein Softcore oder ein Hardcore ist (mal von 
Unterschieden in der Spezifikation abgesehen), das Ergebnis ist das 
selbe.
Wir machen es nun so, dass wir den Audio Codec über VHDL steuern und 
Sprachverarbeitung über den Prozessor in C machen. Momentan versuchen 
wir gerade das MatLab-Modell in C zu überführen.

> Könntest Du ein Beispiel MP3 File posten? Mich würde mal interessieren,
> wie sich sowas anhört.
>
> Gruß,
> befro
Habe ich schon gemacht im Thread "Gesampelte Sinus-Funktion in MatLab".

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.