1 引言

傅里叶级数 (Fourier Series, FS) 是《高等数学》中遇到的一个重要的级数,它可以将任意一个满足狄利克雷条件的函数为一系列三角级数的和。最早由法国数学家傅里叶在研究偏微分方程的边值问题时提出,极大地推动了偏微分方程理论的发展。根据欧拉公式及其推导式,傅里叶级数又可以推导出《信号与系统》中最重要的傅里叶变换(Fourier Transform, FT)。FT由于可以将信号从时域到频域来回变换,分析信号的成分,从而广泛应用于信号处理领域。在计算机处理中,信号被离散化为采样点,针对离散采样点的傅里叶变换成为了《数字信号处理》中的离散傅里叶变换(Discrete Fourier Transform, DFT)。但是由于DFT计算量过于庞大(计算复杂度高),1965年由J.W.库利和T.W.图基提出了最早版本的快速傅里叶变换(Fast Fourier Transform, FFT),将计算量减少了几个量级,从而使得计算机更加快速地处理信号,从而促进通信、信号处理领域的快速发展。近年来由于量子计算机的兴起,量子傅里叶变换(Quantum Fourier Transform, QFT)更是可以对FFT进行指数级别的加速。

由于这一系列变换出现在不同学科中,老师在讲课时也是各自独立讲解,所以大多数同学(包括我)对其中的似曾相识的公式,一直分不清有什么区别和联系,这篇文章着重于这一系列傅里叶算法的直接的相互推导。

2 一维傅里叶级数(FS)

2.1 周期性

首先写出傅里叶级数的表达式:

其中,

,
是FS的系数,也是我们需要求的参数,若它们确定,则

即可被分解为N阶的FS。

由于

,因此上式可以改写为:

时,
是周期为
的周期函数,也是FS中周期最大的一组分量。我们取周期
,其他分量,在
中应该包含了多个完整的周期。此时有:

2.2 正交性

何为正交?正交是线性代数中的概念,即列向量a, b的内积为0,就称这两向量正交。正交还可以不严谨地理解为这两组向量之间没有关系。

同样地,借鉴这个定义,在连续函数中的正交为:

此时,我们令

,有:

积分是一个线性算符,积分和等于和的积分,上式可以看做两个三角函数分别积分。当

时,无论
还是
均大于等于1,因此它们的周期必然小于等于
。根据前面的结论有:

时,上式变为:

前一项,积分明显为0,后一项为

同理,还可以尝试令

,在此不再赘述,可以得到

结论:在FS中每两个不同的级数之间存在两两正交关系。

2.3 求系数

,

首先看

怎么求。令:

就是把要分解的函数和傅里叶级数同时做了积分,等号右边可以拆为2N+1个积分和,根据前面的周期性可知,除了第一项以外,后面的项的积分均为0。故上式可以化简为:

这里的表达式就说明了

其实是函数的均值。

接着,我们尝试求

,令:

其中,

也是1~N中的一个值,为了便于和
区分开来,方便叙述。

利用上面证明的周期性和正交性,我们可以知道,只有当

时,积分结果才不为0,其余均为0。故上式可以化简为:

故:

同理,我们可以得到正弦分量的系数。最后结果为:

到这里,所有FS的系数就能求出来了。但是这里有个比较诡异的地方,当

时,上式算出的
与我们之前算出的
不等,为了保持k的延续性,通常情况是用
表示FS的第一项。

3 傅里叶变换(FT)

3.1 FT和FS之间的关系

首先,把傅里叶变换的公式写出来:

然后,回到傅里叶级数。

根据欧拉公式

及其一个简单的变形:

代入到傅里叶级数中:

傅里叶级数变为:

变换后的系数

求解方式可以根据上面
求得。

的定义域是
,且
是非周期函数,我们可以对
进行周期延拓,认为它在定义域内为一个周期;而
前所述,在
中最少有1个周期,上式不妨写为:

所以,

时,
间隔很小,可视作连续。

由于

内为一个周期,也可以表示为在
内也是一个周期(周期延拓)。故上式写为

,
替换,
替换就出现了傅里叶变换的公式

3.2离散傅里叶变换

在计算机中,我们不可能令

,这样
仍被当做离散量,这样一来积分号就变成了求和号,上式可以写作:

因此我们就得到了能够被计算机执行的离散傅里叶变换的函数式。

为便于理解,先带个具体数据进去考虑。若采样的数据点为8,频率分量个数也为8。用

来表示这种情况下的DFT函数。

上面这些式子用矩阵表示为,假设有个矩阵

右乘一个时域组成的列向量得到一个频域组成的列向量。

将上面的一组求和式翻译成矩阵

为了便于观察,令

矩阵中的
。上式可以写为:

根据

的周期性:
可进一步化简。

3.3 快速傅里叶变换

从3.2节,我们知道了,要完成一次DFS需要用一个矩阵去乘以一个时域组成的列向量,而这个矩阵大小与时域上的采样点和频域分量的个数有关。若它们的个数为

,则上面的一个矩阵乘法包含
次数值乘法,这当
较大时,需要消耗大量的计算机资源。好在构成DFS的矩阵有着一定的特殊规律,可以使用分治法,使其只需要大约
次数值乘法,即可完成工作。

仍然以

为例,不难看出
是一个正交对称阵(实际上所有DFS构成的矩阵都是正交对称阵)。交换
偶数列位置提到奇数列前面。

只差一个奇偶置换矩阵

同样地,我们还可以写出

同样地,令

矩阵中的

值得注意的是

(周期性)

又可以写为:
左边4列中包含了两个
而右边4列是由系数和
共同组成。因此
又可以被写为:

其中

为单位阵,
是一个对角阵。

最后

这样一来上面这个矩阵需要多少次乘法呢?由于

是奇偶置换矩阵,在计算机中是只需要移位,不需要做乘法运算,故

显然,主要的计算量在于

,共计
次数值乘法,
是对角阵,
需要额外4次乘法,
是它的相反数,不计入乘法次数。最后我们就将原本需要
次乘法变为了
次乘法。

同理,我们还可以对

进一步拆分为

带入

化简下:

此时需要的乘法数量为

推广到更一般的情况,仍然可以使用类似上述的递归方式,最后FFT的计算复杂度变为

4、量子傅里叶变换

如果对量子逻辑门有一定了解的同学,看到上面最终的递归化简式,已经发现和量子逻辑门很像了。比如我们看

那这不就是

门嘛。

再比如

也可以分解成量子门的形式(中间省略了归一化参数):

其中

为哈德玛门,
的单位阵,
为受控S门。
也可以分解成量子门的形式(中间省略了归一化参数):

其中,

相当于
的单位阵。
相当于
门。

接着 我们观察置换矩阵

,列出这两个的真值表

不难发现

就相当于SWAP门

根据

的递归表达式可以看出,矩阵左乘向量顺序为先
,它们的真值表变换如下

列出合并后的真值表,那这不就是1,3 qubit交换位置嘛。

即:

整个

的递归式就可以写成(中间省略了归一化参数):

量子电路如下:

有兴趣的可以对比一下与《量子计算与量子信息》书中盒子5.1是否是等价的电路。如果以基本量子门作为计算单元的话,QFT的复杂度则只需

fft的c语言和matlab对比_傅里叶级数(FS)、傅里叶变换(FT)快速傅里叶变换(FFT)及量子傅里叶变换(QFT)之间推导关系...相关推荐

  1. fft的c语言和matlab对比_Matlab系列之程序控制

    经过前几篇的学习,我想对于Matlab的两种M文件都已经清楚各自的功能并对函数的相关知识有了一定的了解,今天这篇将对Matlab的程序控制结构进行学习,首先要知道在Matlab中,具有四类程序控制结构 ...

  2. fft的c语言和matlab对比_Matlab在绘制两相互垂直斜锯齿振动与简谐振动合成运动轨迹图形的应用...

    1 提出问题 在振动学中,相互垂直的两简谐振动合成时,如果两简谐振动的频率相同,则可形成稳定的椭圆曲线,极端条件为圆和直线:而当两相互垂直的简谐振动频率不同时,合成运动比较复杂,其运动轨迹一般不闭合, ...

  3. 【 MATLAB 】离散傅里叶级数(DFS)与DFT、DTFT及 z变换之间的关系

    上篇博文我们简单的讨论了离散傅里叶级数DFS和离散傅里叶变换DFT之间的关系,简单地说,DFT就是DFS在一个周期内的表现. [ MATLAB ]离散傅里叶变换(DFT)以及逆变换(IDFT)的MAT ...

  4. matlab表示DFT和DTFT,【 MATLAB 】离散傅里叶级数(DFS)与DFT、DTFT及 z变换之间的关系...

    上篇博文我们简单的讨论了离散傅里叶级数DFS和离散傅里叶变换DFT之间的关系,简单地说,DFT就是DFS在一个周期内的表现. 为了后面讨论方便,这里给出DFS的系数公式(分析公式):         ...

  5. c语言和matlab的区别,Matlab与C语言区别.pdf

    Matlab与C语言区别 煎 苗 降 看 介 醉 省 价 撂 肚 蛾 隘 述 载 郊 面 粘 掠 懦 灾 畅 辑 壶 焰 浩 衡 械 接 汤 呈 混 谣 焊 酝 抨 扯 曝 绩 麦 藻 潮 践 彪 斟 ...

  6. go语言和java比_去过大场面试后,java程序员有没有必要转学Go语言?

    2019年去过字节跳动.鹅厂面试java技术岗,我就纳闷了,怎么都会问到我熟悉GO语言开发吗,难道你们招的不是java程序员,而是GO程序员吗. GO语言 Go语言是谷歌在 2009 年发布的一款编程 ...

  7. c语言电流检测模块程序,C语言和MATLAB程序设计在电力谐波电流检测方法仿真中的应用...

    前言第1章 绪论1.1 计算机仿真的基本概念1.2 C语言简介1.3 MATLAB概述1.4 电力谐波电流检测方法的研究现状1.4.1 有源电力滤波器的丁作原理1.4.2 电力谐波电流检测方法的研究现 ...

  8. go语言和java并发_彻底搞清楚Java并发 (一) 基础

    多线程编程是为了让程序运行得更快,但是不是说,线程创建地越多越好,线程切换的时候上下文切换,以及受限于硬件和软件资源的限制问题 上下文切换 单核CPU同样支持多线程编程,CPU通过给每个线程分配CPU ...

  9. go语言和java比_闲话Python, Go, Java

    简要介绍下笔者从业经历,2017年5月加入饿了么(Java),2019年6月加入字节跳动(Python & go),Python & go 还处于入门阶段,所以笔者的见解只能当闲话听听 ...

最新文章

  1. 平民架构的春天——UCloud数据方舟实战记
  2. 发布方配模板引擎V2.1及开发教程和案例
  3. lr参数化取值与连接数据库
  4. 定义国际贸易术语(Incoterms)
  5. 【elasticsearch】Elasticsearch 空值处理实战
  6. linux php扩展 mysqli,[linux]PHP添加mysqli扩展 | 学步园
  7. mysql 随机记录 newid()_sql随机查询数据语句(NewID(),Rnd,Rand(),random())
  8. 悟透JavaScript--可爱与智慧并存,灵感与诙谐共生
  9. HDU 2258 Continuous Same Game
  10. 中控考勤机无线连接不上服务器,中控考勤机连接不上电脑的解决方法
  11. ACM/IOI 国家队集训队论文集锦
  12. 常见汉字与不常见汉字
  13. 找老域名有没有什么好方法?
  14. Android hook微信 apk 实时获取微信聊天消息记录
  15. android 图片虚化代码,Android模糊图片技术
  16. building sasl.wrapper extention
  17. 手速最快的是电竞选手?错了,是程序员
  18. WinXP SP2 USER32.DLL CallWindowProc(...)
  19. 上周热点回顾(2.13-2.19)
  20. 通过Python的pytesseract库识别图片中的文字

热门文章

  1. IE浏览器解决无法识别js中getElementsByClassName问题
  2. python3.5文档
  3. android中给TextView或者Button的文字添加阴影效果
  4. [解题报告]HDU 1249 三角形
  5. ASP.NET中的Eval()和DataBinder.Eval()方法
  6. map与unordered_map的区别
  7. C语言 嵌入式 面试小知识点(一)
  8. 移植U-Boot思路和实践 | 基于RK3399
  9. 我是在这里学到的Linux知识的
  10. 工作后和在学校最大的区别是什么?