Forum: FPGA, VHDL & Co. Lesen einer WAV-Datei - DE1 Board - Samples lesen


von rd r. (rashmo)


Angehängte Dateien:

Lesenswert?

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.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Der Fehler liegt in Zeile 42 deines Codes.

von dito (Gast)


Lesenswert?

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?

von Vhdl++ (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von rd r. (rashmo)


Lesenswert?

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 :)

von Narf (Gast)


Lesenswert?

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?

von Lattice User (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.