Ich möchte gerne die eine WAV Audio-Datei in Excel ansehen und habe mir
ein C-Programm geschrieben das die WAV Datei ausließt und die Zahlen in
eine txt schreibt. Ich habe aber das Problem, dass die txt unvollständig
wird. Ich habe mir 2ms Sinus mit 1kHz in Audacity erzeugt und als WAV
exportiert. Wenn ich das Programm starte erhalte ich nur sinnvolle Werte
für eine knappe Periode. Als das Erstellte txt. Kann mir jemand sagen o
der Fehler liegt?
C-Programm:
1. Ich kenne das interne Format der wav-Dateien nicht, aber reicht denn
> for(i=0;i<250;i++)
für die ganze Datei (-42) überhaupt aus?
2. Sind da nicht Wörter (16 Bit) und keine
> signed char
drinnen?
Ich weiß nicht ob es ausreicht, ich bekomme aber schon nach 43 Zeilen
(also 86 + 42 Werte) keine sinnvollen werte.
Eine Zeile in meiner txt enthält jeweils das high- und das low-Byte.
Wenn ich in exel nur das high-Byte in ein Diagramm eintrage sieht das so
aus.
Wenn ich das low- und das high-Byte zu einer 16bit zahl zusammenfasse
bekomme ich auch einen schönen Sinus im Diagramm.
1. Audacity hat doch bestimmt nach Datenwortbreite und Abtastrate
gefragt.
2. Der Explorer -> rechtsklick auf Dateinamen -> "Eigenschaften" sagt
Dir genau wie lang das Teil ist.
Amateur schrieb:> 1. Audacity hat doch bestimmt nach Datenwortbreite und Abtastrate> gefragt.
Ich habe es mit 48000 kSampel und 16 bit exportiert.
Amateur schrieb:> 2. Der Explorer -> rechtsklick auf Dateinamen -> "Eigenschaften" sagt> Dir genau wie lang das Teil ist.
Da steht 236 bytes
Joachim Drechsel schrieb:> Nimm open() und read(), dann geht das auch binär.> Oder den Stream mit "rb" öffnen.
Ich weiß nicht wie das geht.
Amateur schrieb:>>Wenn ich die WAV mit Notepad++ öffne ist sie aber 236 Zeichen lang.>> 42 (for) + 250 (for) macht aber nach Adam Ries und Eva Zwerg mehr als> 236 Bytes.
Also lese ich genug Bytes ein, ab dem 42 + 87 Byte sind aber alle -1.
Dave schrieb:> Also lese ich genug Bytes ein, ab dem 42 + 87 Byte sind aber alle -1.
herrgott, beschäftige dich mit dem wav-format, ist das so schwierig? ich
dachte immer man überlegt BEVOR man anfängt zu programmieren!
Ich verstehe nicht, warum die die zweite for-Schleife statisch auf 250
begrenzt. Gibt es dafür einen Grund?
Ich hätte die Schleife dynamisch gestaltet:
while((chr=fgetc(datei)) != -1)
{
fprintf(datei2,"%i\t",chr);
printf("%i\t",chr);
chr=fgetc(datei);
fprintf(datei2,"%i\n",chr);
printf("%i\n",chr);
}
opa schrieb:> herrgott, beschäftige dich mit dem wav-format, ist das so schwierig? ich> dachte immer man überlegt BEVOR man anfängt zu programmieren!
Könntest du mir bitte sagen was ich falsch gemacht habe?
Marco schrieb:> Ich verstehe nicht, warum die die zweite for-Schleife statisch auf 250> begrenzt. Gibt es dafür einen Grund?
Ich wollte es erst dynamisch machen, da dann zu wenig Bytes eingelesen
wurden, habe ich es mit einer festen Länge die sicher länger ist als die
Anzahl der Bytes versucht.
Der Code macht keinerlei Fehlerprüfung und mischt Funktionalität für
Text- und Binärdaten. Was mir so auffällt:
fgetc() ist eigentlich für Text gedacht. Binärdaten liest man mit
fread().
Du öffnest das Eingangsfile als Text, was zur Folge hat, daß die Daten
teilweise modifiziert werden (insbesondere Zeilenende-Konvertierungen).
Also "rb" beim Öffnen angeben. Ich bin mir nicht ganz sicher, aber
möglicherweise wird im Textmodus auch ein bestimmter Wert als
EOF-Zeichen gewertet, so daß die Funktion davon ausgeht, daß dort das
Dateiende erreicht ist, obwohl das noch gar nicht der Fall ist.
Wahrscheinlich kommt von deinem fgetc ein EOF zurück, das aber durch die
implizite Konvertierung nach signed char nicht mehr als solches
erkennbar ist. EOF kommt nicht nur am Dateiende, sondern auch im
Fehlerfall zurück.
Damit könnte man z.B. per perror() den Fehlertext ausgeben lassen. Wenn
das Dateiende oder ein Fehler auftritt, kommt bei jedem weiter folgenden
fgetc() ein EOF zurück, das von dir aber als gelesener Wert von -1
interpretiert wird.
Warum schließt du eigentlich nur die Eingangsdatei? Das kann dazu
führen, daß die Zieldatei unvollständig ist, weil irgendwelche Puffer
noch nicht rausgeschrieben wurden, bevor dein Programm beendet wird.
Dave schrieb:> opa schrieb:>> herrgott, beschäftige dich mit dem wav-format, ist das so schwierig? ich>> dachte immer man überlegt BEVOR man anfängt zu programmieren!> Könntest du mir bitte sagen was ich falsch gemacht habe?
Er will dir sagen, dass du dich nicht mit den Grundlagen beschäftigt
hast. Weder mit der C-Programmierung noch mit dem Wave-Header. Ein
bisschen suchen liefert zum Beispiel dies hier:
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
Gruß
Mit datei = fopen("D:\\Desktop\\sinus.wav","rb");
und fread(&chr,1,1,datei);
funktioniert. Ich bekomme jetzt aber am eine der Datei immer 105 fürs
LSB und -12 fürs MSB zurück.
Dave schrieb:> Mit datei = fopen("D:\\Desktop\\sinus.wav","rb");> und fread(&chr,1,1,datei);> funktioniert. Ich bekomme jetzt aber am eine der Datei immer 105 fürs> LSB und -12 fürs MSB zurück.
Ich nehme an, das soll "Ende der Datei" heissen.
wie hast du deine Schleife aufgebaut?
fread liefert dir als Returnwert die Anzahl der Bytes, die es
tatsächlich lesen konnte. Diese Zahl brauchst du nur Auswerten. Wenn
fread mitteilt, dass es 0 Zeichen lesen konnte, dann gab es einen
Fehler. Bei dir ist der Fehler höchst wahrscheinlich, dass das Fileende
erreicht wurde. D.h. mit
1
while(fread(&chr,1,1,datei))
2
{
3
....
4
}
arbeitest du ganz automatisch eine Datei ab. Und wenn du dann nicht nur
1 Zeichen liest, sondern deren gleich 2, dann brauchst du da auch die
ganzen Klimmzüge mit 2 mal Lesen nicht, um das High-Byte vom Low-Byte zu
trennen bzw. getrennt zu verarbeiten.
1
...
2
3
unsignedcharbytes[2];
4
5
...
6
7
while(fread(&bytes,1,2,datei))
8
{
9
fprintf(datei2,"%i\t%i\n",bytes[0],bytes[1]);
10
}
C kann so einfach sein, wenn man es nur lernen würde.