Hallo, Ich arbeite im Moment an einem Projekt, bei dem es darum geht von einer SD-Karte WAV-Files zu lesen und abzuspielen. Das Ganze soll auf dem Entwickler-Board der Firma Altera (DE1-Board) laufen. Den Aufbau einer WAV-Datei kenne ich. Ich lese die ersten 44 Bytes der WAV-Datei und schaue wie die Datei aufgebaut ist. Nach dem 44 Byte fängt dann der DATA-Bereich. Die Samples fangen quasi nach dem 44. Byte. Zuerst kommt der DATA Subchunk(4 Byte = "Data"), danach der Subchunk-Size (4Byte) und dann fangen die Samples an. (rot markiert auf der Bild-Datei s.o.) Das problem ist folgendes, wenn ich mein Projekt laufen lasse, dann kommt das Lied abgehackt aus dem Kopfhörer. So gehe ich vor: Ich lese die Samples von der SD-Karte, und speichere sie zuerst als unsigned char (8Bit) in einem array (size = 256). Soviel ich weiß muss man die Samples erst "umdrehen" bevor man sie zum Audio-Core (wm8731) sendet, d.h. wenn ich folgende Werte von der SD-Karte gelesen habe "37 01 CD FF (hex)" (das wären jetzt die ersten zwei Samples) dann muss ich das quasi umdrehen. Die ersten zwei Bytes drehe ich so um -> 01 37 = Sample für das linke Channel, dann "FF CD" = sample für das rechte Channel. Ich habe glaube ich hunderte Seiten besucht und ich bekomme das einfach nicht hin. Egal was für Lieder ich abspiele, es kommt einfach "abgehackt" aus den Lautsprechern. Ich wäre so dankbar falls mir jemand irgendein Tipp geben könnte wo ich vielleicht falsch liege.
rd rdd schrieb: > Das problem ist folgendes, wenn ich mein Projekt laufen lasse, dann > kommt das Lied abgehackt aus dem Kopfhörer. Bist du denn sicher, dass die Übertragungsrate von der SD-Karte ausreichend ist?
Der Beschreibung nach verwendest du C, also warscheinlich NIOS und dafür gibt es ein Beispielprojekt von Altera/Terasic was GENAU das macht. http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=53&No=83&PartNo=4 Habe ich schon probiert, funktioniert wunderbar.
rd rdd schrieb: > Soviel ich weiß muss man die Samples erst "umdrehen" bevor man sie zum > Audio-Core (wm8731) sendet Meinst du das Thema "Little-Endian" vs. "Big-Endian"? > es kommt einfach "abgehackt" aus den Lautsprechern. Was ist "abgehackt"? Kannst du prinzipiell was Sinnvolles hören? Dann passt nämlich diese "Byte-Reihenfolge" schon mal und da Problem liegt woanders.
Ich möchte mich erstmal bedanken für die Antworten. Ich versuche mal präziser zu werden. Falls sich jemand die Mühe macht mein Problem zu verstehen wäre ich äußerst dankbar. I.) Kurze Anmerkung über das Projekt: Es wird in C programmiert. Entwickelt wird auf dem DE1-Board der Firma Altera. Ich verwende Eclipse Nios als Entwicklertool. Ich muss mit dem von der Hochschule vorgegebener SoPC arbeiten (3. Semester - Technische Informatik). Alle Demos der Firma Altera zum Thema Audio/Video und SD-Karte habe ich hier bei mir. Ich habe sehr viel Zeit damit verbracht die Demos zu debuggen, dadurch konnte ich mein eigener SD-Card-Controller implementieren (mit dem FatFS-System von Elm Chan). Zusätzlich zu den vielen Anleitungen im Netz arbeite ich mit dem Buch "Embedded SoPC Design" von Pong P. Chu. Was passiert genau? Was genau läuft schief? Das Problem liegt wie gesagt nur beim Audio-Controller. Ich gehe stark davon aus dass der Audio-Controller richtig eingestellt wurde. Ich lasse mein Projekt über Nios Eclipse laufen. Man kann sehr wohl erkennen, dass sich die Frequenz ändert. Das abgespielte Lied ist zu erkennen. Jedoch "abgehackt", immer mit eine kurze Unterbrechung. Falls Interesse besteht kann ich gerne ein kurzer Audioausschnitt uploaden. II.) Kurze Infos über den Audio-Controller: - es handelt sich um den Audio-Codec wm8731. - im SoPC-Builder wurden folgende Hardware-Grundeinstellungen vorgenommen - 16 Bit-Breite für die Samples - 48 kHz Abtastrate - Steuerung des Audio-Codecs über den I2C (2-Wire-Interface) - 12,288 MHz Taktfrequenz Der Audio Codec verfügt über neun interne Register die von mir per Software eingestellt werden. Ab Seite 50 im Datenblatt des wm8731 gibt es eine Übersicht der Register. III. Fehler reproduziert Die Dmeoversion der Firma Altera laufen einwandfrei, das Lied wird ohne Porbleme abgespielt. Ich habe jedoch bei der Demoversion der Firma Altera geschafft den gleichen Fehler zu reproduzieren, wenn ich kurz bevor ich die Daten zum Audio-Controller schreibe eine "printf("Sample xy")" auf der Eclipse-Konsole ausgebe. IV.) Falls Interesse besteht kann ich ein Teil des Codes hier veröffentlichen. Ich würde mich freuen wenn sich jemand mit Audio auskennt und mir sagen kann woran das Problem liegen könnte. Ansonsten danke ich Allen die sich die Mühe gemacht haben mir zu helfen. Ich verfolge die Seite schon seit vier Monate und ich konnte sehr viel lernen. Das hier war mein zweiter Post, da ich wirklich am ende mit mein Latein bin :)
Das klingt doch so, als ob du die Timing Constraints nicht einhalten kannst in deinem Programm und deshalb ein Puffer leer läuft, bzw. die neuen Daten zu spät bereitgestellt werden (dein printf-Experiment). Da du den Fehler im Audioteil vermutest würde ich an deiner Stelle einen Teil der Wav-Datei in ein C-Array packen und versuchen diese Daten abzuspielen. Das grenzt schon einmal ein ob du ein Problem mit der SD-Karte bzw. dem Zusammenspiel der Komponenten hast oder ob dein Problem wirklich nur durch den Audioteil hervorgerufen wird. Nur als Anmerkung: Du hast aber keinen JTAG-Debug nebenbei laufen, der die Ausführungsgeschwindigkeit herabsetzt und dadurch Probleme verursacht?
rd rdd schrieb: > SD-Karte habe ich hier bei mir. Ich habe sehr viel Zeit damit verbracht > die Demos zu debuggen, dadurch konnte ich mein eigener > SD-Card-Controller implementieren (mit dem FatFS-System von Elm Chan). > Dieser SD-Card-Controller ist vermutlich zu langsam, d.h. du kannst die Audio Daten nicht rechtzeitig ableifern. > > III. Fehler reproduziert > Die Dmeoversion der Firma Altera laufen einwandfrei, das Lied wird ohne > Porbleme abgespielt. Ich habe jedoch bei der Demoversion der Firma > Altera geschafft den gleichen Fehler zu reproduzieren, wenn ich kurz > bevor ich die Daten zum Audio-Controller schreibe eine "printf("Sample > xy")" auf der Eclipse-Konsole ausgebe. > Klar damit bremst du ja die Datenübertragung aus, für Audio tödlich.
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.