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
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 ;-)
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.
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!
Nur so eine Idee: könnte ein eventuell vorhandener Header in deinem wav-File etwas durcheinander gebracht haben?
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.
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").
@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.
@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).
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
Ja, mp3-Decoder-Software gibt es; wurde kürzlich hier besprochen: http://www.mikrocontroller.net/forum/read-2-195188.html#new
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
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!
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
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!
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.