Forum: Mikrocontroller und Digitale Elektronik Audio mit Arduino abspielen: äußerst schlechte Qualität


von Max (Gast)


Lesenswert?

Hi!

Für ein kleines Projekt brauche ich eine Audioausgabe. Generell kann man 
einen µC nehmen oder mit z.B. dem Raspberry arbeiten. Nachteil hiervon 
ist die Tatsache, das die erst booten müssen und das passt nicht in mein 
Projekt. Daher bin ich mal zum Arduino übergegangen und von diesem Video 
[1] überzeugt worden, die TMRpcm Bibliothek zu verwenden ([2]). Die 
Qualität ist recht gut und genau das was ich suche. Also habe ich mal 
eine Demo aufgebaut, denkbar einfach: SD-Karte an den Arduino, 
Demo-Sketch drauf und an Pin 9 ist der PWM Output, der nach Plan [3] an 
die Kopfhörer (in meinem Fall ersetzen die den Lautsprecher, der noch 
nicht bestellt ist) angeschlossen ist (R1 = 100 Ohm).

Das Ergebnis ist aber (gar)nicht gut: man kann zwar deutlich im 
Hintergrund den eigentlichen Sound hören aber es gibt so ein komisches 
Klirren. Hier: 
https://www.dropbox.com/s/gbr8xua5r8okme3/beispiele.zip?dl=0 habe ich 
mal folgende Dateien in einem ZIP-Archiv hochgeladen:

* sample2.wav: Demo-Sound, 32 kHz, 8-bit unsigned PCM, Mono 
(einwandfreie Qualität) - den bekommt der Arduino
* sample2_ausgabe.wav: Ausgegebener Sound, aufgenommen (daher etwas 
blechern im Klang, das komische Klirren ist aber gut zu hören).

Habe Ihr da eine Idee, was ich machen kann?

Mich verwirrt nur, dass bei den Meisten das einfach so klappt (z.B. im 
Video) und bei mir komisch verklirrt ist.

Viele Grüße!

[1] https://www.youtube.com/watch?v=LbqPgJe3Qd4
[2] https://github.com/TMRh20/TMRpcm/wiki
[3] https://bryanduxbury.files.wordpress.com/2012/01/amplified2.png

von Mandi (Gast)


Lesenswert?

Schau dir mal diese Module von ELV an:

Mini-Wave-Player - bis 15 Audiofiles einzeln anwählbar (über I2C)
http://www.elv.de/mini-wave-player-mwp1-bausatz.html

Soundmodul - bis 65536 Audiofiles einzeln anwählbar (über I2C oder Uart)
http://www.elv.de/mp3-soundmodul-msm3-komplettbausatz.html

MfG. Mandi

von Dieter S. (Gast)


Lesenswert?

Nimm einen MP3-Player, damit funktioniert das super.
DFPlayer-Mini-MP3-Player

von Dieter S. (Gast)


Lesenswert?


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Lass dir nicht gleich zwanzig verschiedene Ausweich-Varianten einreden. 
Ich finde es eine ziemlich blöde Angewohnheit mancher Forumsteinehmer, 
obwohl man einen bestimmten Rahmen vorgibt, einem sofort etwas völlig 
anderes einreden zu wollen. Probleme sind dazu da, dass man sie löst!

Ich hoffe jetzt mal, du programmierst mit einem gewissen Bewusstsein und 
lädst nicht einfach nur fremde Sketche, ohne zu wissen, das diese 
eigentlich tun ...

Also - zum Arduino: Stelle sicher, dass die Frequenz der PWM-Ausgabe 
hochgestellt ist, mindestens 30kHz oder mehr. Wie das geht, steht z.B. 
hier: http://playground.arduino.cc/Code/PwmFrequency

Da dies Hardware-basiert geschieht, belastet das den Arduino quasi 
überhaupt nicht. Nun musst du nur noch die Bytes im richtigen Tempo 
(Samplingrate! max. halb so hoch wie PWM-Frequenz, z.B. 22kHz) 
nacheinander 'rausschieben.

Am Besten, du erstellst dir mit einer geeigneten Software (z.B. 
Audacity) passende unkomprimierte (!) Mono (!) -Wave-Dateien mit 8 Bit 
Auflösung und passender Samplingrate.

Ich habe sie seinerzeit nicht vom Datenträger gelesen, sondern per UDP 
zum Arduio gestreamt und der Sound war glasklar. Wenn du Stereo 
brauchst, versetzt du einfach zwei Pins in den PWM-Mode und schiebst je 
ein Byte nach Links und eines nach Rechts ...

: Bearbeitet durch User
von Max (Gast)


Lesenswert?

Frank E. schrieb:
> Lass dir nicht gleich zwanzig verschiedene Ausweich-Varianten einreden.
> Ich finde es eine ziemlich blöde Angewohnheit mancher Forumsteinehmer,
> obwohl man einen bestimmten Rahmen vorgibt, einem sofort etwas völlig
> anderes einreden zu wollen. Probleme sind dazu da, dass man sie löst!

ACK - da stimme ich voll zu!

> Ich hoffe jetzt mal, du programmierst mit einem gewissen Bewusstsein und
> lädst nicht einfach nur fremde Sketche, ohne zu wissen, das diese
> eigentlich tun ...

Was ich gemacht habe, ist erstmal zu verstehen wie das in etwa geht. 
Dazu kann man sich z.B. diesen Artikel [1] anschauen. Im Grunde mache 
ich einen (für Mono) PWM Kanal auf und schreibe 1/32kHz mal pro Sekunde 
den unsigned 8-bit Wert auf dem PWM Kanal - wenn meine Abtastrate 32kHz 
ist. Leider bekomme ich [1] nicht zum laufen auf einem ATMega328p und da 
habe ich für den Arduino eine fertige Lib gesucht, nur um zu sehen, ob 
das überhaupt geht mit dem Sound.

> Also - zum Arduino: Stelle sicher, dass die Frequenz der PWM-Ausgabe
> hochgestellt ist, mindestens 30kHz oder mehr. Wie das geht, steht z.B.
> hier: http://playground.arduino.cc/Code/PwmFrequency

Aber sollte das nicht diese TMRpcm Bibliothek schon machen? Es ging mir 
ja darum, dass im Showcase YT Video (siehe Link oben) die Soundausgabe 
quasi störfrei ist und bei mir verrauscht - aber ich habe das genau das 
Setup wie angegeben.

> Ich habe sie seinerzeit nicht vom Datenträger gelesen, sondern per UDP
> zum Arduino gestreamt und der Sound war glasklar.

Und wie sah die Hardwareschaltung aus? Lautsprecher direkt an den Pin?

Viele Grüße!

[1] 
http://avrpcm.blogspot.de/2010/11/playing-8-bit-pcm-using-any-avr.html

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Max schrieb:
> Leider bekomme ich [1] nicht zum laufen auf einem ATMega328p

[1] habe ich mir nicht angesehen, da ich nicht jeden Link verfolge, 
zumal man auch hier Anhänge hochladen kann.

Zum ATMega328P kann ich nur sagen, dass er ohne Probleme Sound ausgeben 
kann. Bei mir werkeln Arduino-Mini-Pro-Klons (aus China) in 
verschiedenen Sound-Spielereien. Dazu wird ein 8-Bit-Timer auf 
Hardware-PWM mit Vorteiler 1:1 gestellt und das Soundbyte in 
regelmäßigen Abständen in das Compare-Register des Timers geschrieben. 
Die PWM-Frequenz beträgt bei 16MHz-Quarz 62,5 kHz, die Ausgaberate 
(Samplerate, Frequenz des Beschreiben des Compare-Registers) liegt 
zwischen 8 kHz und 16 kHz. Ich nutze allerdings keine Arduino-Sketches, 
auch kein C, sondern mache das direkt in Assembler. Hier ein Beispiel 
mit einem (Arduino-Klon-) Mini-Pro-Modul, das neben der Sounderzeugung 
noch 5 Kanäle eines RC-Empfängers ausliest und 4 DC-Motore per 
Software-PWM ansteuert. Das Modell ist inzwischen auch karosseriemäßig 
(blaue Bude) fertig:

https://www.youtube.com/watch?v=CJMwHpboJTs

Der gelbe Kran ist übrigens auch mit dieser Steuerung ausgestattet, hat 
allerdings andere Sounds.

...

: Bearbeitet durch User
von Sascha (Gast)


Lesenswert?

PWM Frequenz deutlich höher wählen als grade so über hörbar! Class-D 
findet üblicherweise bei 100-150kHz statt damit das Ausgangsfilter nicht 
zu schmalbandig ausfallen muss.

Wegen dem Klirr kann man mal systematische Fehlersuche betreiben.

Bau mal nen RC Tiefpass mit fg=20kHz und das gibst du auf den ADC. Den 
lässt du mit ADLAR und 1MHz Takt laufen.

Was aus dem ADC kommt, schiebst du in der ADC-Fertig ISR aufs OCR1A/B.

Wenn du da jetzt Musik ausm MP3-Player dran anschließt, sollte das in 
erträglicher bis guter Qualität aus dem angeschlossenen Lautsprecher 
kommen.

Wenn ja: Irgendwas an der PCM Software ist faul.
Wenn nicht: Der ganze Rest, die Schaltung selbst zum Beispiel.

Ein Oszi ist bei sowas Gold wert.

von Hannes L. (hannes)


Lesenswert?

Sascha schrieb:
> PWM Frequenz deutlich höher wählen als grade so über hörbar!

Falls Du mich meinst, mehr als 62,5 kHz gibt der AVR bei 16 MHz Quarz 
aber nicht her.

> Class-D
> findet üblicherweise bei 100-150kHz statt damit das Ausgangsfilter nicht
> zu schmalbandig ausfallen muss.

Danke für diese Info. Ich habe die AVR-PWM mit 1k/100nF (nicht 
berechnet, nur probiert und für akzeptabel befunden) ausgefiltert und 
über ein Poti 10k auf den Eingang eines Class-D-Moduls mit PAM8403 
geführt, von dem nur 1 Kanal benutzt wird.

...

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Max schrieb:
>> Ich habe sie seinerzeit nicht vom Datenträger gelesen, sondern per UDP
>> zum Arduino gestreamt und der Sound war glasklar.
>
> Und wie sah die Hardwareschaltung aus? Lautsprecher direkt an den Pin?

Nicht ganz, aber fast. Ich habe nach einem RC-Glied 1k/10nF einen LM386 
nachgschaltet.

Per UDP habe ich immer 1024 Bytes gesendet und den richtigen Rhytmus zum 
Senden des jeweils nächsten Datagrammes in einer Mac-Anwendung einfach 
ausprobiert ...

: Bearbeitet durch User
von Brain 2.0 (Gast)


Lesenswert?

Frank E. schrieb:
> Lass dir nicht gleich zwanzig verschiedene Ausweich-Varianten
> einreden. Ich finde es eine ziemlich blöde Angewohnheit mancher
> Forumsteinehmer, obwohl man einen bestimmten Rahmen vorgibt, einem
> sofort etwas völlig anderes einreden zu wollen. Probleme sind dazu da,
> dass man sie löst!

Hast du ein Problem damit, wenn andere User hier Vorschläge machen.
Damit wir dir keiner was einreden, auch kein schlechtes Gewissen.

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.