直接上代碼了
fft.c
- #include "math.h"
- #include "fft.h"
- //精度0.0001弧度
- void conjugate_complex(int n,complex in[],complex out[])
- {
- int i = 0;
- for(i=0;i<n;i++)
- {
- out[i].imag = -in[i].imag;
- out[i].real = in[i].real;
- }
- }
- void c_abs(complex f[],float out[],int n)
- {
- int i = 0;
- float t;
- for(i=0;i<n;i++)
- {
- t = f[i].real * f[i].real + f[i].imag * f[i].imag;
- out[i] = sqrt(t);
- }
- }
- void c_plus(complex a,complex b,complex *c)
- {
- c->real = a.real + b.real;
- c->imag = a.imag + b.imag;
- }
- void c_sub(complex a,complex b,complex *c)
- {
- c->real = a.real - b.real;
- c->imag = a.imag - b.imag;
- }
- void c_mul(complex a,complex b,complex *c)
- {
- c->real = a.real * b.real - a.imag * b.imag;
- c->imag = a.real * b.imag + a.imag * b.real;
- }
- void c_div(complex a,complex b,complex *c)
- {
- c->real = (a.real * b.real + a.imag * b.imag)/(b.real * b.real +b.imag * b.imag);
- c->imag = (a.imag * b.real - a.real * b.imag)/(b.real * b.real +b.imag * b.imag);
- }
- #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
- void Wn_i(int n,int i,complex *Wn,char flag)
- {
- Wn->real = cos(2*PI*i/n);
- if(flag == 1)
- Wn->imag = -sin(2*PI*i/n);
- else if(flag == 0)
- Wn->imag = -sin(2*PI*i/n);