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
Sollte eigentlich funktionieren, ISDN hat ja auch nur 64 kbit/s für Audioübertagung.
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.
falls es jemand interessiert, hier ist ein kleines Tutorial: http://www.rpi.edu/~kouttd/03/Rage_against_the_arduino.html
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.