⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft.c

📁 在LPC2368上实现的FFT程序
💻 C
字号:
//---------------------------------------------------------------------------


#include <stdio.h>
#include <math.h>
#define PI ((double)3.1415926)
#define N 	1024
#define r 	10
#define FS 	40000
#define F1  5000
#define F2  4900

float x[N];
float fftm[N];

void Fft()
{
	float Real,Ideal=0;
	unsigned int p=0;
	unsigned short i,j,k=0;
	unsigned short b=0;
	//float *fft_ideal;
	//fft_ideal=(float *)malloc(N*sizeof(float));	
   	float fft_ideal[N];
	for(i=0;i<N;i++)
	{
		fft_ideal[i]=0;
	}

	//蝶形运算
	for(k=0;k<r;k++)
	{
		for(j=0;j<(1<<k);j++)
		{
			b=(1<<(r-k));
			for(i=0;i<(b>>1);i++)
			{
				p=j*b;

				Real=fftm[i+p]-fftm[i+p+(b>>1)];
				Ideal=fft_ideal[i+p]-fft_ideal[i+p+(b>>1)];

				fftm[i+p]=fftm[i+p]+fftm[i+p+(b>>1)];
				fft_ideal[i+p]=fft_ideal[i+p]+fft_ideal[i+p+(b>>1)];
				fftm[i+p+(b>>1)]=(Real*cos(-(i*(1<<k))*PI*2/N))-(Ideal*sin(-(i*(1<<k))*PI*2/N));
				fft_ideal[i+p+(b>>1)]=(Ideal*cos(-(i*(1<<k))*PI*2/N))+(Real*sin(-(i*(1<<k))*PI*2/N));

			}
		}
	}

	for(j=0;j<N;j++)
	{											  
		p=0;
		for(i=0;i<r;i++)
		{
			if(j&(1<<i))
			{
				p+=(1<<(r-i-1));
			}
		}
		if(j<p)
		{
			Real=fftm[j];
			fftm[j]=fftm[p];
			fftm[p]=Real;

			Ideal=fft_ideal[j];
			fft_ideal[j]=fft_ideal[p];
			fft_ideal[p]=Ideal;
		}
		fftm[j]=sqrt((fftm[j]*fftm[j])+(fft_ideal[j]*fft_ideal[j]));
	}
	//free(fft_ideal);
}
int main(int argc, char* argv[])
{

    unsigned short i=0,k1=0,k2=0;
    float x1=0,x2=0;
	for(i=0;i<N;i++)
	{
		x[i]=5.0*sin(2.0*PI*i*F1/FS)+2.0*sin(2.0*PI*i*F2/FS);
		fftm[i]=x[i];
	}
	Fft();
    for (i=0;i<512;i++)
    {       
		if(fftm[i]>x1)
		{
            x2=x1;
            x1=fftm[i];
            k2=k1;
            k1=i;
        }
            //printf("%f\t%d\t",fftm[i],i);
            //if(i%3==0) printf("\r\n");
    }
        //printf("%d\t%d\r\n",k1,k2);
       // getchar();
        //return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -