如何在 C++ 上输出频谱快速傅立叶变换

问题描述

我正在使用 this 代码使用快速傅立叶变换 (FFT) 算法有效地计算离散傅立叶变换 (DFT),我是这个主题的新手,我真的不明白我该怎么做从fft得到输出后需要做的事情,基本上是8个点描述每一波。

我的最终目标是根据我写的样本点显示一个频谱

再说一次,我不是专家,我真的可以使用示例或文章,因为我在网上找到的所有数据都没有告诉我如何处理这些点来计算频谱。

FFT 代码

#include <iostream>
#include <complex>
#include <cmath>
#include <iterator>

using namespace std;

unsigned int bitReverse(unsigned int x,int log2n) {
    int n = 0;
    int mask = 0x1;
    for (int i = 0; i < log2n; i++) {
        n <<= 1;
        n |= (x & 1);
        x >>= 1;
    }
    return n;
}

const double PI = 3.1415926536;

template<class Iter_T>
void fft(Iter_T a,Iter_T b,int log2n)
{
    typedef typename iterator_traits<Iter_T>::value_type complex;
    const complex J(0,1);
    int n = 1 << log2n;
    for (unsigned int i = 0; i < n; ++i) {
        b[bitReverse(i,log2n)] = a[i];
    }
    for (int s = 1; s <= log2n; ++s) {
        int m = 1 << s;
        int m2 = m >> 1;
        complex w(1,0);
        complex wm = exp(-J * (PI / m2));
        for (int j = 0; j < m2; ++j) {
            for (int k = j; k < n; k += m) {
                complex t = w * b[k + m2];
                complex u = b[k];
                b[k] = u + t;
                b[k + m2] = u - t;
            }
            w *= wm;
        }
    }
}

int main() {
    typedef complex<double> cx;
    cx a[] = { cx(1,0),cx(3,cx(5,cx(7,cx(9,cx(11,cx(13,cx(15,0) };
    cx b[8];
    fft(a,b,3);
    for (int i = 0; i < 8; ++i)
        cout << b[i] << "\n";
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)