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