Forum: Mikrocontroller und Digitale Elektronik Sound über UART


von Hitzkopf (Gast)


Lesenswert?

Hi

Ich suche nach einer Möglichkeit, Sound in einigermaßen verständlichen 
Qualität über UART auf den Atmega zu übetragen und ausgeben zu lassen. 
Es sollten außerdem nicht gleich die ganzen Resourcen des AVR 
aufgebraucht werden. Kann man das mit PWM hinkriegen oder wäre ein 
externer wav-decoder sinnvoller?

Hitzkopf

von Ralf S. (spacedog) Benutzerseite


Lesenswert?

Hitzkopf schrieb:
> ... einigermaßen verständlichen Qualität ...

Was heisst das für dich? Ein gängiges Format für WAV-Audio ist 16 
Bit-Samples bei einer Abtastfrequenz von 44.1 kHz. Das ist etwa 
CD-Qualität. Damit kommt man jedoch auf eine Datenrate von 705.6 kBit/s. 
So gesehen fällt UART dafür eher weg. Wenn du dich allerdings auch mit 8 
Bit Sound bei 8 kHz begnügen kannst, kann man das durchaus mit 
Interrupts und PWM auf ressourcensparende Art hinkriegen.

von Sebastian .. (zahlenfreak)


Lesenswert?

Was heißt "einigermaßen verständliche Qualität"? Und was heißt "nicht 
alle resourcen aufbrauchen"?  Wie kommen die Daten an? Kannst du dir das 
aussuchen? Was für eine Samplingrate und Auflösung willst du? Wenn du 
letzteres nicht beantworten kannst: Solls für Sprache oder Musik sein?

Prinzipiell: Man kann über die PWM geräusche erzeugen. So weit ich weiß 
(hab jetzt nix nachgeschlage) reicht das auch für Sprachqualität. 
CD-Qualität wirst du aber wohl nicht erreichen. Die Daten über UART zu 
bekommen sollte erstmal kein großes problem sein.

Sebastian

von Hitzkopf (Gast)


Lesenswert?

8bit reichen aus, ich möchte hauptsächlich sprache in mono übertragen...

von holger (Gast)


Lesenswert?

>8bit reichen aus, ich möchte hauptsächlich sprache in mono übertragen...

Und wieso über UART übertragen? Popel die Sounds auf ein Dataflash
oder eine SD Karte und spiel sie von da ab.

von DAC (Gast)


Lesenswert?

Ob dir die Qualität reicht kannst du ganz einfach mit einer 
Endlosschleife oder besser mit einer Interruptroutine testen indem du 
einen ADC Pin mit Eingangssignal (hochohmiger Spannungsteiler mit 
Koppelkondensator) einliest und per hochfrequenter PWM und Tiefpass 
wieder ausgibst.
8kHz entspricht in etwa Telefonqualität. Passt also für Sprach ganz gut.

Um die Übertragung dann per UART laufen zu lassen eine hohe Baudrate 
wählen, per Interrupt auf einen vollen Eingangspuffer warten und das 
Byte an den PWM schicken. Der AVR spielt also im Grunde nur UART-DAC.
Der Sender muss dann nur noch regelmäßig ein Byte liefern und dann evt. 
etwas Pause einlegen. Müsstest du mal durchrechnen. 115200 baud sollten 
für 8 kHz bei 8 bit ausreichen. Wahrscheinlich lässt sich die Bandbreite 
auch noch etwas höher wählen.

Grüße

von Elektroniker (Gast)


Lesenswert?

Sollte eigentlich funktionieren, ISDN hat ja auch nur 64 kbit/s für 
Audioübertagung.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

ISDN benutzt Komprimieralgorithmen nach dem ALaw-Verfahren. Dadurch 
werden kleinere Signale nichtlinear abgesenkt, um das 
Quantisierungsrauschen zu minimieren. Bei 8Bit/8kHz ohne Komprimierung 
hört sich das Ganze noch recht gruselig an, was weniger an der 
Samplerate, als an der niedrigen Bitzahl liegt.

von Hitzkopf (Gast)


Lesenswert?

erinnert mich an die alten Commodere64 Zeiten :)

von Karl H. (kbuchegg)


Lesenswert?

Hat eigentlich irgendwer einmal Delta-Modulation (bin mir nicht sicher 
ob der Name stimmt) ausprobiert?

Ausgehend von einem Byte, bestimmt das nächste Bit (! nicht Byte) was zu 
geschehen hat.
1 .. Kurve geht 1 Einheit nach oben
0 .. Kurve geht 1 Einheit nach unten

Dh. mit 2 Byte kann man 9 Samples codieren (Bei 8 Bit pro Sample). Mit 3 
Bytes könnte man schon 17 Samples codieren.
In welchen Abständen man wieder ein Vollbyte einstreut wird sicherlich 
kritisch sein. Ausserdem wird die Kurvenform klarerweise nicht exakt 
codierbar sein - und genau deshalb frage ich, ob das schon jemand 
ausprobiert hat und wie gut es wirklich funktioniert.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Also ich kenne die Deltamodulation so, daß das folgende Byte die 
Abweichung zum vorhergehenden codiert. Ab und an werden die genauen 
Samples eingestreut. Die Bitkodierung wäre mir neu und bandbreitenmäßig 
sicher überfordert, da die Abweichung von einem Sample zum nächsten 
mehrere Quantisierungsstufen umfassen kann, die sich mit Bits nicht mehr 
abbilden lassen.

von Karl H. (kbuchegg)


Lesenswert?

Travel Rec. schrieb:
> Also ich kenne die Deltamodulation so, daß das folgende Byte die
> Abweichung zum vorhergehenden codiert. Ab und an werden die genauen
> Samples eingestreut. Die Bitkodierung wäre mir neu und bandbreitenmäßig
> sicher überfordert, da die Abweichung von einem Sample zum nächsten
> mehrere Quantisierungsstufen umfassen kann, die sich mit Bits nicht mehr
> abbilden lassen.

Das waren wirklich einzelne Bits (oder wurden immer 2 zusammengefasst).
Die Idee stammt aus der c't, aus einer Zeit als es am PC nur den 
nervtötenden Quäker gab und Leisure Larry noch ohne obligate 
Unterstützung durch Soundkarten seine Abenteuer bestehen musste.

von Benedikt K. (benedikt)


Lesenswert?

Karl heinz Buchegger schrieb:
> Hat eigentlich irgendwer einmal Delta-Modulation (bin mir nicht sicher
> ob der Name stimmt) ausprobiert?

Ja, sowohl als Delta-Sigma Wandler 1. Ordnung (da allerdings mit 20MHz 
Bitrate auf einem FPGA), als auch in der modifizierten ADPCM Version (zu 
der es auch eine AppNote von Atmel gibt).
Auf dem FPGA diente das als reiner DAC, also 16bit Daten rein, 1bit 
raus. Durch die hohe Bitrate reicht ein einfacher RC Tiefpass. Die 
Qualität ist aufgrund der hohen Bitrate sehr gut.

> Dh. mit 2 Byte kann man 9 Samples codieren (Bei 8 Bit pro Sample). Mit 3
> Bytes könnte man schon 17 Samples codieren.

Wobei aber die Anstiegsgeschwindigkeit auf 8 Schritte pro Byte begrenzt 
ist. Für einen Hub von 128 Schritten benötigt man daher 128Bits=16Bytes. 
Man müsste also die Samplerate 16-32x höher machen um die gleiche 
Bandbreite wie bei einem reinen PCM Signal zu erreichen. In der Praxis 
kommt man mit etwas weniger aus, denn üblicherweise haben hochfrequente 
Anteile eine niedrigere Amplitude.
Für eine echte Anwendung wenn man damit die Datenrate reduzieren möchte, 
sollte es aber dennoch zumindest die ADPCM Variante sein, die die 
Schrittweite dynamisch anpasst. Deren Qualität ist meiner Erfahrung nach 
aber sehr von dem Filter hinter dem DAC abhängen: Bei einem PCM Signal 
kann man zur Not auf das Filter verzichten ohne dass man sehr an 
Qualität verliert, bei ADPCM hört sich das Signal ohne Antialiasing 
Filter aber sehr bescheiden an.

von Hitzkopf (Gast)


Lesenswert?

falls es jemand interessiert, hier ist ein kleines Tutorial:
http://www.rpi.edu/~kouttd/03/Rage_against_the_arduino.html

von Rolf Magnus (Gast)


Lesenswert?

> Das waren wirklich einzelne Bits (oder wurden immer 2
> zusammengefasst).
> Die Idee stammt aus der c't, aus einer Zeit als es am PC nur den
> nervtötenden Quäker gab und Leisure Larry noch ohne obligate
> Unterstützung durch Soundkarten seine Abenteuer bestehen
> musste.

Auf den alten SoundBlaster-Karten gab's in der Hardware sogenannte 
4-Bit-, 2,6-Bit- und 2-Bit-Kompression, wo in ein Byte dann 2, 3, oder 4 
Deltas gesteckt wurden. Ich kann mich dabei nur noch an einen 
furchtbaren Klang erinnern, und das aus einer Zeit, als ich klanglich 
noch selbstgebastelte R2R-DACs mit aus einem uralten Videorekorder 
ausgeschlachteten Widerständen am Parallelport ohne Filterung gewöhnt 
war.

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.