使用 libsndfile 为 MATLAB 编写多声道音频

Posted

技术标签:

【中文标题】使用 libsndfile 为 MATLAB 编写多声道音频【英文标题】:Writing multichannel audio for MATLAB with libsndfile 【发布时间】:2015-04-16 14:45:50 【问题描述】:

我正在尝试使用 libsndfile 编写一个可由 MATLAB 2010+ 读取的多通道 wav。

以下代码编写了一个 4 通道交错 wav。通道 1 上的所有样本都应为 0.1,通道 2 上为 0.2,通道 3 上......等等。

每个通道的长度为 44100 个样本。

我将波形文件拖到 MATLAB 工作区,不幸的是 MATLAB 不断返回“文件包含无法解释的数据”。

还可能值得注意的是,当所有样本都设置为 0.0 时,MATLAB 会成功读取文件,尽管速度很慢。

我已成功使用 libsndfile 读取由 MATLAB 的 wavwrite.m 写入的多通道数据,因此我相信该库已正确设置。

Audacity 可以从下面的代码中读取结果文件。

VS 2012 64 位编译器, Win7 64位,MATLAB 2015a

ref: 代码改编自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);

【问题讨论】:

我找到了一个临时解决方法 - Audacity 可以读取使用上面的代码创建的 wav 文件,因此如果我启用 Audacity 的导出到多通道 wav 功能,然后将该文件导入 MATLAB,它可以工作.这也证实了 MATLAB 可以读取多通道 wav(如果有疑问),并且问题与格式有关。 我希望我新为什么有人 -1 没有解释 【参考方案1】:

看起来您只是在错误情况下关闭输出文件(使用 sf_close())。输出文件不会是格式正确的 WAV 文件除非您在程序结束时调用 sf_close()。

【讨论】:

不幸的是,演示代码中缺少的 sf_close() 不是问题所在。 Matlab 仍然报告错误,而 Audacity 工作正常。 sndfile-info program 对文件有何评论?该程序是 libsndfile 源代码分发的一部分,并且在大多数 linux 发行版中位于类似 sndfile-programs 的包中。

以上是关于使用 libsndfile 为 MATLAB 编写多声道音频的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中使用 libsndfile 读取 .wav 文件

错误:主要格式为 0(libsndfile,Qt)

为 ARM 架构构建 libsndfile 库

使用 VS2010 的 libsndfile 奇怪行为

将 libsamplerate 与 libsndfile 一起使用

Libsndfile - 如何处理额外的块(元数据)