MATALB信号处理——信号的变换(6)

2-6快速傅里叶变换

       快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

1.DFT存在的问题和FFT的基本流程

       有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列。这里面要用到复数乘法和复数加法,相比较于实数乘法和实数加法,复数的运算次数要多上好几倍,而我们实际取N的值也很大,所以整个流程其计算量太大,很难实时地处理问题。

       将DFT中的e^{-j\frac{2\pi}{N}nk}定义为指数因子w_{N},因为其指数函数的特殊性,它具有对称性和周期性,可以借助它的性质来减小计算量。

       FFT的基本流程就是:1.把原始的N点序列,依次分解成一系列的短序列;2.求出这些短序列相应的DFT并进行适当组合,达到删除重复计算,减少乘法运算和简化结构的目的。听起来是不是很类似于小学学的组合运算。

2.FFT的计算方法

       计算离散傅里叶变换的快速方法,有按时间抽取的FFT算法和按频率抽取的FFT算法。前者是将时域信号序列按偶奇分排,后者是将频域信号序列按偶奇分排。它们都借助于的两个特点:一是周期性;二是对称性,这里符号*代表其共轭。这样,便可以把离散傅里叶变换的计算分成若干步进行,计算效率大为提高。

1.按时间抽取

       令信号长度为N(2的幂),可以将时域信号序列x(n)分解成两部分,一是偶数部分x(2n),另一是奇数部分x(2n+1),x_{1}(n)=x(2n)x_{2}(n)=x(zn+1),DFT的运算也分成了2部分

x(k)=\sum_{n=0}^{N-1}x(n)w_{N}^{nk}=\sum_{r=0}^{N/2-1}x(r)w_{N}^{2rk}+\sum_{r=0}^{N/2-1}x(2r+1)w_{N}^{(2r+1)k}=\sum_{r=0}^{N/2-1}x(2r)w_{N}^{2rk}+w_{N}^{k}\sum_{r=0}^{N/2-1}x(2r+1)w_{N}^{2rk}

其中w_{N}^{2n}=e^{-j\frac{2\pi}{N}2n}=e^{-j\frac{2\pi}{N/2}n}=w_{N/2}^{n} 

X(k) = \sum_{r=0}^{N/2-1}x(2r)W_{\frac{N}{2}}^{rk}+W_{N}^{k}\sum_{r=0}^{N/2-1}x(2r+1)W_{N\frac{N}{2}}^{rk}=G(k)+W_{N}^{k}H(k)。H(k),G(k)都有N/2个点,从0到N/2-1。

       根据对称性,有w_{N/2}^{r(N/2+k)}=w_{N/2}^{rk},W_{N}^{k+N/2}=-W_{N}^{k},那么X(k+\frac{N}{2})=G(k)-W_{N}^{k}H(k),k=0,1,\cdot \cdot\cdot,\frac{N}{2}-1,因此,一个抽样点数为N 的信号序列x(n)的离散傅里叶变换,可以由两个 N/2抽样点序列的离散傅里叶变换求出。依此类推,这种按时间抽取算法是将输入信号序列分成越来越小的子序列进行离散傅里叶变换计算,最后合成为N点的离散傅里叶变换。

X(k+\frac{N}{2}) = G(k)-W_{N}^{k}H(k),k = 0,1,\cdot\cdot \cdot ,\frac{N}{2}-1

X(k+\frac{N}{2}) = G(k)-W_{N}^{k}H(k),k = 0,1,\cdot\cdot \cdot ,\frac{N}{2}-1

       通常蝶形算法的信号流图来表示离散傅里叶变换运算。例如,N=8的抽样点的信号序列x(n)的离散傅里叶变换,可用如图2所示的FET算法的信号流图来计算。

 

       对于N=2^M,通过M次分解,最后会成为2点的DFT运算,构成了从x(n)到X(k)的M级运算。 N=2点的离散傅里叶变换的计算全由蝶形运算组成,需要M级运算,每级包括N/2个蝶形运算,总共有log_{2}N(M)个蝶形运算。所以,总的计算量为\frac{N}{2}log{_{2}}^{}N次复数乘法运算和Nlog_{2}N次复数加法运算。 

2.按频率抽取

        对于频率抽取,输入序列不是按奇数偶数分解,而是整个序列从中间截断,前后各一半,即

X(k) = \sum_{n=0}^{N/2-1}x(n)W_{N}^{nk}+\sum _{n=N/2}^{N-1}x(n)W_{N}^{nk}=\sum_{n=0}^{N/2-1}x(n)W_{N}^{nk}+\sum _{n=0}^{N/2-1}x(n+\frac{N}{2})W_{N}^{(n+\frac{N}{2})k}=\sum_{n=0}^{N/2-1}[x(n)+W_{N}^{(\frac{N}{2}k)}x(n+N/2)]W_{N}^{nk}

根据指数因子的展开,可以知道W_{N}^{N/2}=-1,W_{N}^{(N/2)k}=(-1)^k\sum_{n=0}^{N/2-1}[x(n)+(-1)^kx(n+N/2)]W_{N}^{nk}再进一步分解为奇数组和偶数组,

X(2r)=\sum_{n=0}^{N/2-1}[x(n)+x(n+N/2)]W_{N}^{2nr}=\sum_{n=0}^{N/2-1}[x(n)+x(n+N/2)]W_{N/2}^{2nr}

X(2r+1)=\sum_{n=0}^{N/2-1}[x(n)-x(n+N/2)]W_{N}^{n(2r+1)}=\sum_{n=0}^{N/2-1}[x(n)+x(n+N/2)]W_{N/2}^{nr}W_{N}^{n}

剩下的和第一种方法类似。

参考资料——《MATLAB信号处理》沈再阳

                        百度百科

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值