关于FFT快速傅里叶变换

十分简明易懂的FFT(快速傅里叶变换) FFT有什么用 快速傅里叶变换 (fast Fourier transform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。 FFT(Fast Fouri... 阅读详情

前一段时间荒废掉了……一直在纠结zkw大牛的数学归纳法的论文……结果看不懂……


一直很纠结FFT是怎么实现的

一直以为FFT是很巧妙的利用数论之类的东西做,所以每次看到这方面的资料就蛋疼,因为一般都画了个坐标系,然后就懵了……


昨天晚上无聊翻算导看到FFT这一章,就把它学了,发现算导有的时候讲细一点还是有好处的,至少看得懂……


首先要明确的一点是FFT是用来求多项式相乘的,高精度乘法只是其中一种应用而已(把基看做多项式中的x)

那么大致过程是多项式的系数表示->DFT(O(nlogn))->多项式的点值表示->相乘(O(n))->DFT逆变换(O(nlogn))->得到相乘后的多项式系数表示

一直到省选之前应该都比较忙……具体细节以后再来补好了……


我用了complex类,代码参考自7k+……//今天才知道有complex类……

要注意的是就算complex使用的是double(应该说正因为使用的是double……),基不能选的很大

在贡献了若干次wa以后得到的结论是基最好是100000,再高就会爆精度,哪怕用long double也是一样……

http://61.187.179.132/JudgeOnline/problem.php?id=2179

FFT模板题


//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<climits>

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<complex>
using namespace std;
//Macro
#define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
#define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
#define erep(i,e,x) for(int i=x;i;i=e[i].next)
#define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define read() (strtol(ipos,&ipos,10))
#define sqr(x) ((x)*(x))
#define pb push_back
#define PS system("pause");
typedef long long ll;
typedef pair<int,int> pii;
typedef complex<long double> comp;
const int oo=~0U>>1;
const double inf=1e20;
const double eps=1e-6;
const double pi=acos(-1.0);
string name="fft",in=".in",out=".out";
const int maxn=131073;
const comp I=comp(0,1);
const int limit=100000;
//Var
comp A[maxn],B[maxn],C[maxn];
int base[10],len,n,la,lb;
long double d;
char s[100000];
void Getnum(comp num[],int &ln)
{
	scanf("%s",s);
	for(int i=len-1;i>=0;i-=5)
	{
		num[ln]=s[i]-'0';
		rep(j,1,4)if(i>=j)num[ln]=num[ln].real()+(s[i-j]-'0')*base[j];
		ln++;
	}
}
void FFT(comp num[],long double root)
{
	comp w,x;int i,j,k,m,h;
	for(m=n;h=m/2,m>=2;m=h,root*=2)
		for(i=0;i<h;i++)
			for(w=exp(i*root*I),j=i;j<n;j+=m)
				k=j+h,x=num[j]-num[k],num[j]+=num[k],num[k]=w*x;
	for(i=0,j=1;j<n-1;j++)
	{
		for(k=n/2;k>(i^=k);k/=2);
		if(j<i)swap(num[i],num[j]);
	}
}
void Init()
{
	base[0]=1;rep(i,1,4)base[i]=base[i-1]*10;
	scanf("%d",&len);
	Getnum(A,la);Getnum(B,lb);
}
void Work()
{
	for(n=1;n<la+lb;n<<=1);
	FFT(A,2*pi/n);
	FFT(B,2*pi/n);
	rep(i,0,n-1)C[i]=A[i]*B[i];
	FFT(C,-2*pi/n);
	rep(i,0,n-1)
	{
		C[i]=C[i].real()/n;
		C[i]=C[i].real()+d;
		d=(int)(C[i].real()/limit);
		C[i]=C[i].real()-d*limit;
		if(C[i].real()>99999.9)C[i]=0.0,d++;
		if(C[i].real()<0.1)C[i]=0.0;
	}
	n--;while(n>=0&&fabs(C[n].real())<eps)n--;
	printf("%d",(int)(C[n].real()+0.5));
	drep(i,n-1,0)printf("%05d",(int)(C[i].real()+0.5));
	puts("");
}
int main()
{
//	freopen((name+in).c_str(),"r",stdin);
//	freopen((name+out).c_str(),"w",stdout);
	Init();
	Work();
//	PS;
	return 0;
}



快速傅里叶变换学习(超详细,附代码实现) 在学习快速傅里叶变换之前,我们首先需要了解傅里叶变换。傅里叶变换,是将信号从时域的表现形式换成频域上的表现形式。如下面的正弦波: 阅读详情

相关推荐

基于python的快速傅里叶变换FFT(一)

基于python的快速傅里叶变换FFT(一) FFT可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。 知识点 1、FFT——离散傅里叶变换(DFT)的快速算法。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变...

赵至柔的博客 5万+

快速傅里叶变换——FFT

2,用一个公式来表示一下,这个公式的意义就是用来分解信号的,因为之前说FFT使用一个个正弦波来表示时域信号的,所以我们要确定正弦信号和时域信号的相关性,并且这个正弦波也要匹配块长度。上面的这个图就是加上传函数之后出现的FFT频谱图,但是可以看到激波的Bin比较宽,出现这个线性的原因是因为和快长度有关,如果提高块长度,那么分辨率就会变高,那么就会出现一个比较窄的Bin。其中,块长度也就是样本的数量跟FFT采集的周期有直接的关系,块长度对频率分辨率有直接的影响,假设采样的频率是48kHZ,块长度是512。

upupyon996deqing的博客 2万+

C++实现一维快速傅里叶变换(FFT)

当一维信号长度达到几十万个信号时,当前主流4G主频CPU完成一次傅里叶变换需要约几十到几百秒的时间,这样的效率显然是让人无法接受的。 为了解决傅里叶变换的计算效率问题,行业专家们提出了蝶形算法,极大地提升了傅里叶变换的运算效率。 在蝶形算法中,较为流行的是基于时间抽取的基-2快速傅里叶变换算法(以下简称为基-2FFT算法)。

ShadowN1ght的博客 2万+

【数论系列】 快速傅里叶变换 FFT算法

通俗点来说,FFT就是利用某些奇偶特点,进行DFT(离散傅里叶变换)和IDFT(离散傅里叶逆变换)的快速求解算法。

这里是阿安的博客 1万+

快速傅里叶变换(FFT)算法学习

算法的世界多么广大,我们可以将算法大致分为两类:第一类是较为有用的算法:比如一些经典的图算法,像 DFS 和 BFS(深度 / 广度优先算法),这些算法应用在很多方面,他们非常高效, 第二类算法是那些极具美感的算法:例如当我们第一次看到汉诺塔的递归实现算法时的状态,你肯定会觉得这个算法贼牛逼,甚至会被它的美感所震撼到,但这些算法或许并没有那么有用或者高效,不过我们还是会研究它,就像没事干了我们还是会看小说; 这些伟大而精妙的算法会激发我们的灵感,促使我们发散性思考,下面介绍一种同时属于以上两类的算法:快速傅

W_Oilpicture的博客 8771

快速傅里叶变换(FFT)

傅里叶级数(FS)傅里叶变换(FT)离散时间傅里叶级数(DFS)离散时间傅里叶变换(DTFT)离散傅里叶变换(DFT)建议先看以上文章FFT是DFT的一种快速算法而不是一种新的变换,它可以在数量级的意义上提高运算速度。

DGY_ChenYong的博客 3589

MATLAB——FFT(快速傅里叶变换)

MATLAB——快速傅里叶变换

m0_46155417的博客 8万+

Matlab快速傅里叶变换程序(FFT)编写

Matlab快速傅里叶变换程序(FFT)编写 (不利用Matlab内置fft) 最近在学习数字信号处理,正好到快速傅里叶变换,写一个基于基2FFT算法的傅里叶变换。利用原理:DIT-FFT(时域抽取法基2FFT)。 DIT-FFT: 设序列x(n)的长度为N,且满足N=2^M,M为自然数。 ①按n的奇偶把x(n)分解为两个N/2的子序列。 ②对x(n)做DFT,经过化简可以得到 X(k)=X1(k...

grace_fight的博客 4万+

MATLAB快速傅里叶变换(fft)函数详解

转载:https://blog.youkuaiyun.com/me4weizhen/article/details/53688848 定义: The 'i' in the 'Nth root of unity' 是虚数单位 ​调用: ​​1. Y = fft(y); 2. Y = fft(y,N); 式中,y是序列,Y是序列的快速傅里叶变换。y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。 说明: 1. 函数fft...

modi000的博客 4万+

快速傅里叶变换FFT

摘要 0.1 FFT: 快速傅里叶变换是一种降低离散傅里叶变换计算复杂度的算法。 0.2 关键词: FFT(快速傅里叶变换),DFT(离散傅里叶变换) 0.3 注意: DFT(离散傅里叶变换)与DTFT(离散时间傅里叶变换)是不一样的,DTFT可以当做是有无限个采样点,而DFT是对采样信号取一部分(windowing)进行变换的。 对DFT的一种理解(interpretation): DFT指代将N个时域信号采样点转换为N个频域信号采样点。 DFT 1.1 DFT计算公式: 1.2 DFT的矩阵表示方

Baron_wu的博客 2166

快速傅里叶变换(Fast Fourier Transform,FFT)

快速傅里叶变换(Fast Fourier Transform,FFT)是一种算法,用于快速计算离散傅里叶变换(DFT)及其逆变换。傅里叶变换将时间或空间域的信号转换为频率域的信号,便于分析信号的频率特性。FFT显著提高了计算效率,将计算复杂度从On2降低到Onlogn。

幼儿园大哥~ 3396

FFT(快速傅里叶变换)

FFT 1. FFT原理 原理 FFT(Fast Fourier Transformation),中文名快速傅里叶变换,用来加速多项式乘法。 朴素高精度乘法时间复杂度是O(n2)O(n ^ 2)O(n2),n是数据位数;但FFT能在O(n×log(n))O(n \times log(n))O(n×log(n))的时间内解决。 假设给定一个多项式: A(x)=a0+a1x+a2x2+...an−1xn−1 A(x) = a_0 + a_1 x + a_2 x^2 + ... a_{n-1}

weixin_42638946的博客 1万+

数字信号处理——Python实现快速傅里叶变换FFT

1、FFT背景 快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的快速算法,它是根据离散傅里叶的奇、偶、虚、实等特性,在DFT的基础上进行改进获得的。它对傅里叶变换的理论没有新的发现,但它的出现让离散傅里叶变换在计算机系统中得到了广泛的应用。 设x(n)为N项的复数序列,对其进行DFT,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,因此要求出N项复序列的X(m),大约需要N2N^2N2次运算。当N逐渐增大时,运算量将呈指数式增长,这在实际应用中是一场灾难。而在FFT中,利用WNW_NWN​的周期

我本傲骄的博客 4940

快速傅里叶变换np.fft.fft的使用

np.fft.fft进行快速傅里叶变换,需要特别注意的是,默认是对最后个维度的数据进行fft变换,若你输入的是一维数组,请忽略后面,如果你是二维列矢量,如果不将数据变为行矢量或将axis参数设为0,将得到与输入相同的结果,导致后续的计算无缘无故出错。 二话不说,直接上代码,产生一个正弦信号,并对其进行fft变换,对应的频率点可通过np.fft.fftfreq计算得到,需要输入的两个参数分别是FFT的长度和采样时间间隔。 需要注意的是fft计算出来的幅度一般与真实的是不一样的,在ifft中会考虑这个因素,

txh3093的博客 3万+

DFT的matlab源代码-ex_fft:Elixir的FFT(快速傅立叶变换)库(不是FINALFANTASYTACTICS)

DFT的matlab源代码汇出 Elixir的FFT(快速傅立叶变换)库 安装 如果包可以通过添加安装ex_fft你在依赖列表mix.exs : def deps do [ { :ex_fft , " ~> 0.2.0 " } ] end 可以使用生成文档并在上发布文档。 发布后,可以在上找到这些文档。 如果要与DFT比较,请访问ex_fft_test.exs ,复制dft函数,将其粘贴到ex_fft.ex ,然后运行iex -S mix

Paypal开发者中心获取“ClientId”和“ClientSecret”参数

正式环境设置 1、登录到 paypal开发者中心 网址:https://developer.paypal.com/developer/ 点击右上角登录按钮登录 2、左侧栏 - 我的应用程序和凭证 - 点击“创建新应用” 新注册的paypal账号,需要进行邮箱验证,验证通过后,需要等待一段时间(或重新登录),才会出现相关设置项位置 验证邮箱通过后,点击创建新应用 3、按提示填写,保存创建应用 4、点击刚创建的应用进入应用详情页 5、应用详情页获得网站开发人员所需要的“ClientId”和“Client

龚清林的博客 1万+

数字信号处理之 快速傅里叶变换(FFT)

快速傅里叶变换(FFT)并不是与DFT不同的另一种变换,而是为了减少计算次数的一种快速有效的算法。将基-2和基-4分解揉合在一起,提出一种分裂基FFT算法。以此二分法继续下分,可得到一个按级分解的“按时间抽取法”。基-2算法、基-4算法、基-8算法、混合基算法。着重讨论算法原理,并提供了实现算法的详细细节。为2的整数幂的FFT,也称基-2FFT。,上述的FFT算法皆可直接用来运算IDFT。直接算法对FFT算法的计算时间之比近似为。DIT算法的输入是反序,输出是正序的。,则有两个快速傅里叶变换的方法。

mohen_777的博客 2959

强化学习-动态规划

动态规划(dynamic programming)是程序设计算法中非常重要的内容,能够高效解决一些经典问题,例如背包问题和最短路径规划。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。动态规划会保存已解决的子问题的答案,在求解目标问题的过程中,需要这些子问题答案时就可以直接利用,避免重复计算。本章介绍如何用动态规划的思想来求解在马尔可夫决策过程中的最优策略。

qq_45481856的博客 2113

快速傅里叶变换——FFT C语言实现

FFT原理及C语言实现

l13527971021的博客 3980

SD--根据订单创建出库单(相关的函数列表的介绍系列篇(2))

创建订单样例代码参见:http://blog.youkuaiyun.com/CompassButton/archive/2007/05/09/1601712.aspx 可以根据一个订单或者部分订单项来创建出库单,代码如下:* Populating the item data lx_sales_item-ref_doc = l_vbeln. lx_sales_item-ref_item = c_000010

SAP BLOG--Jack Wu 6226

Macbook Pro上如何修改brew源

一、需求说明 我的macbook电脑安装了中科大的brew源码,发现安装gpg工具失败,其他工具可以正常安装,为了能将gpg安装成功,就找了找切换brew源的方案,记录如下。 二、切换至国内源 由于使用github默认源有可能存在路径远或者部分服务访问超时的原因,切换至国内源可以提速。 2.1 替换brew.git $ cd "$(brew --repo)" # 中国科大: $ git remote set-url origin https://mirrors.ustc.edu.cn/brew.git #

bufegar0的博客 1078
上一篇: SGU118
下一篇: NOI2007.Day2.T3.追捕盗贼
OrpineX
博客等级 码龄17年 16粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值