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.
Das geheimnissvolle Codewort dürfte einfach der gewandelte Analogwert sein. 18 Bit breit wobei ein Bit noch für das Vorzeichen drauf geht.
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.
Wo habt ihr denn dieses Paper ausgegraben ??? Kann mich daran erinnern, dass ich das vor über zehn Jahren mal in den Händen hatte.
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. ;)
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 :)
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.
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).
Ihr habt doch ein FPGA zu Hand. Da wäre es doch schade alles auf soft-core Basis zu implementieren. Gruss, Tim
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.
>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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.