gpt4 book ai didi

c++ - kiss_fftr 后接 kiss_fftri(窗口尺寸非常大)不返回输入信号

转载 作者:行者123 更新时间:2023-11-27 23:44:30 25 4
gpt4 key购买 nike

我在较短的音频片段(44100 * 14 个样本)和更长的音频片段(44100 * 60 * 6 个样本)之间执行互相关。据我了解,因此我无法对 FFT 进行窗口化。在测试 kiss_fftr 和 kiss_fftri 时,我发现逆运算返回的噪音很大(但它在节奏上仍然与输入相似)。我已确认我的输入音频是正确的,损坏仅发生在此函数中:

static std::vector<std::vector<float>> do_fft(std::vector<std::vector<float>> song, std::vector<std::vector<float>> loop)
{
loop[0].resize(kiss_fftr_next_fast_size_real(loop[0].size())); // TODO: resize this to song size instead of loop size when done testing
loop[1].resize(loop[0].size()); // TODO: make this dynamic

std::vector<std::vector<kiss_fft_cpx>> fft_loop;
std::vector<std::vector<float>> output;

for (int chan = 0; chan < loop.size(); chan++)
{
fft_loop.push_back(std::vector<kiss_fft_cpx>());
fft_loop[chan].resize(loop[chan].size());

output.push_back(std::vector<float>());
output[chan].resize(loop[chan].size()); // TODO: resize this to song size instead of loop size when done testing
}

kiss_fftr_cfg cfg_loop = kiss_fftr_alloc(loop[0].size(), 0, NULL, NULL);
kiss_fftr(cfg_loop, &loop[0][0], &fft_loop[0][0]);
kiss_fft_free(cfg_loop);

kiss_fftr_cfg cfgi_loop = kiss_fftr_alloc(fft_loop[0].size(), 1, NULL, NULL);
kiss_fftri(cfgi_loop, &fft_loop[0][0], &output[0][0]);
kiss_fft_free(cfgi_loop);

return output;
}

下面是输出与输入的对比: 放大显示细节:

如果您想了解内存,该程序是 64 位的,只使用几千兆字节的内存(几千兆,没什么大不了的 :P)

最佳答案

不同的 FFT 库使用不同的比例因子,和/或在其 FFT 和 IFFT 实现之间以不同方式分配比例因子。

kiss_fft 要求您在 fft/ifft 对期间或之间缩小 fft 的长度,以返回(大约在数字或舍入误差范围内)原始时域输入 vector 。

在您的情况下,这是一个相当大的比例因子,因为您的数据长度很大。

关于c++ - kiss_fftr 后接 kiss_fftri(窗口尺寸非常大)不返回输入信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51718476/

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