C語言實現FFT算法

C語言實現FFT算法

fft1d.c和fft1d.h見
https://download.csdn.net/download/weixin_43216875/12009644

1. fft1d.h

#ifndef FFT1D_H
#define FFT1D_H

#include "math.h"

#define PI 3.1415926535897932384626433832795028841971

typedef struct complex //複數類型
{
  float real;		//實部
  float imag;		//虛部
}complex;

void conjugate_complex(int n,complex in[],complex out[]);
void c_plus(complex a,complex b,complex *c);//複數加
void c_mul(complex a,complex b,complex *c) ;//複數乘
void c_sub(complex a,complex b,complex *c);	//複數減法
void c_div(complex a,complex b,complex *c);	//複數除法
void fft(int N,complex f[]);//傅立葉變換 輸出也存在數組f中
void ifft(int N,complex f[]); // 傅里葉逆變換
void c_abs(complex f[],float out[],int n);//複數數組取模

#endif // FFT1D_H

2. main函數

#include <iostream>
using namespace std;

#include "fft1d.h"
#define N 4 //N取值爲2^n
int main()
{
    complex a[N];
    float b[N];

    for(int i=0;i<N;i++)
    {
       a[i].real = i+1;
       a[i].imag = 0;
    }

    cout << "data:" << endl;
    for(int i=0;i<N;i++)
       cout << a[i].real  << endl;

    fft(N,a);

    cout << endl << "fft:" << endl;
    for(int i=0;i<N;i++)
       cout << a[i].real << "+" << a[i].imag << "j" << endl;

    ifft(N,a);
    c_abs(a,b,N);

    cout << endl << "ifft:" << endl;
    for(int i=0;i<N;i++)
       cout << b[i] << endl;

    return 0;
}

3. 與Matlab對比

(1)C語言運行結果

在這裏插入圖片描述

(2)Matlab運行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章