快速傅里叶变换(FFT)c语言实现

本文介绍了一种使用C语言实现快速傅里叶变换(FFT)的方法,确保输入数据个数为2的幂,不足部分用0填充。代码示例展示了如何进行FFT计算,结果与Matlab一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  快速傅里叶变换(FFT)c语言实现:(参考:FFT多种编程语言实现)。注意:输入数据个数必须为2的n次方,数据不够可以用0补齐。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define PI 3.14159265358979

typedef struct Complex
{
   double real;
   double image;
} CPLX;

void _fft(CPLX buf[], CPLX out[], int n, int step)
{
   int i;
   CPLX t;
   double a, b, c, d, theta;

   if (step < n) 
   {
   	_fft(out, buf, n, step * 2);
   	_fft(out + step, buf + step, n, step * 2);

   	for (i = 0; i < n; i += 2 * step) 
   	{
   		theta = -PI * i / n;
   		a = cos(theta);
   		b = sin(theta);
   		c = out[i + step].real;
   		d = out[i + step].image;
   		t.real = a * c - b * d;
   		t.image = b * c + a * d;
   		buf[i / 2].real = out[i].real + t.real;
   		buf[i / 2].image = out[i].image + t.image;
   		buf[(i + n) / 2].real = out[i].real - t.real;
   		buf[(i + n) / 2].image = out[i].image - t.image;
   	}
   }
}

int fft(CPLX buf[], int n)
{
   int i;
   CPLX *out = (CPLX *)malloc(n * sizeof(CPLX));
   if (out == NULL)
   {
   	return 0;
   }

   for (i = 0; i < n; i++)
   {
   	out[i].real = buf[i].real;
   	out[i].image = buf[i].image;
   }

   _fft(buf, out, n, 1);

   free(out);
   out = NULL;
   return 1;
}

int main()
{
   #define COUNT 8
   CPLX buf[COUNT] = { {1.0, 0.0}, {1.0, 0.0}, {1.0, 0.0}, {1.0, 0.0},
   	                {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0} ,{0.0, 0.0} }; //实向量[1, 1, 1, 1, 0, 0, 0, 0]
   fft(buf, COUNT);

   for (int i = 0; i < COUNT; i++)
   {
   		if (buf[i].image >= 0.0)
   		{
   			printf("%.4f + %.4fi\n", buf[i].real, buf[i].image);
   		}
   		else
   		{
   			printf("%.4f - %.4fi\n", buf[i].real, fabs(buf[i].image));
   		}
   	}
   return 0;
}

  计算结果与matlab的完全一致。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值