mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sound über UART


Autor: Hitzkopf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf Schwarz (spacedog) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian ... (zahlenfreak)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hitzkopf (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DAC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elektroniker (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hitzkopf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erinnert mich an die alten Commodere64 Zeiten :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hitzkopf (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.