首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用kissFFT与C++矢量?

如何正确使用kissFFT与C++矢量?
EN

Stack Overflow用户
提问于 2015-09-07 17:41:52
回答 1查看 3.6K关注 0票数 0

我希望在带有kissFFT的C++项目中使用std::vector来轻松处理任意长度的信号。为了实现这一点,我从“this SO answer”的作者那里编辑了kissFFT。我代替了

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++模板特性(不幸的是,对我来说太花哨了;我无法让它编译)。我的解决方案有什么缺点吗?

完整代码

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-07 23:14:28

我倾向于自己使用std::vector<kiss_fft_cpx>,但否则我的代码与您的代码基本相同。(为了避免内存泄漏,kiss_fft_allockiss_fft_free在ctor/dtor中使用,但这是一种风格。)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32443748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档