gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:38:17 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com