我正在尝试使用libsndfile编写可由MATLAB 2010+读取的多通道wav。
以下代码编写了一个4通道交错的wav。通道1上的所有采样应为0.1,通道2上的所有采样应为0.2,通道3上的所有采样...等等。
每个通道的长度为44100个样本。
我将wave文件拖到MATLAB工作区上,不幸的是MATLAB不断返回“文件包含不可解释的数据”。
值得注意的是,当所有样本都设置为0.0时,MATLAB成功读取了文件,尽管速度非常慢。
我已经成功地使用libsndfile读取了由MATLAB的wavwrite.m编写的多通道数据,因此我相信该库已正确设置。
Audacity可以从下面的代码中读取生成的文件。
VS 2012 64位编译器,
Win7 64位,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);
}
最佳答案
看起来您只是在错误情况下关闭了输出文件(使用sf_close())。除非您在程序末尾调用sf_close(),否则输出文件将不是格式正确的WAV文件。
关于c - 使用libsndfile为MATLAB编写多声道音频,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29678256/