C++ kiss_fftr后跟kiss_fftri(具有非常大的窗口大小)不会返回输入信号

C++ kiss_fftr后跟kiss_fftri(具有非常大的窗口大小)不会返回输入信号,c++,signal-processing,kissfft,C++,Signal Processing,Kissfft,我正在执行音频44100*14样本的较短片段和音频44100*60*6样本的较长片段之间的互相关。据我所知,我不能窗口的FFT,因为这一点。在测试kiss_fftr和kiss_fftri时,我发现反向操作返回的噪声很大,但它仍然与输入有节奏地相似。我已确认我的输入音频是正确的,损坏仅发生在此函数中: static std::vector<std::vector<float>> do_fft(std::vector<std::vector<float>&g

我正在执行音频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位的,只使用了几GB的ram,只有几GB,没什么大不了的:不同的FFT库使用不同的比例因子,和/或在FFT和IFFT实现之间分配不同的比例因子

kiss_fft要求您在fft/ifft对期间或之间按fft的长度缩小,以在数值或舍入误差范围内大致返回原始时域输入向量


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

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

kiss_fft要求您在fft/ifft对期间或之间按fft的长度缩小,以在数值或舍入误差范围内大致返回原始时域输入向量


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

输入中的静默位似乎被放大了。似乎是一个缩放问题。这是在kissfft自述文件中调用的,它不方便地取决于kissfft内部使用的值类型。输入中的静默位似乎被放大了。似乎是一个缩放问题。这是在kissfft自述文件中调用的,它不方便地取决于kissfft内部使用的值类型。谢谢!我不敢相信我没有注意到输出只在过零时出现。嗨,罗纳德!我想在另一个问题上再问你一次。这是一个与基斯福德有关的问题。你介意看一下吗。谢谢我不敢相信我没有注意到输出只在过零时出现。嗨,罗纳德!我想在另一个问题上再问你一次。这是一个与基斯福德有关的问题。你介意看一下吗。