FFT快速傅里叶变化源码

// fft1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

// #include "pch.h"
#include <iostream>
#include <math.h>
#include <stdio.h>


#define N 64 //64点
#define log2N 6 //log2N=6
//复数类型
typedef struct
{
	float real;
	float img;
}complex;
complex  x[N] = 
{
{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},
{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},
{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},
{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},
{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},
{4,0},{1,0},{3,0},{2,0},{5,0}
}; //输入序列
//复数加法
complex add(complex a, complex b)
{
	complex c;
	c.real = a.real + b.real;
	c.img = a.img + b.img;
	return c;
}
//复数减法
complex sub(complex a, complex b)
{
	complex c;
	c.real = a.real - b.real;
	c.img = a.img - b.img;
	return c;
}
//复数乘法
complex mul(complex a, complex b)
{
	complex c;
	c.real = a.real*b.real - a.img*b.img;
	c.img = a.real*b.img + a.img*b.real;
	return c;
}
//码位倒序函数
void Reverse(void)
{
	unsigned int i, j, k;
	unsigned int t;
	complex temp;//临时交换变量
	for (i = 0;i < N;i++)//从第0个序号到第N-1个序号
	{
		k = i;//当前第i个序号
		j = 0;//存储倒序后的序号,先初始化为0
		for (t = 0;t < log2N;t++)//共移位t次,其中log2N是事先宏定义算好的
		{
			j <<= 1;
			j |= (k & 1);//j左移一位然后加上k的最低位
			k >>= 1;//k右移一位,次低位变为最低位
		}
		if (j > i)//如果倒序后大于原序数,就将两个存储单元进行交换(判断j>i是为了防止重复交换)
		{
			temp = x[i];
			x[i] = x[j];
			x[j] = temp;
		}
	}
}
complex  WN[N] =
{{1.00000,0.00000},{0.99518,-0.09802},{0.98079,-0.19509},{0.95694,-0.29028},
  {0.92388,-0.38268},{0.88192,-0.47140},{0.83147,-0.55557},{0.77301,-0.63439},
  {0.70711,-0.70711},{0.63439,-0.77301},{0.55557,-0.83147},{0.47140,-0.88192},
  {0.38268,-0.92388},{0.29028,-0.95694},{0.19509,-0.98079},{0.09802,-0.99518},
  {0.00000,-1.00000},{-0.09802,-0.99518},{-0.19509,-0.98079},{-0.29028,-0.95694},
  {-0.38268,-0.92388},{-0.47140,-0.88192},{-0.55557,-0.83147},{-0.63439,-0.77301},
  {-0.70711,-0.70711},{-0.77301,-0.63439},{-0.83147,-0.55557},{-0.88192,-0.47140},
  {-0.92388,-0.38268},{-0.95694,-0.29028},{-0.98079,-0.19509},{-0.99518,-0.09802},
  {-1.00000,0.00000},{-0.99518,0.09802},{-0.98079,0.19509},{-0.95694,0.29028},
  {-0.92388,0.38268},{-0.88192,0.47140},{-0.83147,0.55557},{-0.77301,0.63439},
  {-0.70711,0.70711},{-0.63439,0.77301},{-0.55557,0.83147},{-0.47140,0.88192},
  {-0.38268,0.92388},{-0.29028,0.95694},{-0.19509,0.98079},{-0.09802,0.99518},
  {0.00000,1.00000},{0.09802,0.99518},{0.19509,0.98079},{0.29028,0.95694},
  {0.38268,0.92388},{0.47140,0.88192},{0.55557,0.83147},{0.63439,0.77301},
  {0.70711,0.70711},{0.77301,0.63439},{0.83147,0.55557},{0.88192,0.47140},
  {0.92388,0.38268},{0.95694,0.29028},{0.98079,0.19509},{0.99518,0.09802}
};
void FFT(void)
{
	unsigned int i, j, k, l;
	complex top, bottom, xW;
	Reverse(); //码位倒序
	for (i = 0;i < log2N;i++)   /*共log2N级*/
	{ //一级蝶形运算
		l = 1 << i;//l等于2的i次方
		for (j = 0;j < N;j += 2 * l)  /*每L个蝶形是一组,每级有N/2L组*/
		{ //一组蝶形运算
			for (k = 0;k < l;k++)   /*每组有L个*/
			{ //一个蝶形运算
				xW = mul(x[j + k + l], WN[N / (2 * l)*k]); //碟间距为l
				top = add(x[j + k], xW); //每组的第k个蝶形
				bottom = sub(x[j + k], xW);
				x[j + k] = top;
				x[j + k + l] = bottom;
			}
		}
	}
}

int main()
{
	int i;

	FFT();
	for (i = 0;i < 64;i++)
	{
		printf("i is :%d real %f image %f\n",i,x[i].real,x[i].img);
	}




    std::cout << "成功输出\n"; 
}

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值