FFT蝶形算法,IFFT

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

// ConsoleTemplate.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
 

#include <stdio.h>
#include <math.h>
#define N 8//1024//
#define M 3////10
#define PI 3.1415927
typedef struct comp_number
{
 double real;
 double img;
}comp_num;
int reverse(int p)
{
 int i,t=0;
 for(i=M-1;i>=0&&p;i--)
 {
  t+=(p%2)<<i;
  p/=2;
 }
 return t;
}
//复数相乘
comp_num comp_multy(comp_num a,comp_num b)
{
 comp_num c;
 c.real=a.real*b.real-a.img*b.img;
 c.img=a.real*b.img+a.img*b.real;
 return c;
}
//复数相加
comp_num comp_add(comp_num a,comp_num b)
{
 comp_num c;
 c.real=a.real+b.real;
 c.img=a.img+b.img;
 return c;
}
//复数相减
comp_num comp_minus(comp_num a,comp_num b)
{
 comp_num c;
 c.real=a.real-b.real;
 c.img=a.img-b.img;
 return c;
}
//comp_adjoint复数共轭
comp_num comp_adjoint(comp_num a )
{
 comp_num c;
 c.real=a.real;
 c.img= -a.img;
 return c;
}

void FFT( comp_num xt[N], comp_num cur_x[N], comp_num nex_x[N]);
void IFFT( comp_num xt[N], comp_num cur_x[N], comp_num nex_x[N]);

//int main(void)
int _tmain(int argc, _TCHAR* argv[])
{
 
 comp_num xt[N],cur_x[N],nex_x[N];
 comp_num W,sec;//蝶形运算的第二部分
 int i,j,k;
 int t,wn;
 double x;
 //初始化原始信号数据
 for(i=0;i<N;i++)
 {
  xt[i].real= 0.001*(i+1);//cos( 2* PI* 100* i)/**/;
  xt[i].img= 1;//0.0;
 }
 printf( "/n原结果:/n");

 for(i=0;i<N;i++)
 {

  if(xt[i].img>=0)
   printf("%lf+%lfi/n",xt[i].real,xt[i].img);
  else
   printf("%lf%lfi/n",xt[i].real,xt[i].img);
 }

 
 //FFT变换
 FFT( xt,cur_x, nex_x);
 
 printf( "/nFFT结果:/n");

 for(i=0;i<N;i++)
 {

  if(cur_x[i].img>=0)
   printf("%lf+%lfi/n",cur_x[i].real,cur_x[i].img);
  else
   printf("%lf%lfi/n",cur_x[i].real,cur_x[i].img);

  //为IFFT铺垫,保存
  nex_x[ i]=cur_x[ i];
 }
 
 //FFT逆变换
 IFFT( nex_x,cur_x, nex_x);
 

 //cout<<"/nIFFT还原结果/n";
 printf( "/nIFFT还原结果/n");
 for(i=0;i<N;i++)
 {
  
  if(cur_x[i].img>=0)
   printf("%lf+%lfi/n",cur_x[i].real,cur_x[i].img);
  else
   printf("%lf%lfi/n",cur_x[i].real,cur_x[i].img);
 }

 
 scanf("%f", i);
 return 0;
}

//FFT蝶形算法
//xt为原数据,cur_x为最后所求的数据,nex_x为中间变量
void FFT( comp_num xt[N], comp_num cur_x[N], comp_num nex_x[N])
{
 int i,j,k;
 int t,wn;
 double x;
 comp_num W,sec;//蝶形运算的第二部分

 //调整数据顺序
 for(i=0;i<N;i++)
 {
  j=reverse(i);//反向进位法
  cur_x[j]=xt[i];
 }

 //FFT
 for(i=0;i<M;i++)
 {
  t=1<<i;//间隔
  wn=t*2;//计算W变量
  for(j=0;j<N/wn;j++)
  {
   for(k=0;k<t;k++)//连续加号个数
   {
    x=2*PI*k/wn;
    W.real=cos(x);W.img=-sin(x);
    sec=comp_multy(W,cur_x[j*wn+t+k]);
    nex_x[j*wn+k]=comp_add(cur_x[j*wn+k],sec);
    nex_x[j*wn+t+k]=comp_minus(cur_x[j*wn+k],sec);
   }
  }
  for(j=0;j<N;j++)
   cur_x[j]=nex_x[j];
  
 }
}
//IFFT:调用FFT
//xt为原数据,cur_x为最后所求的数据,nex_x为中间变量
void IFFT( comp_num xt[N], comp_num cur_x[N], comp_num nex_x[N])
{
 int i;
 for(i=0;i<N;i++)
 {
  nex_x[ i]=comp_adjoint( xt[ i]);
 }

 FFT( nex_x,cur_x, nex_x);

 for(i=0;i<N;i++)
 {
  cur_x[ i]=comp_adjoint( cur_x[ i]);
  cur_x[i].real /= N; cur_x[i].img /= N;
 }
}

快速傅立叶变换(FFT)算法(原来这就是蝶形变换) 快速傅立叶变换(FFT)算法(原来这就是蝶形变换) 为了实现FFT的海面模拟,不得不先撸个FFT算法实现。 离散傅立叶变换(DFT) 学习FFT之前,首先要先了解什么是DFT,我们都知道傅立叶变换是将时域转换为频域。但是我们计算机是没办法处理连续的点,因此就有了离散傅立叶变换DFT。 标准DFT公式: 我们令: W的一些性质 证明: 证明方法同... 阅读详情

相关推荐

C语言实现FFTIFFT,并MATLAB编写显示的结果相对比,进行验证(蝶形运算

本次实验中在Microsoft Visual Studio 2010环境下编写,实现FFTIFFT,并用MATLAB编写显示的结果,两者相对比,进行验证。 #include “stdafx.h” #include #include<math.h> #include const double pi=3.14159265357; #include using namespace std...

Xie_01的博客 2591

ifft.rar_FFT ifft 蝶形_fft_fft ifft_ifft

fft蝶形算法的逆变换,用c++编写,用循环计算实现

举例解析FFT算法

简单来说,傅里叶变换是将时域信号转换为频域信号的信号处理方法。本章会带大家熟悉理解DFT(离散傅里叶变换)、旋转因子特性、FFT(快速傅里叶变换)并举例验证。

weixin_56892602的博客 2914

fft快速傅里叶变换蝶形算法详解_fft

fft快速傅里叶变换蝶形算法详解,非常详细

数字信号处理翻转课堂笔记10——快速傅立叶变换算法FFT)&1~4章综合题目

快速傅里叶变换算法FFT)+1~4章综合题目

WM2101的博客 1万+

利用C语言实现FFTIFFT运算

一、FFTIFFT算法实现 上述分别为FFTIFFT公式。下面首先讨论FFT算法实现。本文采用输入逆序、输出顺序的FFT计算方法。**实质上就是在时域对x(n)进行“奇偶分类”、在频域上对X(k)进行“前后分类”。**值得说明的是,这里的“奇”和“偶”是相对的概念,并不完全是通常我们所理解的“奇”和“偶”。下面将给出一个例子进行说明: ...

mddh_123的博客 1万+

python实现FFTIFFT

利用蝶形算法实现fft,以及ifft:我的算法还不太完整,只能输入图片长宽为2**n的图片,要改进只需要根据输入的长宽进行补0,使得长宽都为2的整数倍: import math import cv2 as cv import numpy as np from matplotlib import pyplot as plt # 复数类 class complex: def __init__(...

yiyechzh的博客 6591

C++实现FFTIFFT:信号处理的利器

C++实现FFTIFFT:信号处理的利器 去发现同类优质开源项目:https://gitcode.com/ 在数字信号处理领域,快速傅里叶变换(FFT)和快速傅里叶逆变换(IFFT)是不可或缺的核心工具。今天,我们将介绍一个使用C++语言实现的FFTIFFT开源项目,帮助您轻松集成这一功能,提升项目性能。 项目介绍 C++ 实现FFTIFFT项目是一个开源的代码库,提供快速傅里叶变换和其逆变...

gitblog_06705的博客 921

快速傅里叶变换及其反变换FFTIFFT C++实现:科学计算的新锐助手

快速傅里叶变换及其反变换FFTIFFT C++实现:科学计算的新锐助手 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 快速傅里叶变换(FFT)及其反变换(IFFT)的C++实现。 项目介绍 在现代科学计算和信号处理领域,快速傅里叶变换(FFT)是一种核心算法,它能够高效地将信号从时域转换到频域。本文将为您详细介绍一款开源的FFTIFFT C++实现项目,...

gitblog_06789的博客 703

FFTIFFT的C语言实现:让快速傅里叶变换触手可及

FFTIFFT的C语言实现:让快速傅里叶变换触手可及 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代数字信号处理领域,快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)是两项核心的计算技术。FFT能够将信号从时域转换到频域,从而进行更高效的信号分析和处理。而IFFT则可以将频域信号转换回时域,完成信号处理的完整流程。今天,我们将为您推荐一个基于C语言的FF...

gitblog_06799的博客 313

Radix-4 FFT IFFT inverse FFT 基4 的FFT python 版本

Radix-2 FFT 网上的资源很多,但是Radix-4 FFT的资源很少,我只找到一个C++版本的,而且网上几乎没有 IFFT 的代码。 我实现了一个python版本的Radix-4,包括正变换,和反变换,方便理解和学习。 其中第一个版本的复杂度更低,第二个版本更方便理解。 建议先从第二个版本看起。 最好是先理解Radix-2 FFT再学习Radix-4的版本,Radix-2 FFT是普通的碟...

Maxwave13的博客 2381

递归式FFT

递归式FFT N点有限长序列x(n)                 递归式FFT变换方法:   FFT函数: 快速傅立叶变换  //数组a为输入,数组y为输出,2的power次方为数组的长度  void ImageProcess::fft(const complex a[], complex y[], int power)  {  if(0 == power

2248

音频格式编解码原理介绍

音频压缩格式一般分为有损压缩和无损压缩,常见的有损压缩格式有MP3、AAC、AC3和OPUS等,常见的无损压缩格式由flac和alac。PCM为原始采样数据,其实也可算作是无损数据。由于原始采样的数据,数据量太大,从而存在存储占用空间太大、网络传输带宽压力过大,无法满足嵌入式小设备播放等问题,因此需要对原始的PCM数据进行压缩。

qazwsxwtc的专栏 357

基于C++任意点数的FFTIFFT(时域和频域)实现

函数说明:更改主函数体中的N和length(=log2(N))既可以实现任意点数(2的幂次)的FFT/ IFFT的实现,fft函数中flag标志位控制是正变换还是逆变换。 1.复数操作类 定义复数类,重载复数四则运算符号,重载输出运算符,重载赋值运算符。 /**********预编译文件头文件complex.h********/ #include"i...

weixin_33911824的博客 1135

FFT源代码

 源码表示编辑 在C环境下的源码 源码(1): 注:亲测,这个版本无法运行,作者删改了重要内容[1] 请参考源码(2) //快速傅立叶变换 // 入口参数: // l: l=0, 傅立叶变换;l=1, 逆傅立叶变换 // il: il=0,不计算傅立叶变换或逆变换模和幅角;il=1,计算模和幅角 // n: 输入的点数,为偶数,一般为32,64,128,...,1024等

jwy2014的专栏 2590

FFT算法的完整DSP实现

傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm       The Scientist and Engineer's Guide to Digital Signal Processing,   By Steven W. Smith, Ph.D. [2] http://blog.csdn.net/v_JULY_v/articl

傅斯年的写字台 1621

FFT算法

FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm       The Scientist and Engineer's Guide to Digital Signal Processing,   By Steven W. Smith, Ph.D. [2] http://blog.c

唯有努力无限,才可突破极限 1821

特征变换(1)傅里叶变换

一维快速傅里叶变换反变换 /************************************************************************* * * \函数名称: * FFT_1D() * * \输入参数: * complex<double> * pCTData - 指向时域数据的指针,输入的需...

weixin_34281537的博客 284
上一篇: glut基本程序+旋转的四边形
下一篇: ScrollWindow滚动窗口,有动态按钮,且主窗口很大,主窗口有滚动条
tmljs1988
博客等级 码龄19年 134粉丝 107原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值