FFT及其框图实现

\(FFT\)的全称为快速傅里叶变换,但是\(FFT\)并不是一种变换,而是实现\(DFT\)的一种快速算法。当\(N\)比较大时,使用\(FFT\)可大大减少进行\(DFT\)变换的计算量。

\(N\)点的\(DFT\)所需的计算量为:
\[
X[k]=\sum_{n=0}^{N-1}x[n]W_N^{kn}
\]
乘法:\(N^2\)次,加法:\(N(N-1)\)次。每当\(N\)提高一倍,计算量增大四倍。

基\(2\)时域抽取

假设有一长度为\(2N\)的有限长序列\(x[n]\),现对其进行\(DFT\)变换,现有一算法可以将\(2N\)点的\(DFT\)计算降为\(N\)的\(DFT\)计算,记\(g[n]\)为\(x[n]\)的下标为偶数时的序列,即\(g[n]=x[2n],0\leq n \leq N-1\),记\(v[n]\)为\(x[n]\)的下标为奇数时的序列,即\(v[n]=x[2n+1],0\leq n \leq N-1\),则
\[
\begin{aligned}
X[k]&=\sum_{n=0}^{2N-1}x[n]W_{2N}^{kn}\\
&=\sum_{n=0}^{N-1}x[2n]W_{2N}^{k2n}+\sum_{n=0}^{N-1}x[2n+1]W_{2N}^{k(2n+1)} \\
&=\sum_{n=0}^{N-1}g[n]W_N^{kn}+W_{2N}^k\sum_{n=0}^{N-1}v[n]W_N^{kn} \\
&=G[<k>_N]+W_{2N}^{k}V[<k>_N], 0\leq k \leq 2N-1
\end{aligned}
\]
当\(0 \leq k \leq N-1\)时
\[
X[k]=G[k]+W_{2N}^kV[k]
\]
当\(N \leq k \leq 2N-1\)时
\[
X[k]=G[<k>_N]+W_{2N}^{k}V[<k>_N]\xrightarrow{k=m+N}G[m]-W_{2N}^{m}V[m], 0\leq m \leq N-1
\]
其中\(g[n]\)和\(v[n]\)的\(DFT\)都是\(N\)点的。

两个\(N\)点的\(DFT\)的运算量(以乘法为例)为\(2N^2\),而一个\(2N\)点的\(DFT\)运算量为\(4N^2\),计算量减少了一半!如果\(N=2^r\),则可以一直降下去,从而大大的减少了计算量。通过计算,可以知道此时的计算量为:乘法:\(\dfrac{N}{2}log_2N\),加法:\(Nlog_2N\)。

下面以8点的\(DFT\)为例,其实现框图为:

基\(2\)频域抽取

依然对于\(2N\)点的序列\(x[n]\)进行\(DFT\)计算,这次将\(x[n]\)分为前后两部分,即\(g[n]\)为\(x[n]\)的前\(N\)个点,即\(g[n]=x[n],0 \leq n \leq N-1\),\(v[n]\)为\(x[n]\)的后\(N\)个点,即\(v[n]=x[n+N],0\leq n\leq N-1\),则:
\[
\begin{aligned}
X[k]&=\sum_{n=0}^{2N-1}x[n]W_{2N}^{kn}\\
&=\sum_{n=0}^{N-1}x[n]W_{2N}^{kn}+\sum_{n=N}^{2N-1}x[n]W_{2N}^{kn} \\
&=\sum_{n=0}^{N-1}x[n]W_{2N}^{kn}+\sum_{m=0}^{N-1}x[m+N]W_{2N}^{k(m+N)}\\
&=\sum_{n=0}^{N-1}g[n]W_{2N}^{kn}+(-1)^k\sum_{n=0}^{N-1}v[n]W_{2N}^{kn}
\end{aligned}
\]
对其进行频域抽取
\[
X[2r]=\sum_{n=0}^{N-1}g[n]W_{2N}^{2rn}+\sum_{n=0}^{N-1}v[n]W_{2N}^{2rn}=G[k]+V[k],0\leq r \leq N-1
\]
\[
X[2r+1]=\sum_{n=0}^{N-1}g[n]W_{2N}^{(2r+1)n}-\sum_{n=0}^{N-1}v[n]W_{2N}^{(2r+1)n}=W_{2N}^{n}(G[k]-V[k])
\]
该算法也将\(2N\)点的\(DFT\)降为了2个\(N\)点的\(DFT\)。

将上面时域抽取的实现框图中所有的\(x[n]\)换成\(X[k]\),然后所有箭头反向,即输入变输出,输出变输入,得到的框图就是频域抽取实现的框图。

15 FFT及其框图实现的更多相关文章

  1. FFT常数优化(共轭优化)

    最近闲着无聊研究了下\(FFT\)的常数优化,大概就是各种\(3\)次变\(2or1.5\)次之类的,不过没见过啥题卡这个的吧. 关于\(FFT\)可以看这里:浅谈FFT&NTT. 关于复数 ...

  2. 任意模数FFT

    任意模数FFT 这是一个神奇的魔法,但是和往常一样,在这之前,先 \(\texttt{orz}\ \color{orange}{\texttt{matthew99}}\) 问题描述 给定 2 个多项式 ...

  3. hdu6088 组合数+反演+拆系数fft

    题意:两个人van石头剪子布的游戏一共n盘,假设A赢了a盘,B赢了b盘,那么得分是gcd(a,b),求得分的期望*\(3^{2*n}\) 题解:根据题意很明显有\(ans=3^{n}*\sum_{a= ...

  4. HNOI2019 白兔之舞 dance

    HNOI2019 白兔之舞 dance 显然\(n=3\)就是\(n=1\)的扩展版本,先来看看\(n=1\)怎么做. 令\(W=w[1][1]\),显然答案是:\(ans_t=\sum_{i\mod ...

  5. AC620教程 第十五节 8位7段数码管驱动设计与验证

    本章导读 电子系统中常用的显示设备有数码管.LCD液晶以及VGA显示器等.其中数码管又可分为段式显示(7段.米字型等)以及点阵显示(8*8.16*16等),LCD液晶的应用可以分为字符式液晶(1602 ...

  6. 【JZOJ6246】【20190627】B

    题目 求逆续对个数为\(k\)的\(n\)阶排列个数\(mod \ 1e9+7\) $1 \le n  ,  k \le 10^5 $ 题解 $f_{i,j} = \sum_{k=0}^{i-1} f ...

  7. Codechef BINOMSUM

    题意:(复制sunset的)有\(T\)天,每天有\(K\)个小时,第\(i\)天有\(D+i−1\)道菜,第一个小时你选择\(L\)道菜吃,接下来每个小时你可以选择吃一道菜或者选择\(A\)个活动中 ...

  8. 5.15 省选模拟赛 T1 点分治 FFT

    LINK:5.15 T1 对于60分的暴力 都很水 就不一一赘述了. 由于是询问所有点的这种信息 确实不太会. 想了一下 如果只是询问子树内的话 dsu on tree还是可以做的. 可以自己思考一下 ...

  9. [2016北京集训试题15]项链-[FFT]

    Description Solution 设y[i+k]=y[i]+n. 由于我们要最优解,则假如将x[i]和y[σ[i]]连线的话,线是一定不会交叉的. 所以,$ans=\sum (x_{i}-y_ ...

随机推荐

  1. MVC5+EF6 入门完整教程5 :UI的一些改造

    https://www.cnblogs.com/miro/p/4095165.html 上篇文章介绍了EF实现CRUD及一些基本的Html Helpers. 这次我们将会对之前的内容进行一些修改和重构 ...

  2. AcWing 906. 区间分组

    //1.将所有区间按左端点从小到大排序 //2.从前往后处理每个区间,判断能否将其放到某个现有的组中 //判断某一组的最后一个区间的右端点是否小于该区间的左端点 //如果大于或等于,就开新组,如果小于 ...

  3. js解释器

    又名js引擎 JavaScript是解释型语言,这就是说它无需编译,直接由JavaScript引擎直接执行. 既然说到了解释型语言,那么我们就来分别以下解释型语言和编译型语言的差别: 编译型语言:程序 ...

  4. [IOI2005]河流

    Description Luogu3354 Solution 一道树形dp的题. 首先考虑转移,很简单,就是这个点做不做伐木场.为了方便转移,我们定义状态为\(f_{i,j,k}\)表示点\(i\)及 ...

  5. hadoop学习笔记(九):mr2HA高可用环境搭建及处步使用

    本文原创,如需转载,请注明原文链接和作者 所用到的命令的总结: yarn:启动start-yarn.sh   停止stop-yarn.sh zk :zkServer.start ;:zkServer. ...

  6. 使用js处理后台返回的Date类型的数据

    从后台返回的日期类型的数据,如果直接在前端进行显示的话,显示的就是一个从 1970-01-01 00:00:00到现在所经过的毫秒数,而在大多数业务中都不可能显示这个毫秒数,大多数都是显示一个正常的日 ...

  7. 网络常识---tracert

    当打不开一个网页,可以是用如下命令查看请求的数据走到哪里了 在命令行中输入“tracert ”并在后面加入一个IP地址,可以查询从本机到该IP地址所在的电脑要经过的路由器及其IP地址

  8. 用python实现网络文件共享

    第一步:打开命令行 第二步:切换到要共享的文件夹目录 第三步:运行命令 python -m http.server 端口号 然后在浏览器输入显示的路径即可访问文件夹下的文件,点击即可下载,手机端亦可访 ...

  9. Spring 属性依赖注入

    1.1    属性依赖注入 依赖注入方式:手动装配 和 自动装配 手动装配:一般进行配置信息都采用手动 基于xml装配:构造方法.setter方法 基于注解装配: 自动装配:struts和spring ...

  10. 查看Mysql数据库版本

    一.使用终端 1.参数为-V(大写字母)或者--version 使用方法: D:\mysql\bin>mysql -V 或者 D:\mysql\bin>mysql --version