如何正确使用带有 C++ 向量的 kissFFT?
How to use kissFFT with C++ vector correctly?
我想在 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;
}
我自己倾向于使用 std::vector<kiss_fft_cpx>
,但除此之外我的代码与您的几乎相同。 (好吧,kiss_fft_alloc
和 kiss_fft_free
进入 ctor/dtor 以避免内存泄漏,但这是一种风格。)
再往下一点,fx[k] * conj(fx[k])
是一个典型的数学表达式。使用 fx[k].norm()
.
效率更高
我想在 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;
}
我自己倾向于使用 std::vector<kiss_fft_cpx>
,但除此之外我的代码与您的几乎相同。 (好吧,kiss_fft_alloc
和 kiss_fft_free
进入 ctor/dtor 以避免内存泄漏,但这是一种风格。)
再往下一点,fx[k] * conj(fx[k])
是一个典型的数学表达式。使用 fx[k].norm()
.