c - 使用 libsndfile 为 MATLAB 编写多 channel 音频

标签 c matlab libsndfile

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

以下代码写入 4 channel 交错 wav。 channel 1 上的所有样本应为 0.1, channel 2 上的所有样本应为 0.2, channel 3 上的所有样本应为 0.2...等等。

每个 channel 的长度为 44100 个样本。

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

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

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

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);
}

最佳答案

看起来您只是在错误情况下关闭输出文件(使用 sf_close())。输出文件不会是格式良好的 WAV 文件除非您在程序末尾调用 sf_close()。

关于c - 使用 libsndfile 为 MATLAB 编写多 channel 音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29678256/

相关文章:

c - 如何知道堆尾的地址?

c - 带双引号的宏

matlab - 用于照片的光学字符识别程序

matlab - 在 matlab 中打印选择性迭代

c++ - 库 "sf_readf_float"的函数 "sndfile.h"有问题

c - 无需查找即可写入的音频文件格式

c - 当一行中有 2 个分隔符时,将字符串拆分为 C 中的标记

创建/初始化共享内存中的对象(由mmap()打开)

email - 使用 matlab 接收电子邮件

c - 在波形文件上使用 KissFFT