DFT矩阵复习

我们来回顾一下DFT的矩阵运算:对离散信号$\underline{f}$进行DFT,就相当于用DFT矩阵$\underline{\mathcal{F}}$乘以列向量$\underline{f}$

$\begin{pmatrix} 1 &1  &1  &...  &1 \\  1 &\omega^{-1}  &\omega^{-2}  &...  &\omega^{-(N-1)} \\  1 &\omega^{-2}  &\omega^{-4}  &...  &\omega^{-2(N-1)} \\  \vdots  &\vdots  &\vdots  &...  & \vdots\\  1 &\omega^{-(N-1)}  &\omega^{-2(N-1)}  &...  &\omega^{-(N-1)^2}  \end{pmatrix} \begin{pmatrix} \underline{f}[0]\\  \underline{f}[1]\\  \underline{f}[2]\\  \vdots\\  \underline{f}[N-1] \end{pmatrix} = \begin{pmatrix} \underline{\mathcal{F}}\underline{f}[0]\\  \underline{\mathcal{F}}\underline{f}[1]\\  \underline{\mathcal{F}}\underline{f}[2]\\  \vdots\\  \underline{\mathcal{F}}\underline{f}[N-1] \end{pmatrix}$

其中主要的计算量(乘法计算量)为$N \times N$,用$O(N^2)$表示,而FFT可以将计算量降到$NlogN$

FFT的推导的两个方向

1. 矩阵简化

DFT矩阵是$N\times N$维矩阵,但是我们能发现该矩阵中蕴含着一些规律,通过这些规律,对矩阵进行转换,得到一系列多个元素为$0$的矩阵,而矩阵内的元素为$0$意味着减少乘法计算,本课程不会从这个方向着手FFT的推导。

2. 利用复指数的代数性质

1) 引入$\omega[p,q]$

令$\omega[p,q] = e^{2\pi i\frac{q}{p}}$,则$\omega[p,q_1+q_2] = e^{2\pi i\frac{q_1+q_2}{p}} = \omega[p,q_1]\omega[p,q_2]$
那么

$\omega[\frac{N}{2},-1] = e^{-2\pi i\frac{1}{\frac{N}{2}}} = e^{-2\pi i\frac{2}{N}} = \omega[N,-2]$

这表明了$\omega[\frac{N}{2},-1]$是$\omega[N,-1]$的偶次方(平方),因此

$\omega[\frac{N}{2},-n] = \omega[N,-2n]$

等式右边的$2n$代表了偶次方,那么$\omega[N,-1]$的奇次方呢?

$\omega[N,-(2n+1)] = \omega[N,-2n]\omega[N,-1] = \omega[N,-1]\omega[\frac{N}{2},-n]$

现在把$m$也放入到等式中,有

$\omega[N,-2nm] = \omega[\frac{N}{2},-nm]$

$\omega[N,-(2n+1)m] = \omega[N,-m]\omega[\frac{N}{2},-nm]$

另外,

$\omega[N,-\frac{N}{2}] = e^{-2\pi i\frac{\frac{N}{2}}{N}} = e^{-\pi i} = -1$

2) 把DFT公式表达成奇偶项的形式
接下来就是把上述关于$\omega$的奇偶等式代入到DFT公式
首先来回顾一下DFT公式

$\underline{\mathcal{F}}\underline{f}[m] = \displaystyle{ \sum_{n=0}^{N-1}\underline{f}[n]\omega[N,-nm] }$

式子当中共有$N$项多项式相加,我们需要把这$N$项多项式分为奇数与偶数部分,即

$\underline{\mathcal{F}}\underline{f}[m] = (sum\ over\ even\ indices)+(sum\ over\ odd\ indices)$

但是$N$可能不是偶数,这会导致分出来的奇偶项的数目不等,这不符合我们后续的推导过程,因此我们会假设$N$为偶数,即可以按下面的式子进行划分

$\underline{\mathcal{F}}\underline{f}[m] = \displaystyle{ \sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n]\omega[N,-2nm]+\sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n+1]\omega[N,-(2n+1)m] }$

我们后面会继续按照这种奇偶项的分解方法一直进行下去,这就要求$N$必须为2的某次方($N=2^k$),但是在实际的DFT应用中,可能会出现$N$不为$2^k$的情况,在这种情况下我们就需要在后面补$0$.

$\underline{f} = (\underbrace{ \underline{f}[0],\underline{f}[1],...,\underline{f}[N-1],0,0,...,0 }_{2^k\ entries} )$

有了上述条件,我们回到DFT公式的分解推导,

$\begin{align*}
\underline{\mathcal{F}}\underline{f}
&= \sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n]\omega[N,-2nm]+\sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n+1]\omega[N,-(2n+1)m]\\
&= \sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n]\omega[\frac{N}{2},-nm]+\sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n+1]\omega[N,-m]\omega[\frac{N}{2},-nm]\\
&= \sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n]\omega[\frac{N}{2},-nm]+\omega[N,-m]\sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n+1]\omega[\frac{N}{2},-nm]\\
\end{align*}$

我们来分析一下上述推导结果,上式的奇偶两个大项,基本上可以被当作单独的DFT。其中

  1. 每个大项的离散数据有$\frac{N}{2}$个,
  2. 求和从$0到\frac{N}{2}-1$,
  3. $\omega[\frac{N}{2},-nm] = e^{-2\pi i\frac{nm}{\frac{N}{2}}}$中的复指数分母也由$N$替换成了$\frac{N}{2}$。

但是其中还有一点瑕疵,因为DFT是有多少个输入就会有多少个输出:$\underline{f}$有$N$个输入,则$\underline{\mathcal{F}}\underline{f}$有$N$个输出,也就是说$m = 0,1,…,N-1$;但是$\displaystyle{\sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n]\omega[\frac{N}{2},-nm]}$只有$\frac{N}{2}$个输入,也只应该有$\frac{N}{2}$个输出,也就是说$m = 0,1,…,\frac{N}{2}-1$,这就与原来的DFT定义相悖了。因此我们可以遵照以下规定

$\underline{\mathcal{F}}_N\underline{f}[m] = \left( \underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{even} \right)[m]+\omega[N,-m]\left( \underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{odd} \right)[m] \qquad m=0,1,…,\frac{N}{2}$

这样的话只处理了$\underline{\mathcal{F}}\underline{f}$的前半部分,那后半部分该怎么表达呢?

后半部分的输出个数还是为$\frac{N}{2}$,即$m=0,1,…,\frac{N}{2}-1$,然后其他各个部分应该进行相应的变化:

  1. $\underline{\mathcal{F}}\underline{f}[m]$,变成$\underline{\mathcal{F}}\underline{f}[m+\frac{N}{2}]$
  2. $\displaystyle{\sum_{n=0}^{\frac{N}{2}-1}}$与$\underline{f}[2n]$、$\underline{f}[2n+1]$,不涉及到$m$,不变
  3. $\omega[\frac{N}{2},-nm]$,变成$\omega[\frac{N}{2},-n(m+\frac{N}{2})] = \omega[\frac{N}{2},-nm]\omega[\frac{N}{2},-\frac{N}{2}n] = \omega[\frac{N}{2},-nm]$,就是不变
  4. $\omega[N,-m]$,变成$\omega[N,-(m+\frac{N}{2})] = \omega[N,-m]\omega[N,-\frac{N}{2}] = –\omega[N,-m]$,也就是多了个负号

把上述变化统合起来,有

$\underline{\mathcal{F}}\underline{f}[m+\frac{N}{2}] = \displaystyle{ \sum_{n=0}^{\frac{N}{2}-1}\underline{f}[2n]\omega[\frac{N}{2},-nm]-\omega[N,-m]\sum_{n=}^{\frac{N}{2}-1}\underline{f}[2n+1]\omega[\frac{N}{2},-nm] }$

$\underline{\mathcal{F}}_N\underline{f}[m] = \left( \underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{even} \right)[m]-\omega[N,-m]\left( \underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{odd} \right)[m] \qquad m=0,1,…,\frac{N}{2}$

总结

下面总结一下FFT的计算过程

有$N$元输入的离散信号$\underline{f}$(其中$N=2^k$),我们想推导它的$N$元输出$\underline{\mathcal{F}}\underline{f}$。我们把需要得到的$\underline{\mathcal{F}}\underline{f}$分为前后两半,前半的各项为$\underline{\mathcal{F}}\underline{f}[m]$,后半各项为$\underline{\mathcal{F}}\underline{f}[m+\frac{N}{2}]$,$m=0,1,…,\frac{N}{2}-1$

计算步骤如下

  1. 把输入$\underline{f}$分成偶数与奇数两个序列$\underline{f}_{even}$,$\underline{f}_{odd}$
  2. 把$\underline{f}_{even}$,$\underline{f}_{odd}$当作单一的输入,分别计算他们的$\underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{even}$,$\underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{odd}$
  3. 通过把$\underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{even}$,$\underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{odd}$按照下列式子的方式结合起来,可以分别得到$\underline{\mathcal{F}}\underline{f}$的前后半部分

$\underline{\mathcal{F}}_N\underline{f}[m] = \left( \underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{even} \right)[m]+\omega[N,-m]\left( \underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{odd} \right)[m]$

$\underline{\mathcal{F}}_N\underline{f}[m] = \left( \underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{even} \right)[m]-\omega[N,-m]\left( \underline{\mathcal{F}}_{\frac{N}{2}}\underline{f}_{odd} \right)[m]$

$\omega[N,-m] = e^{-2\pi i\frac{m}{N}}\quad,\quad m=0,1,…,\frac{N}{2}-1$

前文推导出的这段计算虽然不能算FFT的全貌,却包含了FFT的主要思想:把一个完整的DFT二分成偶数项$\underline{f}_{even}$以及奇数项$\underline{f}_{odd}$的DFT的组合,然后又再继续对$\underline{f}_{even}$与$\underline{f}_{odd}$继续二分,直到最终剩下两项。

 
 

[傅里叶变换及其应用学习笔记] 二十二. 快速傅里叶变换相关推荐

  1. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  2. Windows保护模式学习笔记(十二)—— 控制寄存器

    Windows保护模式学习笔记(十二)-- 控制寄存器 控制寄存器 Cr0寄存器 Cr2寄存器 Cr4寄存器 控制寄存器 描述: 控制寄存器有五个,分别是:Cr0 Cr1 Cr2 Cr3 Cr4 Cr ...

  3. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  4. OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器

    OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此 ...

  5. QT学习笔记(十二):透明窗体设置

    QT学习笔记(十二):透明窗体设置 创建 My_Widget 类 基类为QWidget , My_Widget.cpp 源文件中添加代码 #include "widget.h" # ...

  6. MATLAB学习笔记(十二)

    MATLAB学习笔记(十二) 一.数据插值 1.1 数据插值的计算机制 1.2 数据插值的matlab函数 二.曲线拟合 2.1 曲线拟合原理 2.2 曲线拟合的实现方法 三.数据插值与曲线拟合比较 ...

  7. Windows Workflow HOL学习笔记(十二):创建状态基工作流

    W indows Workflow HOL学习笔记(十二):创建状态基工作流 本文内容来自Microsoft Hands-on Labs for Windows Workflow Foundation ...

  8. 模电学习笔记(十二)——跨阻放大器

    模电学习笔记(十二) 跨阻放大器 跨组运算放大器是将电流信号转换成为电压信号,电流到电压增益基于反馈电阻. 设计目标: 输入 输出 带宽 电源 0A 100uA 0V 7V 20kHz 15V -15 ...

  9. Spring Cloud学习笔记【十二】Hystrix的使用和了解

    Spring Cloud学习笔记[十二]Hystrix的使用和了解 Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Net ...

  10. Cty的Linux学习笔记(十二)

    Linux学习笔记--第十二篇 命令(command): RPM工具: rpm -ivh ......:安装RPM包 -i:表示安装 -v:表示可视化 -h:表示显示安装进度 在安装RPM包是常用的附 ...

最新文章

  1. opengl 创建context_OpenGL学习笔记1-创建窗口,绘制三角形
  2. C# QRCode 二维码
  3. html大学生活主题,大学生培训主题标语
  4. java并行体系结构
  5. Python之路(第二十篇) subprocess模块
  6. 转:Ubuntu下ibus-sunpinyin的安装及翻页快捷键设置!
  7. 碧雪情天服务器地址源如何修改,今天维护吗,碧雪情天怎么进不去啊,知道的说一下...
  8. ssm项目直接加html文件,如何把ssm项目和vue项目部署在云服务器(上)
  9. Android中样式及主题
  10. FreeMarker语言【页面静态】
  11. 【9108】模拟数学计算器
  12. 【200个】电子病历系统(EMR)精华资料汇总【HC3i年终盘点】
  13. Java JDK11的下载与安装
  14. cbc cryptojs 前后端_前端加密JS库--CryptoJS 使用指南
  15. Excel排序、筛选
  16. JQuery实现步骤条效果(上一步,下一步)
  17. 神策数据杨宁:券商财富管理数字化转型客户全生命周期(视频解读)
  18. Linux学习:四层负载均衡详解
  19. RTI DDS的xml说明
  20. 信用的“刚柔并进”大家信夫的普惠信用

热门文章

  1. Django应用部署 - 上线指南
  2. PyQt教程 - pythonQt的安装和配置及版本间差异
  3. node定时任务php 卡,NodeJs实现定时任务的示例代码
  4. python3.6.2安装pip_centos7 安装pip+python3.6以及pip安装错误解决办法
  5. 微星安装双系统Linux卡顿,微星笔记本-gf63-1050-win10-ubuntu16双系统安装
  6. 无向带权图的存储结构_每天5分钟用C#学习数据结构(27)图 Part 8
  7. flutter实现Icon可以用Image替换
  8. Flutter进阶第13篇: 打开外部浏览器、打开外部应用、拨打电话、发送短信
  9. Android 退出登陆后,清空之前所有的activity,进入登陆主界面
  10. Android SwipeRefreshLayout 实现下拉刷新1