15 FFT及其框图实现
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及其框图实现的更多相关文章
- FFT常数优化(共轭优化)
最近闲着无聊研究了下\(FFT\)的常数优化,大概就是各种\(3\)次变\(2or1.5\)次之类的,不过没见过啥题卡这个的吧. 关于\(FFT\)可以看这里:浅谈FFT&NTT. 关于复数 ...
- 任意模数FFT
任意模数FFT 这是一个神奇的魔法,但是和往常一样,在这之前,先 \(\texttt{orz}\ \color{orange}{\texttt{matthew99}}\) 问题描述 给定 2 个多项式 ...
- hdu6088 组合数+反演+拆系数fft
题意:两个人van石头剪子布的游戏一共n盘,假设A赢了a盘,B赢了b盘,那么得分是gcd(a,b),求得分的期望*\(3^{2*n}\) 题解:根据题意很明显有\(ans=3^{n}*\sum_{a= ...
- HNOI2019 白兔之舞 dance
HNOI2019 白兔之舞 dance 显然\(n=3\)就是\(n=1\)的扩展版本,先来看看\(n=1\)怎么做. 令\(W=w[1][1]\),显然答案是:\(ans_t=\sum_{i\mod ...
- AC620教程 第十五节 8位7段数码管驱动设计与验证
本章导读 电子系统中常用的显示设备有数码管.LCD液晶以及VGA显示器等.其中数码管又可分为段式显示(7段.米字型等)以及点阵显示(8*8.16*16等),LCD液晶的应用可以分为字符式液晶(1602 ...
- 【JZOJ6246】【20190627】B
题目 求逆续对个数为\(k\)的\(n\)阶排列个数\(mod \ 1e9+7\) $1 \le n , k \le 10^5 $ 题解 $f_{i,j} = \sum_{k=0}^{i-1} f ...
- Codechef BINOMSUM
题意:(复制sunset的)有\(T\)天,每天有\(K\)个小时,第\(i\)天有\(D+i−1\)道菜,第一个小时你选择\(L\)道菜吃,接下来每个小时你可以选择吃一道菜或者选择\(A\)个活动中 ...
- 5.15 省选模拟赛 T1 点分治 FFT
LINK:5.15 T1 对于60分的暴力 都很水 就不一一赘述了. 由于是询问所有点的这种信息 确实不太会. 想了一下 如果只是询问子树内的话 dsu on tree还是可以做的. 可以自己思考一下 ...
- [2016北京集训试题15]项链-[FFT]
Description Solution 设y[i+k]=y[i]+n. 由于我们要最优解,则假如将x[i]和y[σ[i]]连线的话,线是一定不会交叉的. 所以,$ans=\sum (x_{i}-y_ ...
随机推荐
- Django框架介绍(二)
1.MVC框架和MTV框架 MVC全名model view controller,是软件工程中的一种软件架构模式,把软件分为三个基本部分:模型(model).视图(view)和控制器(controll ...
- php/js将 CST时间转成格式化时间
PHP :比较简单 $str = 'Wed Jul 24 11:24:33 CST 2019'; echo date('Y-m-d H:i:s', strtotime($str)); echo dat ...
- 最大/最小de K个数/第K个数
题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 思路 堆排序 收获 用优先队列实现最大最小堆 注意下列代码中优先队列 ...
- 每天进步一点点------Allegro 铺铜、内电层分割
一.Allegro 铺铜 1.建议初学者内电层用正片,因为这样就不用考虑flash焊盘,这时候所有的过孔和通孔该连内电层的就连到内电层,不该连的就不连.而如果用负片,那么如果做焊盘的时候如果没有做fl ...
- chrome headless+selenium+python+(ubuntu 16.04/centos7) 下的实现
Ubuntu 16.04 下: 0x01 安装chrome 1 下载源加入系统源列表 sudo wget http://www.linuxidc.com/files/repo/google-chrom ...
- redis架构
hash槽16384个,0-16383 master1(slave101,slave102) master2 (slave201,slave202) master 3 (slave30 ...
- 详解多线程MT和多线程MD的区别
这段时间司在招实习生,而不管是远程的电话面试或者是实际现场面试中领导都喜欢问你这个问题,但是可惜的是能很好答上来的人很少.后来发现不管是应届的实习生,甚至有些实际参加工作几年的人也未必真的了解这个问题 ...
- centos 6.10 安装mysql 5.7.27 出现缺少libnuma.so.1的问题
centos 6.10安装mysql 5.7.27出现以下报错: [root@localhost /]# /usr/local/mysql/app/mysql/bin/mysqld --default ...
- Python类属性和类方法
01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两步: 1) 在内存中为对象 分配空间 2) 调用初始化方法 __in ...
- alsa driver--card
1.创建声卡 snd_card是对声卡硬件抽象出来的结构体,几乎所有与声音相关的逻辑设备都是在snd_card的管理之下,声卡驱动的第一个动作通常就是创建一个snd_card结构体. 我们可以通过调用 ...