我正在尝试使用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/

10-12 14:37
查看更多