Forum: Mikrocontroller und Digitale Elektronik Wav an I2S senden


von Ford Prefect (Gast)


Lesenswert?

Hi,

ich möchte ein Wav -File an eine I2S Schnittstelle senden.
Hierzu verwende ich einen ARM9 auf dem Embedded Linux läuft.

Ich habe die I2S Schnittstelle voll unter Kontrolle d.h. alles was ich
Ihr sende kommt auch raus. Ich habe von Atmel ein Wav-File
in C-Code. (44,1kHz 16bit, Stereo) Dieses lässt sich auch ohne Probleme
abspielen.

Wenn ich mir selbst ein Wav-C-File erstelle, (WAV (44,1 kHz, 16bit,
Stereo) im Hex-Editor öffnen und den Inhalt ohne Header in die C-Datei
kopieren) höre ich leider nicht das was ich gerne hören würde sondern
nur ein Rauschen. Wenn ich mir die Daten auf der Datenleitung des I2S
anschaue, sind es auch genau die Daten die ich Sende. Also sende ich
wohl was falsches.

Und hier nun meine Frage:
Weis jemand, ob ich die Daten des Wav-Files für I2S irgendwie verändern
muss? Wenn ja wie?
Oder ist WAV irgendwie decodiert und ich muss sie irgendwie encoden?
Falls dies der Fall ist hat einer einen C-Code dafür?

Wäre super wenn mir jemand helfen könnte.

Viele Dank schon mal im Vorraus.

Ford

von Ford Prefect (Gast)


Lesenswert?

Ups habe blödsinn geschrieben!

Ich meinte natürlich:
Ist Wav irgendwie codiert und muss ich es irgendwie decodieren?

Sorry hab ich wohl schneller getippt als gedacht ;-)

von Rufus T. Firefly (Gast)


Lesenswert?

Ohne weiteres über Deine Hardware zu wissen, wird man das kaum
beantworten können. Hier ist der verwendete D/A-Wandler von Interesse,
der an der IIS-Schnittstelle hängt.
In dessen Datenblatt sollte das von ihm erwartete Format der Daten
beschrieben sein. Möglicherweise müssen diese in umgekehrter
Reihenfolge übertragen werden (MSB first/LSB first), möglicherweise
erwartet er mehr als 16 Bit pro Sample ...

.WAV ist ein Containerformat, das alle möglichen Codierungen zulässt;
letztlich können auch mp3-Dateien als .wav abgespeichert werden.
Das 44.1kHz-Stereo-Standard-Wav ist jedoch unkomprimiertes "plain"
PCM, bei dem sich die 16-Bit-Stereosamples für die beiden Audiokanäle
abwechseln, genau so, wie sie auch auf Audio-CDs gespeichert sind.

von Ford Prefect (Gast)


Lesenswert?

Danke für Deine Antwort.

Also die konfiguration des D/A Wandlers stimmt. Darum bin ich auch
nicht näher darauf eingegangen. Ich höre ja auch das BSP. von ATMEL in
bester Qualität.

Ich habe ein Sinus mit CoolEdit erzeugt und abgespeichert (als PCM)
dieser lässt sich aber nicht abspielen. Man hört, zwar, dass es ein
Sinus sein könnte aber wenn ich Ehrlich bin ist es ein einziges
monotones Rauschen. Wie gesagt ich denke, dass ich nur die falschen
Daten rausschicke. Da wenn ich mir die Daten auf dem Oszi anschaue,
stimmen die empfangenen mit den gesendeten überein!

von Jens (Gast)


Lesenswert?

Nur so eine Idee: könnte ein eventuell vorhandener Header in deinem
wav-File etwas durcheinander gebracht haben?

von Ford Prefect (Gast)


Lesenswert?

Den Header habe ich eigenlich rausgelöscht!
Aber selbst wenn ich den Header mitschicken würde, hätte ich nur am
Anfang Stuss später würden dann ja die Daten kommen.

von Rufus T. Firefly (Gast)


Lesenswert?

Daß Du das Beispiel von Atmel hören kannst, sagt nichts aus - womöglich
ist das ja entsprechend aufbereitet (MSB/LSB vertauscht etc.)

Du könntest versuchen, das Atmel-Beispiel aus dem Code zu extrahieren
und daraus ein .wav-File zu erstellen, um es Dir auf dem PC anzuhören
(mit geeigneten Wave-Editoren à la Wavelab musst Du Dir auch keine
Gedanken um etwaige wave-Header machen, dies Programme unterstützen
auch "raw data").

von thomas (Gast)


Lesenswert?

@Ford Prefect:
Ich las du arbeitest mit einem Embedded Linux auf einem ARM9, was ist
das für eine Hardware? Ist das ein Development Kit? Gibt's das zu
kaufen, wenn ja wo? Und gibt's Infos hierzu im I-Net? Wie machst du
das, dass du Linux darauf laufen lässt? Beschreib das mal, bin auch
sehr an einem Embedded Linuxsystem interessiert.

von Steffen (Gast)


Lesenswert?

@Ford Perfect
Der WAV-Header muss schon korrekt entfernt werden. Bleibt zum Beispiel
eine ungerade Anzahl von Bytes am Anfang zurück, dann verschieben sich
die 2 Byte pro Sample so, dass Du immer die LSB und MSB von
verschiedenen Samplen mischt.

Außerdem kann ich mich erinnern, dass es evtl. einen Offset in den
Sample-Werten gibt, um den negativen Bereich abzudecken (z.B.
8-bit-Sample: Null = 0x80, -Max. = 0x00, +Max. = 0xFF).

von Ford (Gast)


Lesenswert?

Ok danke für die vielen Hinweise, ich habe es hinbekommen. Ich habe ein
PCM-RAW erstellt und mit dem geht es! Es liegt wohl wirklich daran ob
ich das LSB oder das MSB First schicke. Das ist wohl von Format zu
Format unterschiedlich! Aber das kann ich mit setzten eines Bits ja
leicht verändern.

Nun zum nächsten Schritt: Jetzt nachdem ich Wav-Files auf die I2S
schnittstelle geben kann. Möchte ich gerne MP3 auf die Schnittstelle
geben. Kennt einer einen Software MP3 encoder der in C/C++ geschrieben
ist, der mir meine MP3 Files in PCM Daten umwandelt, damit ich sie an
die I2S Schnittstelle senden kann? Ich möchte es auf jeden Fall
Softwaremäßig machen und nicht mit Hardware! Das wäre ja zu simpel ;-)
Also für Hinweise wäre ich mehr als Dankbar!

@thomas: Ja ist eine Entwicklungsplatine. Der Firma Taskit
(www.taskit.de) und nennt sich Portux. Es gibt aber auch ein Board von
direkt von Atmel

Viele Grüße und Danke für Eure Hilfe

Ford

von Ford (Gast)


Lesenswert?

Oh mann es ist spät ich meinte natürlich einen decoder!

Also auf gut Deutsch MP3 zu PCM

von Rufus T. Firefly (Gast)


Lesenswert?

Ja, mp3-Decoder-Software gibt es; wurde kürzlich hier besprochen:

http://www.mikrocontroller.net/forum/read-2-195188.html#new

von Ford (Gast)


Lesenswert?

Danke für den Link!

Aber das ist nicht ganz dass was ich suche. Diese Decoder basieren
immer auf der Ausgabe auf eines Soundblasters! Ich möchte die Files ja
nur einlesen und direkt in ein PCM umwandeln, damit ich es direkt an
die I2S schnittstelle senden kann.

Viele Grüße

Ford

von Rufus T. Firefly (Gast)


Lesenswert?

Liegt da möglicherweise ein Missverständnis vor?
Beispielsweise der Anhang im zweiten Posting im Thread ist für einen
LPC2106, auch das von mir erwähnte mad (underbit) liegt in einer
ARM-Portierung vor.

Ich wüsste nicht, was das mit einem Soundblaster zu tun hat bzw. wie
man den an einen LPC2106 anschließen könnte ...

Und selbst wenn die Decoder einen Soundblaster ansprechen würden,
sollte es möglich sein, in den Sourcen die Stelle zu lokalisieren, an
der die decodierten PCM-Daten dem Soudblaster übergeben werden. An
dieser Stelle müsstest Du halt Deine I2S-Routine einbauen ... et
voilà!

Weiterhin viel Erfolg!

von Ford (Gast)


Lesenswert?

Hi,

dass ist schon möglich. Der MAD Code ist jedoch leider sehr
unkommentiert und da ist es nicht gerade einfach durchzusteigen.

Außerdem ist es nicht so einfach die benötigten libs in das ARM System
einzubinden. Oder mach ich da was falsch?

Kann mir vielleicht jemand einen Tip geben, wie ich die libs anders
einbinden kann?

Viele Grüße

Ford

von Marius S. (mimamau)


Lesenswert?

Ford Prefect schrieb:
> Ich habe die I2S Schnittstelle voll unter Kontrolle d.h. alles was ich
> Ihr sende kommt auch raus. Ich habe von Atmel ein Wav-File
> in C-Code. (44,1kHz 16bit, Stereo) Dieses lässt sich auch ohne Probleme
> abspielen.

Der Thread ist zwar schon etwas älter, aber könnte mir jm. einen Link zu 
dem genannten Beispielcode von Atmel geben? Danke!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Marius S. (mimamau)


Lesenswert?

Danke!

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.