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

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

       最近在重新看《合成孔径雷达成像 算法与实现》这本书,看到“离散傅里叶变换记其逆变换的运算量级为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} 的序列的离散傅里叶变换,再经过加权求和就能得到。。。。。

(累了,择日继续写)

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 离散傅里叶变换DFT)是指将一个离散的信号序列转换为其频域表示的过程。它把一个有限长的离散序列映射到一个有限长的频域序列。 离散傅里叶变换是傅里叶变换在离散输入上的推广。它将一个长度为N的离散序列转换为一个长度为N的频域序列。在时域上,输入序列可以表示为离散时间的采样点集合。在频域上,它表示了输入信号的不同频率成分的幅度和相位。 离散傅里叶变换的计算过程包括两个步骤:首先,通过线性组合计算正弦和余弦函数的离散采样来表示信号;然后,再次对这些离散采样应用傅里叶变换公式以得到频域表示。 离散傅里叶变换广泛应用于信号处理和图像处理等领域。它可以用于频域滤波、快速傅里叶变换(FFT)、频谱分析等。通过DFT,我们能够将一个时域上的信号转换为其频域表示,从而能够更好地理解和处理信号的频率特性。 尽管离散傅里叶变换可以通过直接计算实现,但其计算复杂度较高,特别是对于较长的输入序列。快速傅里叶变换(FFT)是一种高效的算法,能够在O(NlogN)时间复杂度内计算离散傅里叶变换,其被广泛应用于实际应用中。 总之,离散傅里叶变换是将离散序列转换为其频域表示的过程,通过DFT我们可以了解信号的频率特性,并在信号处理中得到广泛应用。 ### 回答2: 离散傅里叶变换DFT)是将离散时间域信号转换成频域信号的一种数学变换方法。在信号处理和图像处理领域中广泛应用。 DFT的基本原理是将一个离散时间域信号分解为一系列复数的正弦和余弦函数分量,表示信号在不同频率上的振幅和相位信息。通过DFT,我们可以得到信号的频率特性,如频谱图、频率分量以及它们在时间上的实现方式。 DFT的计算是通过对输入信号的N个离散采样点进行离散傅里叶变换公式的运算得到的。公式可以描述为: X[k] = Σ(n=0 to N-1) x[n] * W^(-kn) 其中,X[k]表示输出频域信号的第k个频率分量,x[n]表示输入的时间域信号的第n个采样点,N表示信号的采样点数,W为复数旋转因子,定义为W = e^(-j2π/N)。 DFT计算的复杂度是O(N^2),这意味着当信号的采样点数增加时,计算所需的时间也会呈平方倍数增长。为了提高计算效率,可以使用快速傅里叶变换(FFT)算法,将计算复杂度降低到O(NlogN)的级别。 通过DFT,我们可以从时域的输入信号中得到其频域的频谱信息,进而可以进行频域滤波、频谱分析、频率特征提取等一系列信号处理操作。此外,DFT还广泛应用于音频处理、图像处理、通信系统等领域中。 ### 回答3: 离散傅里叶变换(Discrete Fourier Transform,DFT)是一种将离散序列(通常是时域上的信号)转换为频域上的表示的数学工具。它是傅里叶变换在离散信号上的推广。 DFT将一个长度为N的离散序列X={x_0, x_1, x_2, ..., x_{N−1}}转换为其频域表示X'={X_0, X_1, X_2, ..., X_{N−1}}。其中,X_k是X的第k个频谱系数,k=0,1,2,...,N−1。DFT的数学公式是: X_k = ∑_{n=0}^{N−1} x_n * exp(−2πikn/N),k=0,1,2,...,N−1。 DFT将一个信号分解为一系列正弦和余弦波的和,这些波的频率从0到N-1,每个波的振幅由X_k决定。相反地,逆DFTIDFT)可以从频域表示恢复出原始的时域序列。 DFT的应用十分广泛。对于信号处理,DFT可以用于频域滤波、谱分析和频谱合成等。在通信系统中,DFT被广泛应用于正交频分复用(OFDM)技术,其中信号在频域上被划分为多个子载波进行传输,利用DFT实现时域与频域之间的转换。此外,DFT还被应用于图像处理、声音合成、压缩和音频编码等领域。 尽管DFT是一种强大的工具,它的计算复杂度较高,特别是对于大规模的输入序列。为了解决这个问题,人们发展出了快速傅里叶变换(Fast Fourier Transform,FFT)算法,它通过利用DFT的对称性和周期性,将计算复杂度从O(N^2)降低到O(NlogN)。FFT广泛应用于实际工程中,提高了计算效率。 总结来说,DFT是将离散序列转换为频域表示的数学工具,广泛应用于信号处理、通信系统、图像处理等领域。它的计算复杂度较高,但通过FFT等算法可以得到高效的计算方法,为实际应用提供了便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值