Forum: PC-Programmierung WAV datei in excel ansehen


von Dave (Gast)


Angehängte Dateien:

Lesenswert?

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
int main()
2
{
3
    FILE *datei,*datei2;
4
    unsigned char i;
5
    signed char chr;
6
7
    datei = fopen("D:\\Desktop\\sinus.wav","r");
8
9
    datei2 = fopen("D:\\Desktop\\Test.txt","w");
10
11
    for(i=0;i<=42;i++)
12
         chr=fgetc(datei);          //Skip header
13
14
15
    for(i=0;i<250;i++)
16
    {
17
18
        chr=fgetc(datei);
19
        fprintf(datei2,"%i\t",chr);
20
        printf("%i\t",chr);
21
        chr=fgetc(datei);
22
        fprintf(datei2,"%i\n",chr);
23
        printf("%i\n",chr);
24
    }
25
26
27
    fclose(datei);
28
29
30
    return 0;
31
}

von Amateur (Gast)


Lesenswert?

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?

von Stefan L. (timpi)


Lesenswert?

Moin, Moin,

die WAV-Datei ist zu kurz. -1 == EOF.

von Dave (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Dave (Gast)


Lesenswert?

Stefan L. schrieb:
> Moin, Moin,
>
> die WAV-Datei ist zu kurz. -1 == EOF.

Wenn ich die WAV mit Notepad++ öffne ist sie aber 236 Zeichen lang.

von Amateur (Gast)


Lesenswert?

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.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

EOF ist ^Z.

Nimm open() und read(), dann geht das auch binär.
Oder den Stream mit "rb" öffnen.

von Stefan L. (timpi)


Lesenswert?

Joachim Drechsel schrieb:
> EOF ist ^Z.
>

Stimmt.

> Nimm open() und read(), dann geht das auch binär.
> Oder den Stream mit "rb" öffnen.

Oder:
1
int chr;

von Amateur (Gast)


Lesenswert?

>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.

von Dave (Gast)


Lesenswert?

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.

von Dave (Gast)


Lesenswert?

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.

von opa (Gast)


Lesenswert?

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!

von Marco (Gast)


Lesenswert?

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);
}

von Dave (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Dennis S. (eltio)


Lesenswert?

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ß

von Dave (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
  unsigned char bytes[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.

: Bearbeitet durch User
von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Warum öffnest du die Datei nicht mit Excel und VBA ?

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.