使用libsndfile覆盖.wav文件的幅度值

时间:2017-03-15 21:08:56

标签: c++ audio libsndfile

我正在尝试用音高校正输入的音频信号来实现一个程序。

我已经使用.wav文件,使用自相关来每0.04秒找到一个信号周期。我现在有一个振幅点阵列,每隔0.04s取信号的周期长度,并重复这些值,直到下一个0.04s。 (我知道信号尚未拉伸,这是最后一步)。

如何使用libsnd文件将这些值写回原始.wav文件以便可以播放?

我尝试过类似的事情:

SF_INFO sfinfo;
sfinfo.frames;

const char* path = "Vocal3.wav";

SNDFILE * outfile = sf_open(path, SFM_WRITE, &sfinfo);

for (k = 0; k < num; ++k) {
    sf_count_t count = sf_write_float(outfile, &array[k], num);
    sf_write_sync(outfile);
}
sf_close(outfile);

但它会创建一个无法打开的0字节的.wav文件。我是否必须从头开始创建wav文件?这是否意味着创建标题?关于如何做到这一点的一些指示将非常感激。

编辑:

我现在认为我更了解libsndfile的语法,我尝试了类似的东西:

SF_INFO sfinfo;
SNDFILE* outfile;
outfile = sf_open(filename, SFM_RDWR, &sfinfo);
sf_count_t count = sf_writef_float(outfile, array, sfinfo.frames);
const char* error = sf_strerror(outfile);
std::cout << error << "\n";
sf_close(outfile);

它不会覆盖文件,而是将新的幅度值附加到原始文件。有没有办法删除原始值?

编辑2:

可以使用搜索功能删除原始文件 - http://www.mega-nerd.com/libsndfile/api.html#seek - 感谢Matthias的帮助

0 个答案:

没有答案