📄 fft1.cpp
字号:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define Num 8
double result[Num];
int s_r[Num],s_i[Num];
int s1_r[Num],s1_i[Num];
double pp=3.1415926;
//void local_carrier(int cos_freq[], int sin_freq[], int length, int local_carrier_ampli, const int carrier_center, const int freq_dif, const int sample_rate);
void FFT(int ir[],int ii[],int or1[],int oi1[])
{
int i,j=1,l;
double v_r,v_i,t_r,t_i;
double temp;
double w_r[3]={1,0,0.7071067};
double w_i[3]={0,-1,-0.7071067};
int le,lei,ip;
double or[8];
double oi[8];
for(i=0;i<8;i++)
{
or[i]=ir[i];
oi[i]=ii[i];
}
/*变址运算*/
/*
for(i=1;i<8;i++)
{
if(i<j)
{
t_r=or[j-1];
t_i=oi[j-1];
or[j-1]=or[i-1];
oi[j-1]=oi[i-1];
or[i-1]=t_r;
oi[i-1]=t_i;
}
k=4;
while(k<j)
{
j=j-k;
k=k/2;
}
j=j+k;
}
for(i=0;i<8;i++)
printf(" %f ",or[i]);
printf("\n");
*/
t_r=or[1];
t_i=oi[1];
or[1]=or[4];
oi[1]=oi[4];
or[4]=t_r;
oi[4]=t_i;
t_r=or[3];
t_i=oi[3];
or[3]=or[6];
oi[3]=oi[6];
or[6]=t_r;
oi[6]=t_i;
/*碟形运算*/
for(l=1;l<4;l++)
{ le=(1<<l);
lei =le/2;
v_r=1.0;
v_i=0.0;
for(j=0;j<lei;j++)
{
for(i=j;i<8;i=i+le)
{
ip=i+lei;
t_r=or[ip]*v_r-oi[ip]*v_i;
t_i=or[ip]*v_i+oi[ip]*v_r;
or[ip]=or[i]-t_r;
oi[ip]=oi[i]-t_i;
or[i]=or[i]+t_r;
oi[i]=oi[i]+t_i;
}
temp=v_r;
v_r=v_r*w_r[lei/2]-v_i*w_i[lei/2];
v_i=temp*w_i[lei/2]+v_i*w_r[lei/2];
}
}
for(i=0;i<8;i++)
{
or1[i]=or[i];
oi1[i]=oi[i];
}
return;
}
main()
{
int i=1;
/*方波*/
/*
for(i=0;i<Num+1;i++)
{
s_r[i]=0;
s_i[i]=0;
}
for(i=Num/2-10;i<Num/2+10;i++)
{
s_r[i]=10;
s_i[i]=0;
}
*/
/*正弦波*/
/*
for(i=0;i<Num;i++)
{
s_r[i]=68*sin(pp*i*0.5);
s_i[i]=0;
}
*/
/*郑脊蒙的波形*/
/*
int cos_[Num], sin_[Num];
local_carrier(cos_, sin_, Num, 10, 12, 0, 96);
for(i=0;i<Num;i++)
{
s_r[i]=cos_[i];
s_i[i]=0;
}
*/
/*冲击*/
/*
for(i=0;i<Num;i++)
{
s_r[i]=0;
s_i[i]=0;
}
s_r[0]=10;
*/
/*直流*/
/*
for(i=0;i<Num;i++)
{
s_r[i]=1;
s_i[i]=0;
}
*/
//变址测试用
/*
for(i=0;i<Num;i++)
{
s_r[i]=i;
s_i[i]=0;
}
*/
/*测试数据*/
for(i=0;i<Num;i++)
{
s_r[i]=i+1;
s_i[i]=0;
}
FFT(s_r,s_i,s1_r,s1_i);
for(i=0;i<Num;i++)
{
result[i]=sqrt(pow(s1_r[i],2)+pow(s1_i[i],2));
printf("%.0f", result[i]);
printf("\t"); printf("%d\t", i);
printf("%d\t%d",s1_r[i],s1_i[i]);
printf("\n");
}
}
/*
void local_carrier(int cos_freq[], int sin_freq[], int length, int local_carrier_ampli, const int carrier_center, const int freq_dif, const int sample_rate)
{
double phi=3.1415926;
int i=0;
int real_freq=carrier_center+freq_dif;
double sample_intervel=1.0/sample_rate;
double temple=phi*real_freq*sample_intervel;
for(i=0;i<length;i++)
{
cos_freq[i]=(local_carrier_ampli*cos(2*i*temple));
sin_freq[i]=(local_carrier_ampli*sin(2*i*temple));
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -