kiss_fftr 后跟 kiss_fftri(具有非常大的 window 大小)不 return 输入信号
kiss_fftr followed by kiss_fftri (with very large window size) does not return the input signal
我在较短的音频片段(44100 * 14 个样本)和更长的音频片段(44100 * 60 * 6 个样本)之间表演 cross-correlation。据我了解,因此我无法 window 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 库使用不同的缩放因子,and/or在其 FFT 和 IFFT 实现之间分配缩放因子的方式不同。
kiss_fft 要求您在 fft/ifft 对期间或之间缩小 fft 的长度,以返回(大约在数字或舍入误差范围内)原始时域输入向量。
对于您的情况,这是一个相当大的比例因子,因为您的数据长度很大。
我在较短的音频片段(44100 * 14 个样本)和更长的音频片段(44100 * 60 * 6 个样本)之间表演 cross-correlation。据我了解,因此我无法 window 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 库使用不同的缩放因子,and/or在其 FFT 和 IFFT 实现之间分配缩放因子的方式不同。
kiss_fft 要求您在 fft/ifft 对期间或之间缩小 fft 的长度,以返回(大约在数字或舍入误差范围内)原始时域输入向量。
对于您的情况,这是一个相当大的比例因子,因为您的数据长度很大。