使用 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 编写多声道音频的主要内容,如果未能解决你的问题,请参考以下文章