2016-05-18 10 views
2

In C verwende ich die Libsndfile-Bibliothek, um mir zu helfen, die Werte einer WAV-Datei zu lesen, damit ich ihnen einige Berechnungen danach machen kann. Obwohl, wenn ich die Ausgabe der Datei bekomme, bin ich mir nicht sicher, was diese Zahlen bedeuten. Warum sind die Zahlen in Millionen? Zuerst dachte ich, es wäre Hz, aber es ergab keinen Sinn in meinem Kopf. Die Informationen bezüglich der WAV-Datei können unten gesehen werden. Darunter verwende ich die Funktion sf_read_int(), um die Werte in den Speicher zu schreiben.Werte einer WAV-Datei

Was macht sf_read_int()? Dies wurde von der API-Dokumentation von libsndfile erhalten:

  • die Datei schreiben Artikel Funktionen die Daten im Array schreiben, um auf die Datei von ptr zeigt. Der Parameter items muss ein ganzzahliges Produkt der Anzahl der Kanäle sein, sonst tritt ein Fehler auf.

enter image description here

Suspected values of the wav file

entschied ich mich einige dieser großen Werte in einem Diagramm zu zeichnen, und es sieht sehr ähnlich, was die WAV-Datei sollte wie folgt aussehen (Wenn ich in Kühnheit importiert und gezoomt an einem bestimmten Ort würde ich das sehen). Beachten Sie, dass die angezeigten Werte nicht dieselben Werte in der Grafik sind. Ich habe die Werte zu einem beliebigen Zeitpunkt abgetastet. Also ich denke, die wirkliche Frage ist, warum sind diese Werte so groß (in Millionen)? Und was repräsentieren sie? (Sind sie Bytes?)

enter image description here

+0

Welches Beispielformat enthält die Datei? Sie könnten Schwimmer sein? – cleblanc

+0

Ich werde ehrlich zu dir sein, ich habe keine Ahnung, wie ich das überprüfen soll. Ich habe eine einfache MP3-Datei in eine WAV-Datei konvertiert und diese als Datei verwendet. Obwohl, wenn ich sf_read_float() versuche, meine Ausgabe alle Nullen ist. – VedhaR

+0

http://soundfile.sapp.org/doc/WaveFormat/ – KevinDTimm

Antwort

3

in limits.h können Sie wahrscheinlich zwei solche Definitionen finden (unter anderen Sachen):

#define INT_MAX 0x7FFFFFFF 
#define INT_MIN 0x80000000 

, die zwischen -2147483648 und 2147483647 dem Dezimalsystem Bereich entsprechen.

Libsndfile Handbuch sagt:

sf_count_t sf_read_int(SNDFILE *sndfile, int *ptr, sf_count_t items); 

, d. H., Liest den Inhalt der Sounddatei in Integer Werte, auf die int *ptr zeigt. Welcher Wert auch immer zwischen INT_MIN und INT_MAX fällt, ist ein legitimer Wert. In libsndfile API müssen der vom aufrufenden Programm verwendete Datentyp und das Datenformat der Datei nicht identisch sein.

Bitte beachten Sie auch, dass es in einer Audiodatei keine "Frequenz" gibt. Lineare PCM-Dateien bestehen nur aus rohen Sample-Daten mit vorangestelltem Header, während "Frequenz" ein mathematisches Abstraktions- oder Analyseergebnis ist.

Dies könnte von Ihrem Interesse sein:

Wenn zwischen ganzzahligen PCM-Formaten unterschiedlichen Größe umzuwandeln (zB mit sf_read_int() mit einer 16-Bit-PCM-codierten WAV-Datei lesen) libsndfile gehorcht eine einfache Regel:

Wenn Ganzzahldaten von einem großen Container in einen Container mit einer anderen Größe verschoben werden, wird das höchstwertige Bit im Quellcontainer das höchstwertige Bit im Zielcontainer.

Lesen Sie das Handbuch sorgfältig durch, besonders wenn es klar geschrieben ist.