2015-04-16 2 views
-2

Я пытаюсь использовать libsndfile для записи многоканального wav, который может быть прочитан MATLAB 2010+.Написание многоканального звука для MATLAB с libsndfile

следующий код записывает 4-канальный чередующийся wav. все образцы на канале 1 должны быть равны 0,1, на канале 2 - 0,2, на канале 3 ... и т.д.

Каждый канал имеет длину 44100.

Я перетаскиваю файл волны в рабочее пространство MATLAB и, к сожалению, MATLAB продолжает возвращать «Файл содержит неинтерпретируемые данные».

Возможно также стоит отметить, что когда все образцы установлены в 0.0, MATLAB успешно читает файл, хотя и очень медленно.

Я успешно использовал libsndfile для чтения многоканальных данных, написанных MATLAB's wavwrite.m, поэтому библиотека правильно настроена, я верю.

Audacity может прочитать полученный файл по приведенному ниже коду.

VS 2012 64 битный компилятор, Win7 64bit, MATLAB 2015a

исх: код был адаптирован из http://www.labbookpages.co.uk/audio/wavFiles.html

Любые предложения, я полагаю, я делаю простую ошибку здесь?

Благодаря

#include <sndfile.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
// Create interleaved audio data 
int numFrames_out = 44100; 
int channels = 4; 
float *int_y; 
int_y = (float*)malloc(channels*numFrames_out*sizeof(float)); 
long q=0; 
for (long i = 0; i<numFrames_out; i++) 
{ 
    for (int j = 0; j<channels; j++) 
    { 
     int_y[q+j] = ((float)(j+1))/10.0; 
    } 
    q+=channels; 
} 


// Set multichannel file settings 
SF_INFO info; 
info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_32; 
info.channels = channels; 
info.samplerate = 44100; 

// Open sound file for writing 
char out_filename[] = "out_audio.wav"; 
SNDFILE *sndFile = sf_open(out_filename, SFM_WRITE, &info); 
if (sndFile == NULL) 
{ 
    fprintf(stderr, "Error opening sound file '%s': %s\n", out_filename, sf_strerror(sndFile)); 
    return -1; 
} 

// Write frames 
long writtenFrames = sf_writef_float(sndFile, int_y, numFrames_out); 

// Check correct number of frames saved 
if (writtenFrames != numFrames_out) { 
    fprintf(stderr, "Did not write enough frames for source\n"); 
    sf_close(sndFile); 
    free(int_y); 
    return -1; 
} 
sf_close (sndFile); 
} 
+0

Я нашел временную работу - Audacity может прочитать wav-файл, созданный с использованием вышеприведенного кода, и поэтому, если я включу экспорт в многоканальную wav-функцию Audacity, а затем импортирую этот файл в MATLAB, он работает. Это также подтверждает, что MATLAB может читать многоканальные wav (если это было сомнительно), и проблема как-то связана с форматированием. – AlexS

+0

Мне жаль, что я не знаю почему кто-то -1 без объяснения причин – AlexS

ответ

0

Похоже, вы только закрыть выходной файл (с помощью sf_close()) в случае ошибки. Выходной файл не будет хорошо сформированным WAV-файлом , если только вы не вызываете sf_close() в конце вашей программы.

+0

К сожалению, отсутствующий sf_close() из демонстрационного кода не был проблемой. Matlab все еще сообщает об ошибке, тогда как смелость работает нормально. – AlexS

+0

Что говорит о файле файла sndfile-info? Эта программа является частью дистрибутива источника libsndfile и находится в пакете под названием «sndfile-programs» в большинстве дистрибутивов Linux. –