Forum: Mikrocontroller und Digitale Elektronik Audiodatei bekommt starkes rauschen!


von Markus M. (atmelfreak100)


Lesenswert?

Guten Tag zusammen,

ich möchte mit einem Xmega ein Lied abspielen welches auf einem Flash 
mit 8mb sitzt. Die Hardware ist super, es ist kein Rauschen, weder im 
Hintergrund noch beim abspielen zu hören. 16khz Abtastrate.

Problem ist aber: Die Ausgabe soll per 8 bit unsigned erfolgen, direkt 
über den integrierten 12 bit dac. Die 8 bit Daten schiebe ich um 4 nach 
oben.

Jetzt ist das Problem:
mp3 Datei super Qualität (klar, ist das Original).

Konvertierung zu 16 bit PCM, super Qualität (ich kann es aber nicht 
abspielen, ich vermute das ist signed 16 bit, es ist nur Krach).

Konvertierung zu unsigned 8 bit PCM - ich kann es abspielen. Allerdings 
habe ich ein ziemliches Rauschen im Hintergrund. Ich dachte der Fehler 
liegt erst an der Hardware wenn ich die Datei aber am PC abspiele mit 
höherer Lautstärke, hört man genau das Rauschen hier.

Jetzt meine Frage: Wie bekomme ich die Datei konvertiert, OHNE dieses 
Rauschen? Ich verstehe auch nicht woher das kommt, wenn ich eine 16 bit 
PCM habe, habe ich das nicht, bei 8 bit habe ich das auf einmal? Müssen 
doch nur jedes 2 Byte genommen werden.

von S. L. (sldt)


Lesenswert?

> ... Xmega ... direkt über den integrierten 12 bit dac

Weshalb werden dann nicht die vollen 12 bit genutzt? Die Anpassung der
> 16 bit PCM
-Werte sollte recht einfach sein.
  Bei 8 bit ist nun mal das Quantisierungsrauschen ziemlich störend.

von Rainer W. (rawi)


Lesenswert?

Markus M. schrieb:
> Ich verstehe auch nicht woher das kommt, wenn ich eine 16 bit
> PCM habe, habe ich das nicht, bei 8 bit habe ich das auf einmal?

Das, was du beim Runden von 16 auf 8 Bit an Information verlierst, IST 
dein Rauschen. Du erhöhst dabei das Quantisierungsrauschen um einen 
Faktor 256.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Markus M. schrieb:
> Konvertierung zu 16 bit PCM, super Qualität (ich kann es aber nicht
> abspielen, ich vermute das ist signed 16 bit, es ist nur Krach).

Bei 16 Bit ist signed üblich, bei 8 Bit eher unsigned mit entsprechendem 
Offset.

> Jetzt meine Frage: Wie bekomme ich die Datei konvertiert, OHNE dieses
> Rauschen?

Auf 8 Bit linear? Gar nicht. Rate mal, warum man normalerweise lieber 16 
Bit nutzt, falls möglich.

> Ich verstehe auch nicht woher das kommt, wenn ich eine 16 bit
> PCM habe, habe ich das nicht, bei 8 bit habe ich das auf einmal?

Dachtest du, es gibt keinen Verlust, wenn du auf 8 Bit reduzierst?

von Markus M. (atmelfreak100)


Lesenswert?

Rolf M. schrieb:
> Markus M. schrieb:
>> Konvertierung zu 16 bit PCM, super Qualität (ich kann es aber nicht
>> abspielen, ich vermute das ist signed 16 bit, es ist nur Krach).
>
> Bei 16 Bit ist signed üblich, bei 8 Bit eher unsigned mit entsprechendem
> Offset.
>
>> Jetzt meine Frage: Wie bekomme ich die Datei konvertiert, OHNE dieses
>> Rauschen?
>
> Auf 8 Bit linear? Gar nicht. Rate mal, warum man normalerweise lieber 16
> Bit nutzt, falls möglich.
>
>> Ich verstehe auch nicht woher das kommt, wenn ich eine 16 bit
>> PCM habe, habe ich das nicht, bei 8 bit habe ich das auf einmal?
>
> Dachtest du, es gibt keinen Verlust, wenn du auf 8 Bit reduzierst?

Ja, dachte ich, weil es einfach jedes 2. Byte wäre.

Jetzt aber die spannende Frage:

Wie bekomme ich die 16 bit entweder unsigned oder alternativ, wie gebe 
ich die signed wieder über einen 12 bit DAC. Ich habe nur positive 
Werte, ich kann keine negativen verarbeiten.

12 oder 16 ist egal, dann fallen halt die unteren 4 bit weg, das ist ok.
Nur das signed macht mir Probleme.

: Bearbeitet durch User
von Norbert (der_norbert)


Lesenswert?

Markus M. schrieb:
> Wie bekomme ich die 16 bit entweder unsigned oder alternativ, wie gebe
> ich die signed wieder über einen 12 bit DAC. Ich habe nur positive
> Werte, ich kann keine negativen verarbeiten.

Wenn du die Werte von 0…200 hast und daraus sollen -100…+100 werden…
oder
Wenn du die Werte von -100…+100 hast und daraus sollen 0…200 werden…

Also da gibt Rechenanweisungen welche im Additions- bzw. 
Subtraktionsmilieu angesiedelt sind. ;-)

von Gustl B. (gustl_b)


Lesenswert?

Den Wertebereich anpassen. Und zwar nicht nur dehnen/stauchen sondern 
auch verschieben indem ein Offset addiert wird.

Signed 16 Bit gehen von -2^15 bis +2^15-1.
Dein 12 Bit DAC geht von 0 bis +2^12-1.

Du musst also die 16 Bit Werte durch 2^4 teilen, den Wertebereich als um 
Faktor 16 stauchen. Dann sind das Werte von -2^11 bis +2^11-1. Und dann 
musst du noch den Wertebereich verschieben um 2^11. Damit die Mitte vom 
Wertebereich nichtmehr bei 0 sondern in der Mitte deines DACs liegt.

DAC_Wert = PCM_Wert/16 + 2048

von Markus M. (atmelfreak100)


Lesenswert?

Norbert schrieb:
> Markus M. schrieb:
>> Wie bekomme ich die 16 bit entweder unsigned oder alternativ, wie gebe
>> ich die signed wieder über einen 12 bit DAC. Ich habe nur positive
>> Werte, ich kann keine negativen verarbeiten.
>
> Wenn du die Werte von 0…200 hast und daraus sollen -100…+100 werden…
> oder
> Wenn du die Werte von -100…+100 hast und daraus sollen 0…200 werden…
>
> Also da gibt Rechenanweisungen welche im Additions- bzw.
> Subtraktionsmilieu angesiedelt sind. ;-)

Korrekt. Allerdings habe ich noch ein Brett vor dem Kopf dort etwas.
Ich weiß ja nicht in welchem Bereich die Werte sind. Ich convertiere die 
Daten in 16 bit PCM signed, dann schiebe ich den data Chunk einfach auf 
den flash.
theoretisch können die Werte dann -32768 bis 32767 sein. Addiere ich 
dann einfach max. negativen Wert drauf, also 32768 + PCM Wert?

von Norbert (der_norbert)


Lesenswert?

Gustl hat's schon richtig beschrieben.
Dividiere (mit passender Rundung) durch 16 -> -2048…+2047
Addiere 2048 -> 0…+4095

von Markus M. (atmelfreak100)


Lesenswert?

Norbert schrieb:
> Gustl hat's schon richtig beschrieben.
> Dividiere (mit passender Rundung) durch 16 -> -2048…+2047
> Addiere 2048 -> 0…+4095

Errotisch.
Danke, funktioniert perfekt OHNE Rauschen, herrlich!

Einziger Nachteil ist jetzt, durch die Stauchung ist es deutlich leiser 
als vorher. Wie bekomme ich das wieder ausgeglichen?

: Bearbeitet durch User
von Jens G. (jensig)


Lesenswert?

Markus M. schrieb:
> Norbert schrieb:
>> Gustl hat's schon richtig beschrieben.
>> Dividiere (mit passender Rundung) durch 16 -> -2048…+2047
>> Addiere 2048 -> 0…+4095
>
> Errotisch.
> Danke, funktioniert perfekt OHNE Rauschen, herrlich!
>
> Einziger Nachteil ist jetzt, durch die Stauchung ist es deutlich leiser
> als vorher. Wie bekomme ich das wieder ausgeglichen?

Indem Du es wieder mal 16 nimmst ...

Jetzt mal im Ernst - was vergleichst Du hier eigentlich?
Als Du noch 16bit hattest, ging das ja sicherlich noch über einen 16bit 
DAC raus.
Jetzt sind es 12bit über einen 12bit DAC.
Wenn danach derselbe Audioverstärker folgt (also gleiche Verstärkung in 
beiden Fällen), dann arbeiten offensichtlich beide DACs mit 
unterschiedlichen Referenzen, was zu unterschiedlicher Lautstärke führt.
Also hast Du zwei Optionen:
- erhöhe die Referenz des 12bit DAC auf denselben Wert wie die des 16bit 
DAC
- oder erhöhe die Verstärkung des Audioverstärkers um den fehlenden 
Faktor

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

Markus M.freute sich:
> perfekt OHNE Rauschen, herrlich!

Nein.
  Nochmal zum Verständnis: das Quantisierungsrauschen ist um den Faktor 
2^(12-8) kleiner geworden, aber natürlich noch immer vorhanden und bei 
leisen Tonpassagen ganz sicher deutlich hörbar.

von Klaus H. (hildek)


Lesenswert?

Markus M. schrieb:
> Einziger Nachteil ist jetzt, durch die Stauchung ist es deutlich leiser
> als vorher.

Naja, wenn dein Nutzsignal dabei deutlich leiser geworden ist, dann ist 
es auch das Rauschen.
Verstärke es wieder auf eine der beschriebenen Arten und es ist wieder 
hörbar.
Abgesehen davon gibt es bei der Konvertierung auf eine kleinere 
Wortbreite auch die Möglichkeit 'Noise Shaping' anzuwenden - wird in 
DAWs angeboten. Das Zeitsignal sieht zwar schrecklich aus, aber das 
Rauschen ist trotzdem deutlich geringer als bei einfachem Abschneiden 
der LSBs.

von Rolf M. (rmagnus)


Lesenswert?

Klaus H. schrieb:
> Markus M. schrieb:
>> Einziger Nachteil ist jetzt, durch die Stauchung ist es deutlich leiser
>> als vorher.
>
> Naja, wenn dein Nutzsignal dabei deutlich leiser geworden ist, dann ist
> es auch das Rauschen.

Nein, das Quantisierungsrauschen wird dadurch nicht weniger. Und das 
Nutzsignal sollte eigentlich ebenfalls nicht leiser werden.

> Abgesehen davon gibt es bei der Konvertierung auf eine kleinere
> Wortbreite auch die Möglichkeit 'Noise Shaping' anzuwenden - wird in
> DAWs angeboten. Das Zeitsignal sieht zwar schrecklich aus, aber das
> Rauschen ist trotzdem deutlich geringer als bei einfachem Abschneiden
> der LSBs.

Genau genommen wird es nicht geringer, sondern es wird so verändert, 
dass es eher in Frequenzbereichen stattfindet, in denen es weniger 
auffällt.

von Klaus H. (hildek)


Lesenswert?

Rolf M. schrieb:
> Nein, das Quantisierungsrauschen wird dadurch nicht weniger. Und das
> Nutzsignal sollte eigentlich ebenfalls nicht leiser werden.
Wenn alles leiser wird, wie bei einem Lautstärkesteller, den man 
zurückgdreht, dann auch das Rauschen. Es fällt dann weniger auf. Mehr 
meinte ich nicht.
Was die von Gustl B. beschriebene Modifikation bewirkt, habe ich nicht 
versucht nachzuvollziehen - das muss ich zugeben.

> Genau genommen wird es nicht geringer, sondern es wird so verändert,
> dass es eher in Frequenzbereichen stattfindet, in denen es weniger
> auffällt.
Richtig. Ich schrieb ja auch, dass das Zeitsignal 'schlimm' aussieht. 
Der Rauschanteil wird dadurch zu hohen, weniger hörbaren Frequenzen 
verschoben. Zumindest für meine Altersklasse ideal ...

von Jens G. (jensig)


Lesenswert?

Klaus H. schrieb:
> Was die von Gustl B. beschriebene Modifikation bewirkt, habe ich nicht
> versucht nachzuvollziehen - das muss ich zugeben.

Das Nachvollziehen wird sicherlich auch nicht klappen, solange der TO 
keine Details dazu rausrückt, was er wie an welcher Stelle anders 
gemacht hat, bzw. welche Äpfel er mit welchen Birnen vergleicht.

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.