C 用libsndfile为MATLAB编写多通道音频

C 用libsndfile为MATLAB编写多通道音频,c,matlab,libsndfile,C,Matlab,Libsndfile,我正在尝试使用libsndfile编写一个可以被Matlab2010+读取的多通道wav 以下代码编写一个4通道交错wav。通道1上的所有采样值应为0.1,通道2上的采样值应为0.2,通道3上的采样值应为。。。等等 每个通道的长度为44100个样本 我将wave文件拖到MATLAB工作区,不幸的是MATLAB一直返回“文件包含无法解释的数据” 还值得注意的是,当所有样本都设置为0.0时,MATLAB成功读取文件,尽管速度非常慢 我已经成功地使用libsndfile读取了由MATLAB的wavwr

我正在尝试使用libsndfile编写一个可以被Matlab2010+读取的多通道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

参考:该代码已从

有什么建议吗,我想我犯了一个简单的错误

谢谢

#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);
}
#包括
#包括
#包括
int main()
{
//创建交错的音频数据
int numFrames_out=44100;
int通道=4;
浮点*整数;
int_y=(float*)malloc(通道*numFrames_out*sizeof(float));
长q=0;

对于(long i=0;i,在错误情况下,您似乎只关闭输出文件(使用sf_close())。除非调用sf_close(),否则输出文件将不是格式良好的WAV文件在您的程序结束时。

我发现了一个临时解决方案-Audacity可以读取使用上述代码创建的wav文件,因此如果我启用Audacity的导出到多通道wav功能,然后将该文件导入MATLAB,它就可以工作。这也证实了MATLAB可以读取多通道wav(如果有疑问)这个问题在某种程度上与格式有关。我希望我知道为什么有人-1没有解释不幸的是缺少sf_close()演示代码不是问题所在。Matlab仍然报告错误,而audacity工作正常。
sndfile info程序
对该文件有何说明?该程序是libsndfile源代码发行版的一部分,在大多数linux发行版中,它位于一个名为
sndfile程序
的包中。