【问题标题】:How to use kissFFT with C++ vector correctly?如何正确使用带有 C++ 向量的 KissFFT?
【发布时间】:2015-09-07 17:41:52
【问题描述】:

我想在带有std::vector 的 C++ 项目中使用 KissFFT 来轻松处理任意长度的信号。为了实现这一点,我编辑了来自 KissFFT 的作者的this SO answer。我换了

std::complex<float> x[nfft];

vector<std::complex<float>> x(nfft, 0.0);

并替换了函数调用

kiss_fft(fwd,(kiss_fft_cpx*)x,(kiss_fft_cpx*)fx)

kiss_fft(fwd,(kiss_fft_cpx*)&x[0],(kiss_fft_cpx*)&fx[0]);

这似乎工作得很好,但这是正确的方法吗?在kissFFT的“test”文件夹中,我找到了“testcpp.cc”,它似乎使用了一些花哨的C++模板功能(不幸的是,对我来说太花哨了;我无法编译它)。我的解决方案有什么缺点吗?


完整代码

#include "kiss_fft.h"
#include <complex>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    const int nfft=256;
    kiss_fft_cfg fwd = kiss_fft_alloc(nfft,0,NULL,NULL);
    kiss_fft_cfg inv = kiss_fft_alloc(nfft,1,NULL,NULL);

    vector<std::complex<float>> x(nfft, 0.0);
    vector<std::complex<float>> fx(nfft, 0.0);

    x[0] = 1;
    x[1] = std::complex<float>(0,3);

    kiss_fft(fwd,(kiss_fft_cpx*)&x[0],(kiss_fft_cpx*)&fx[0]);
    for (int k=0;k<nfft;++k) {
        fx[k] = fx[k] * conj(fx[k]);
        fx[k] *= 1./nfft;
    }
    kiss_fft(inv,(kiss_fft_cpx*)&fx[0],(kiss_fft_cpx*)&x[0]);
    cout << "the circular correlation of [1, 3i, 0 0 ....] with itself = ";
    cout
        << x[0] << ","
        << x[1] << ","
        << x[2] << ","
        << x[3] << " ... " << endl;
    kiss_fft_free(fwd);
    kiss_fft_free(inv);
    return 0;
}

【问题讨论】:

    标签: c++ vector kissfft


    【解决方案1】:

    我自己倾向于使用std::vector&lt;kiss_fft_cpx&gt;,但除此之外,我的代码与您的代码几乎相同。 (好吧,kiss_fft_allockiss_fft_free 进入 ctor/dtor 以避免内存泄漏,但这是一种风格。)

    再往下一点,fx[k] * conj(fx[k]) 是一个典型的数学表达式。使用fx[k].norm()效率更高。

    【讨论】:

    • 谢谢。但是我并没有真正得到答案的第一段。我试图解释到目前为止我得到了什么:kissFFT expexts 一个kiss_fft_cpx 向量,但在我的示例中它得到一个std::complex 向量。这在理论上可能会导致内存泄漏,但是由于kiss_fft_allockiss_fft_free 调用了某些东西的构造函数/析构函数(std::complex ???),因此在实践中不会有问题。
    • 另一个问题:fwd 和 inv 持有配置。如果我第二次使用一个配置,它会比第一次更快(因为已经计算了旋转因子或类似的东西)?
    • @Ergodicity:只要尝试一下,您可能会得到更快的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多