我正在尝试用音高校正输入的音频信号来实现一个程序。
我已经使用.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的帮助