离散傅里叶变换(DFT/IDFT、FFT/IFFT)运算量的讨论

article/2025/9/26 21:42:49

前言:关于为什么要写这个博客

       最近在重新看《合成孔径雷达成像 算法与实现》这本书,看到“离散傅里叶变换记其逆变换的运算量级为N^{2}”这句话,就想起当初在学《数字信号处理》中FFT那章节时,书中有对比DFT和FFT的运算量的一些文字,完全想明白那个推导过程还是费了点劲儿的。再就是最近我的《数字图像处理》老师提到,要对比不同算法干一件事儿的效率,首先是要将两种算法的运算量或者说复杂度定量地表示出来(这个不能拿计算机处理数据的总时长来说事儿哈)。于是我萌生了写一个入门级别运算量分析和计算的博客,但是这里面会带入很多基础知识,所以对像我一样菜的人会比较友好,不过稍显冗余。

正文

一、一维信号的运算量

1.DFT/IDFT运算量说明

       给定一个序列g(n),初学的时候序列都是实序列,但是为了更一般一点儿,我想将其设定为复序列(就是说每个元素都是复数,可以写成a_{n}+ib_{n}的标准形式)。首先我要扔出DFT/IDFT变换的两个公式:

G(k) = \sum_{n=0}^{N-1}g(n)W_{N}^{nk} (1)

IDFT:g(n) = \sum_{k=0}^{N-1}G(K)W_{N}^{-nk}(2) 

 其中,W_{N} = e^{-j\frac{2\pi}{N}}k,n\in [0,N-1]且只取整数(下面就不再强调了)。

对(1)而言,k每取一个值(当然这个值的范围只能是[0,N-1]中的整数),比如k就取个2吧,那完整表达式就是:

G(2) = g(0)W_{N}^{0*2}+g(1)W_{N}^{1*2}+...+g(N-1)W_{N}^{(N-1)*2}(3)

                                                                              (按照W_{N}^{n*k}顺序来看) 

可以利用欧拉公式,将W_{N}^{n*k}写成c_{n}+id_{k}的形式,因此单单(3)这一个计算式,就要完成N次复乘和N-1次复加。而k可以取遍0~N-1这N个整数值,就是把上边那个过程重复了N次,我把这个计算过程稍微呈现一下:

\\G(0) = g(0)W_{N}^{0*0}+g(1)W_{N}^{1*0}+...+g(N-1)W_{N}^{(N-1)*0}\\ G(1) = g(0)W_{N}^{0*1}+g(1)W_{N}^{1*1}+...+g(N-1)W_{N}^{(N-1)*1}\\ G(2) = g(0)W_{N}^{0*2}+g(1)W_{N}^{1*2}+...+g(N-1)W_{N}^{(N-1)*2}\\ \vdots\\ G(N-2) = g(0)W_{N}^{0*(N-2)}+g(1)W_{N}^{1*(N-2)}+...+g(N-1)W_{N}^{(N-1)*(N-2)}\\ G(N-1) = g(0)W_{N}^{0*(N-1)}+g(1)W_{N}^{1*(N-1)}+...+g(N-1)W_{N}^{(N-1)*(N-1)}\\(4)

                                           (按照W_{N}^{n*k}顺序来看) 

我还想进一步地用矩阵来表示这个过程:

\begin{bmatrix} G(0)\\ G(1)\\ G(2)\\ \vdots \\ G(N-2)\\ G(N-1) \end{bmatrix}=\begin{bmatrix} W_{N}^{0*0} & W_{N}^{1*0} & \cdots & W_{N}^{(N-1)*0}\\ W_{N}^{0*1} & W_{N}^{1*1} & \cdots & W_{N}^{(N-1)*1}\\ W_{N}^{0*2} & W_{N}^{1*2} & \cdots & W_{N}^{(N-1)*2}\\ \vdots&\vdots&\vdots&\vdots \\ W_{N}^{0*(N-2)} & W_{N}^{1*(N-2)} & \cdots & W_{N}^{(N-1)*(N-2)}\\ W_{N}^{0*(N-1)} & W_{N}^{1*(N-1)} & \cdots & W_{N}^{(N-1)*(N-1)} \end{bmatrix}\begin{bmatrix} g(0)\\ g(1)\\ g(2)\\ \vdots\\ g(N-2)\\ g(N-1) \end{bmatrix}

(按照W_{N}^{n*k}顺序来看)

不难看出,整个计算过程要经历N^2次复乘和N*(N-1)≈N^2次复加,相同地,IDFT的运算量与DFT是一样的。

        结论就是,“离散傅里叶变换及其逆变换的运算量级为N^2”。

2.FFT/IFFT运算量说明

        到这个时候,书上往往就开始讲为什么要寻找一种新的离散傅里叶变换算法(即FFT),说什么“DFT运算量太大,计算耗时特别长”云云,而我要说说为什么能够提出FFT,其实很简单,就一句话:因为W_{N}^{nk}=e^{-j\frac{2\pi}{N}*nk}具有非常好的数学特性。举个例子,最常见的复指数函数f(t) = e^{-jw_{0}t},随着时间的推移,变量与函数值对应的坐标点一直在单位圆上转圈圈,存在e^{-jw_{0}(t+\frac{2\pi}{w_{0}})} = e^{-jw_{0}t},这呈现出良好的周期性。下面给出关于W_{N}的一些重要数学特性:

       首先明确这样几个式子:

\\ W_{N}^{nN} = e^{-j\frac{2\pi}{N}*nN} = e^{-j2{\pi}n} = 1\\ W_{N}^{Nk} = e^{-j\frac{2\pi}{N}*Nk} = e^{-j2{\pi}k} = 1\\ W_{N}^{\frac{N}{2}} = e^{-j\frac{2\pi}{N}*\frac{N}{2}} = e^{-j{\pi}} = -1\\        (5)

2.1 周期性:

对n的周期性:W_{N}^{n(k+N)} = W_{N}^{nk}*W_{N}^{nN} = W_{N}^{nk}

对k的周期性:W_{N}^{(n+N)k} = W_{N}^{nk}*W_{N}^{Nk} = W_{N}^{nk}

2.2 对称性:

对n的对称性:[W_{N}^{nk}]^{*} = W_{N}^{-nk} = W_{N}^{(N-n)k}\\

对k的对称性:[W_{N}^{nk}]^{*} = W_{N}^{n*(-k)} = W_{N}^{n(N-k)}\\

2.3其他性质

对n的性质:W_{N}^{n+\frac{N}{2}} = W_{N}^{n}*W_{N}^{\frac{N}{2}} = -W_{N}^{n}

                   W_{N}^{2n} = e^{-j\frac{2\pi}{N}*2n} = e^{-j\frac{2\pi}{\frac{N}{2}}*n} = W_{\frac{N}{2}}^{n}

对k的性质:W_{N}^{k+\frac{N}{2}} = W_{N}^{k}*W_{N}^{\frac{N}{2}} = -W_{N}^{k}\\

                    W_{N}^{2k} = e^{-j\frac{2\pi}{N}*2k} = e^{-j\frac{2\pi}{\frac{N}{2}}*k} = W_{\frac{N}{2}}^{k}

        有了这些作为基础,FFT的过程就好理解了。再拿DFT的定义式说事儿,这次令时域序列为x(n),频域序列为X(k):

X(k) = DFT[x(n)] = \sum_{n=0}^{N-1}x(n)W_{N}^{nk}

假设序列长度N是2的整次幂(后面解释为什么是2的整次幂;显然N是个偶数),序列标号为0~N-1,现在来推导基2 FFT。将序列x(n)中的奇数标号的序列和偶数标号的序列分别提取出来,组成如下两个新的序列:

\left\{\begin{matrix} x_{1}(r) = x(2r),\\ x_{2}(r) = x(2r+1) \end{matrix}\right.,r = 0,1,2...\frac{N}{2}-1      (6)

值得注意的是,这两个序列的长度都是\frac{N}{2}。计算X(k)是将整个序列x(n)分别与对应因子W_{N}^{nk}相乘后求和,这也可以将序列的奇数标号部分和偶数标号部分分开,分别来做这个计算再求和(这就好比你要计算1+2+3+4+5+6+7+8,就等同于算(1+3+5+7)+(2+4+6+8)),计算过程就是:

X(k) = \sum_{n=0}^{N-1}x(n)W_{N}^{nk} = \sum_{n=0}^{\frac{N}{2}-1}x(2r)W_{N}^{2r*k}+ \sum_{r=0}^{\frac{N}{2}-1}x(2r+1)W_{N}^{(2r+1)*k}

代入刚刚分出来的俩序列(6),得:

Above = \sum_{n=0}^{\frac{N}{2}-1}x_{1}(r)W_{N}^{2rk}+ \sum_{r=0}^{\frac{N}{2}-1}x_{2}(r)W_{N}^{2rk}*W_{N}^{k}

再用一下2.3中提到的其它性质,将指数分子上的2倍变成分子上的1/2,即:

Above =\sum_{n=0}^{\frac{N}{2}-1}x_{1}(r)W_{\frac{N}{2}}^{rk}+ \sum_{r=0}^{\frac{N}{2}-1}x_{2}(r)W_{\frac{N}{2}}^{rk}*W_{N}^{k}

(注意,从这里开始k的范围悄悄变成了[0,\frac{N}{2}-1])

巧妙的是,我们分出来的序列每个都长\frac{N}{2},这就意味着,上面的结果等于x_{1}(r)的离散傅里叶变换与x_{2}(r) 的离散傅里叶变换乘一个因子W_{N}^{k}的和,即为:

X(k) =X_{1}(k)+X_{2}(k)*W_{N}^{k}

                                                           k\in [0,\frac{N}{2}-1] 

这了不得呀!欲求一个长度为N的序列的离散傅里叶变换,拆解成了求两个长度均为 \frac{N}{2} 的序列的离散傅里叶变换,再经过加权求和就能得到。。。。。

(累了,择日继续写)


http://chatgpt.dhexx.cn/article/aT9qdQlR.shtml

相关文章

OpenCV-离散傅里叶变换cv::dftcv::idft

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 函数原型 void dft(InputArray src, OutputArray dst, int flags 0, int nonzeroRows 0); void idft(InputArray src, Output…

12点的idft c语言,【整理】用IDFT实现UF-OFDM和OFDM的模拟调制

cooperate with Liu Lei 用IDFT实现OFDM的代码如下: N32; xrandint(1,N,[0 3]); x1qammod(x,4); f1:N; t0:0.001:1-0.001; w2*pi*f.*t; % w12*pi*(f0.2).*t; y1x1*exp(j*w);%子载波调制 x2ifft(x1,N); %ifft figure(1); plot(t,abs(y1)); hold on; stem(0:1/N:1-1/N…

离散傅立叶变换推导(DF、IDFT)

mazonex离散傅立叶变换视频笔记 需要先了解傅里叶变换推导(FT、IFT) 本文仅作为笔记,推导思想和图片来自视频 周期为 2 π 2\pi 2π的函数的复数形式展开(傅里叶级数) 在上一篇文章中part4中提到周期 T 2 L T2L T2L函数的复数形式展开为: f ( t ) ∑…

浅谈傅里叶——8. 一维iDFT的实现

这是本系列的最后一章,原先计划是把这部分内容一并挪到上一章里的,不过喜欢凑一个整数,而且想骗一点流量,所以把它们拆成了两部分。我们在前面的内容中,通过使用不同的频率信号对原始信号进行采样,从而分析…

idft重建图像 matlab_1周学FFT——第2天 DFT和IDFT的MATLAB实现

根据定义式,可写出DFT的MATLAB代码如下[从玉良,2009,p72]: function [f, Xk] mydft(xn, fs, N) % DFT n [0:1:N-1]; k n; WN exp(-j*2*pi/N); nk n * k; % N^2 times multiply Xk xn(1:N) * WN.^nk; % N^3 times multiply f …

FT,DTFT,DFT,IDFT,FFT含义

1.傅立叶变换FT(Fourier Transform) 性质:时域连续,频域连续 周期信号只有傅立叶级数,严格意义上讲,没有傅立叶变换;但可以令周期信号的周期趋于无穷大,这样,将周期信号变为非周期信号&#x…

DFT与IDFT

DFT与IDFT 一.方法简介 序列x(n)(n0,1,…N-1)的DFT定义为 X ( k ) ∑ n 0 N − 1 x ( n ) e − j 2 π n k N X(k)\sum_{n0}^{N-1}x(n)e^{-j\frac{2\pi nk}{N}} X(k)n0∑N−1​x(n)e−jN2πnk​ 设 x …

IDFT的python实现

IDFT IDFT(Inverse Discrete Fourier Transform), 傅里叶逆变换,可以将频域信号转换到时域中, 它的公式非常简单: x [ n ] 1 N ∑ k 0 N − 1 X [ k ] e j 2 π k n / N x[n] \frac{1}{N} \sum_{k0}^{N-1} X[k] e^{j2\pi kn/N} x[n]N1​k0∑N−1​X…

一文搞懂:FT、DTFT、DFT、IDFT

一文搞懂:FT、DTFT、DFT、IDFT 写在前面一切为了计算机的处理推导步骤 总结 写在前面 近期重温了一下可爱的数字信号处理,又回想起当初被 FT、DTFT、DFT、IDFT 这几兄弟折腾的傻傻分不清的日子,今天特地在此对它们进行一个梳理。 珠玉在前&a…

LDUOJ spj 修改

特判使用教程 感谢涛巨 记录一下,省的以后忘记了。 /* Utility functions for writing output validators for the Kattis* problem format.** The primary functions and variables available are the following.* In many cases, the only functions needed are …

noip 2022 第二题 喵了个喵 meow 在 Lemon LemonLime 中 SPJ Special Judge 测评 配置 设置

noip 2022 第二题 喵了个喵 meow 在 Lemon LemonLime 中 SPJ Special Judge 测评配置设置 比赛目录如下&#xff1a; 用户程序(meow.cpp)如下&#xff1a; #include <bits/stdc.h> using namespace std;template<typename T> inline void read(T &x) {x 0; …

数据库例题(创建数据库SPJ包含S、P、J和SPJ表)

目录 运行说明 例题 例题解答 运行说明 1、运行环境&#xff1a;win10 2、所需步骤&#xff1a; &#xff08;1&#xff09; 通过PowerDesigner软件创建逻辑数据模型(CDM)&#xff0c;再将其转换为物理数据模型(PDM)&#xff0c;再导出为SQL语句。 &#xff08;2&#xff…

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 a

精度需要SPJ 入门&#xff1a; 题目&#xff0c;以整数形式给定圆的半径&#xff0c;输出该圆的周长&#xff0c;该圆的面积。 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; circle1.in 1 circle1.ans 6.283185 3.141593 circle2.in 2 circle2.ans 12.566370 12…

数据库---[复习2]---数据查询---设有一个SPJ数据库,包括S、P、J及SPJ4个关系模式··· ···

文章目录 问题重述数据表S表&#xff1a;P表&#xff1a;J表&#xff1a;SPJ表&#xff1a; 问题解析1. 找出所有供应商的姓名和所在城市2. 找出所有零件的名称&#xff0c;颜色&#xff0c;重量3. 找出使用供应商S1所供应零件的工程号码4. 找出工程项目J2使用的各种零件的名称…

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 c

多解需要SPJ 入门&#xff1a; 题目&#xff1a;输出 Hello, World!&#xff0c;大小写不限。 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; string1.in(空文件&#xff0c;里面没有任何内容) string1.ans Hello, World! 用户程序(string.cpp)如下&#xff1a; …

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 b

多解需要SPJ 入门&#xff1a; 题目&#xff1a;给出一个不小于12的正整数n&#xff0c;请你输出两个合数&#xff0c;使他们的和等于n,注意&#xff0c;每个测试&#xff0c;有多组测试数据. 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; sum1.in 2 12 13 sum1…

如何配置luogu,codeforces的spj(special judge)

洛谷的spj配置很资瓷啊&#xff0c;以下部分引用来自luogu官方链接 codeforces同理 https://www.luogu.org/wiki/show?name%E5%B8%AE%E5%8A%A9%EF%BC%9Aspecial%20judge 搞了一上午1020导弹拦截的spj step1 先从链接中下载那个testlib-master文件解压后&#xff0c;在那个…

SPJ数据库例题(数据库实验)

题目内容&#xff1a; 设有一个SPJ数据库&#xff0c;包括S&#xff0c;P&#xff0c;J&#xff0c;SPJ四个关系模式&#xff1a; S&#xff08;SNO&#xff0c;SNAME&#xff0c;STATUS&#xff0c;CITY&#xff09;&#xff1b; P&#xff08;PNO&#xff0c;PNAME&#xff0…

mysql建立spj_数据库概论——SQL练习一(SPJ零件问题)

系统: MySQL 8.0.19 题目: 三张表: S(SNO, SNAME, STATUS, CITY) P(PNO, PNAME, COLOR, WEIGHT, CITY) J(JNO, JNAME,CITY) SPJ(SNO, PNO, JNO, PRICE, QTY) S表示供应商,各属性依次为供应商号,供应商名,供应商状态值,供应商所在城市; P表示零件,各属性依次为零件号,…

SPJ数据库例题

1道论述题&#xff1a; 书本P71页习题6&#xff1a; 设有一个SPJ数据库&#xff0c;包括S&#xff0c;P&#xff0c;J&#xff0c;SPJ四个关系模式&#xff1a; S&#xff08;SNO&#xff0c;SNAME&#xff0c;STATUS&#xff0c;CITY&#xff09;&#xff1b; P&#xff08;P…