快速傅里叶变换FFT算法及其应用 [当文网提供]

快速傅里叶变换FFT算法及其应用 [当文网提供]
快速傅里叶变换FFT算法及其应用 [当文网提供]

快速傅里叶变换FFT算法及其应用

摘要

本文较为系统地阐述了快速傅里叶变换的算法原理及其在数字信号处理等工程技术中的应用。根据抽取方法的不同,一维基2 FFT算法分为两种:频域抽取的FFT算法和时频域抽取的FFT算法。第1节阐述了这两种FFT算法的原理。第2节给出了两种算法的编程思想和步骤。第3节阐述了一维非基2 FFT的两种算法:Cooley-tukey FFT算法和素因子算法(Prime Factor Algorithm)的思想原理,给出了在把一维非基2 DFT的多层分解式转化为二层分解的过程中,如何综合运用这两种算法以达到总运算次数最少的方案;并以20点DFT为例描述了非基2 FFT算法实现的一般步骤。第4节介绍了一维FFT算法在计算连续时间信号的傅里叶变换、离散信号的线性卷积、离散信号压缩和滤波等数字信号处理中的典型应用。第5节把一维FFT变换推广到二维FFT变换,并在一维FFT算法的基础上,给出了二维FFT算法的原理和实现过程。最后在附录中给出了一维DFT 的基2 FFT 算法(包括频域抽取的FFT和IFFT算法、时域抽取的FFT和IFFT 算法),一维任意非基2 FFT算法,二维DFT的基2 FFT 算法以及二维DFT的任意非基2 FFT 算法的详细的Visual C++程序。

本文通过各种流程图和表格,较为深入系统地阐述了FFT的算法原理;运用Matlab编程,通过大量生动的实例,图文并茂地列举出了FFT算法的各种应用,并在每个实例中都附上了完整的Matlab程序,可供读者参考。由于篇幅所限,本文未涉及FFT变换以及其应用的数学理论背景知识。

关键词:FFT算法的应用,一维基2 FFT算法,频域抽取,时域抽取,非基2 FFT算法,Cooley-Tukey算法,素因子算法,线形卷积,信号压缩和滤波,二维FFT算法

快速傅里叶变换FFT算法及其应用

摘要

目录

摘要 0

目录 (2)

1 一维DFT的快速算法—FFT (3)

1.1频域抽取的基2算法 (3)

1.1.1 正变换的计算 (3)

1.1.2 逆变换的计算 (6)

1.2时域抽取的基2算法 (7)

2 一维基2 FFT算法编程 (8)

3 一维任意非基2 FFT算法 (12)

3.1C OOLEY-T UKEY FFT算法 (12)

3.2素因子算法(PFA) (13)

3.3一维任意非基2FFT算法 (15)

4 一维FFT算法的应用 (18)

4.1利用FFT计算连续时间信号的傅里叶变换 (18)

4.2利用FFT计算离散信号的线性卷积 (21)

4.3利用FFT进行离散信号压缩 (23)

4.4利用FFT对离散信号进行滤波 (26)

4.5利用FFT提取离散信号中的最强正弦分量 (29)

5 二维DFT的快速变换算法及应用简介 (34)

5.1二维FFT变换及其算法介绍 (34)

5.2二维FFT变换算法的应用 (35)

参考文献 (35)

附录 (36)

1.一维DFT的基2FFT算法V ISUAL C++程序 (36)

(1)频域抽取的FFT和IFFT算法 (36)

(2)时域抽取的FFT和IFFT算法 (41)

2.一维任意非基2FFT算法V ISUAL C++程序 (46)

快速傅里叶变换FFT 算法及其应用

3.二维DFT 的基2 FFT 算法V ISUAL C++程序 ............................................... 51 4.二维DFT 的任意非基2 FFT 算法V ISUAL C++程序 .. (59)

1 一维DFT 的快速算法—FFT

当序列[]f n 的点数不超过N 时,它的N 点D FT 定义为

21

[][]01N i

k n

N

n F k f n e k

N π

--==

≤≤-∑

(1)

反变换ID FT 定义为 21

1[][]01N i

k n

N

k f n F k e

n

N N

π-==

≤≤-∑

(2)

二者形式相似,快速算法的原理一样,这里先就其正变换进行讨论。令

2/i N

N W e

π-=,当k 依次取为0,1,2,,1N - 时,可表示为如下的方程组:

00

01

02

0(

11011

12

1(1)2021222(1)

(1)0

(

1)1(1)(1)

[0][0][1][2][1]

[1][0][1][2][

1]

[2][0][1][2][

1][1][0][1]

[1]

N N N N N N N N N N

N N N N N

N N N N N

N N

F f W f W f W f N W F f W f W f W f

N W F f W f

W f

W f N W F N f W f W f N W -------?=

++++-=++++-=

+++

+

-?-=+

++-

?

??

??

??

(3)

由上式可见,直接按照定义计算N 点序列的N 点D FT 时,每行含N 个复乘和N 个加,从而直接按定义计算点的总计算量为2N 个复乘和2N 个加。当N 较大时,2N 很大,计算量过大不仅耗时长,还会因字长有限而产生较大的误差,甚至造成计算结果不收敛。所谓快速傅里叶变换就是能大大减少计算量而完成全部点计算的算法。下面介绍两种经典的D FT 的快速算法:频域抽取的F F T 算法和时域抽取的F F T 算法。

1.1 频域抽取的基2算法

1.1.1 正变换的计算

这里仅介绍基2算法,即是2的整次幂的情况。由定义

1

[][]01N kn

N

n F k f n W k N -==

≤≤-

(4)

1 一维DFT 的快速算法—FFT

把[]f n 分成两半,即[]f n 和[/2]f n N +(0/21)n N ≤≤-,代入(4)式得 /21/21

(/2)

[][][/2]01N N

kn

k n N N

N

n n F k f n W f n N W k N --+===

+

+≤≤-∑

(5)

由于

(/2)

/2

(1)k n N kn kN k kn

N

N N

N

W W W W +==-

(5)式两项又可合并为

/21

[]{[](

1)[/2]}

01N k

k n

N n F k f n f n N

W k

N -

==

+-+≤≤-

(6) 当2k r =为偶数时,注意到(1)1k -=,222/kn rn i rn N N N W W e π-==/2rn N W =,(6)式变为

/21

/20/21

/2

[2]([][/2])()()

0/21

N rn

N n N rn

N n F r f n f n N W g n W G r r N -

=-==

++=

=≤≤-∑

(7)

当21k r =+为奇数时, (21)2(21)//2kn r n i r n N n rn N N N N W W e W W π+-+===,(6)式变为

/21

/2

0/21

/20

[21]{([][/2])}()()

0/21

N n rn

N N n N rn

N n F r f n f n N W W p n W P r r N -

=-=+=

-+=

=≤≤-∑

(8)

这样就把一个N 点序列([]f n )的N 点D FT ([]F k )计算化成了两个/2N 点序列([]g n 和[]p n )的/2N 点D FT ([]G r 和[]P r )计算。由[]f n 划分成[]g n 和[]p n 的计算量为N 个加,即

[][/2]f n f n N ++和[][/2],0/21f n f n N n N -+≤≤-

和/2N 个乘,即

([][/2]),0/21n

N f n f n N W n N -+≤≤-

由于[]g n 算出的/2N 点D FT ,是[]f n 的N 点D FT ([]F k )中k 为偶数的那一半,由[]p n 算出的则是k 为偶数的那一半,故需要把偶数k 的[]F k 抽出来放在一起作为[]g n 的D FT (()G r )输出,同时把奇数k 的[]F k 抽出来放在一起作为[]p n 的D FT (()P r )输出。由于k 是频域变量,故这种算法称为频域抽取的

F F T

算法。

快速傅里叶变换FFT 算法及其应用

接着,两个/2N 点D FT 仍可用上述方法各经/4N 个乘/2N 个加划分成两个

/4

N 点D FT (同时还要做相应的频域抽取),从而共划分成4个/2N 点D FT ,

总划分计算量仍是N 个加和/2N 个乘。这样的划分可一步步做下去,不难看出,每步的总划分计算量都是N 个加和/2N 个乘。

经过1M -步的划分后就划成了/2N 个如下两点D FT 的计算问题

00

01

22

10

110

2

2

2()A aW bW a b

B aW

bW

a b W ?????=+=+??=+=-??? (9)

上式所需计算量是2个加和1个乘,于是完成/2N 个两点D FT 的总计算量仍是N 个加和/2N 个乘。从而完成全部N 点D FT 的总计算量2log M N N N ?=个加和2/2(/2)log M N N N ?=个乘,这比直接按定义计算所需的2N 个乘和加要少得多。例如,1021024N ==,10M =,用F F T 算法计算所需的乘法个数为

/2M N ?51024

=?,而直接按定义计算所需的乘法个数为210241024N =?,二

者相差1024/5200≈倍。若直接计算需半小时,而用F F T 计算只需9s 即可完成,可见其效率之高,而且N 越大,F F T 的效率提高越明显。

图1 频域抽取的8点FFT 计算流图

一般情况下,由于做了1M -次分奇偶的抽取,此算法最后的/2N 个两点

D FT

计算出的[]F k 不是顺序抽取的。次序的变化可用二进码来说明:第一次抽

取所分的奇偶是由二进码第1位是1或0来区分的,该位为0时为偶数,该位为1时为奇数,第二次抽奇偶是由二进码第2位是1或0来区分的……,每次抽取

1 一维DFT 的快速算法—FFT

都是把偶数项放在前(左)边,把奇数项放在后(右)边,从而抽取以后数的二进码是按照二进制位从左向右依次排列的,和普通二进制数从右向左依次排列的的规律正好相反,所以称为倒位序。在计算出[]F k 之后要把倒位序变成顺序。 1.1.2 逆变换的计算

所谓逆变换是指由[]F k 求[]f n 的计算,若直接按定义

1

1[][]01N kn

N

k f n F k W

n N N

--==

≤≤-∑

做计算,则除了求和号和正变换相同的计算量外,每算一个[]f n 都还需再多做一个乘1/N 的乘法运算。故按定义完成全部N 点D FT 的总计算量是2N 个加和

(1)N N +个乘。下面从图导出它的快速算法,先讨论第

3列的2点D FT 的逆运

算如何完成。由式(7)得,

2()a b A

a b W B

+=??-?=? 由上式不难解出

20

21()

21()

2

a A B W

b A B W --=

+=

- (10)

图2 频域抽取的8点IFFT 计算流图

快速傅里叶变换FFT 算法及其应用

此计算过程如图2所示,可以看出:左边各列的划分计算也都是由/2N 个碟形运算来完成的,只是各碟形运算所乘的相移因子W 不同。把每个碟形运算都用图的办法变成对应的逆运算,并把它们按输入在左、输出在右重新排列,就得到了全部N 点ID FT 的计算流图。给出了8N =的示例,图中先对顺序输入的[]F k 做1M -次的频域抽取,

并把3个乘1/2的运算合成了一个乘1/8的运算放在

了最前边,然后就开始做求逆的碟形运算。

1.2 时域抽取的基2算法

比较正变换D FT 和反变换ID FT 的定义式

1

0[][]01N kn

N

n F k f n W k N -==

≤≤-∑

1

1[][]01N kn

N

k f n F k W

n N N

--==

≤≤-∑

可见,去掉乘1/N 的运算,把1W -换成W ,交换[]F k 、[]f n 和k 、n ,反变换定义式就变成了正变换的定义式。对图2做这些变换,则得到图3的流程图。对图1做这些变换,则得到图4的流程图。这就是时域抽取的算法流图。进行碟形运算之前,先要对顺序的时域输入序列进行1M -次的奇偶抽取,故称为时域抽取的F F T 算法。

图3 时域抽取的8点FFT 计算流图

2 一维基2 FFT 算法编程

比较图2和图3不难看出,两种算法的计算量是完全一样的。这里先算出

/2

N 个两点的D FT

00

01

2

2

()(/2)()(/2)

A f n W f n N W f n f n N ??=++=++

1011

22()(/2)()(/2)B f n W f n N W f n f n N ??=++=-+ (11)

图4 时域抽取的8点IFFT 计算流图

然后把/2N 个两点的D FT 组合成/4N 个4点的D FT ,再把/4N 个4点的

D FT 组合成/8N 个8点的D FT ,经过1M -次的组合之后,就得到了顺序N 点D FT

计算结果。算法原理参考文献【4】。

2 一维基2 FFT 算法编程

以频域抽取的基2 FFT 正变换为例,对FFT 的信号流图进行讨论,以找到FFT 算法的规律。

1)分级

在进行D FT 变换的过程中,从N 点D FT 到两点D FT 共分了M 级,如图1所示,从左到右依次为1m =级,2m =级,…,m M =级。

2)倒位序

快速傅里叶变换FFT 算法及其应用

在频域抽取的基2 FFT 算法中,输出数据不是按照序列的先后顺序排列的,这是由于变换过程中,输出按奇、偶抽取的缘故。如果将序列[]x n 中标号n 用二进制值0212()M M n n n -- 表示,那么在FFT 信号流图输入端,[]x n 位于1202()M M n n n -- 处,

称为倒序。以8点FFT 为例,顺序和倒序的关系如表1所示。

从表1可以看出,一个自然顺序二进制数,是在最低位加1,逢2向左移位;而倒序数的顺序是在最高位加1,逢2向右移位。用i 表示顺序数,j 表示倒序数,k 表示位权重。对于一个倒序数j 来说,下一个倒序数可以按下面的方法求:先对最高位加1,相当于十进制运算/2j N +。如果/2j N <,说明二进制最高位为0,则直接由/2j N +得到下一个倒序值;如果/2j N ≥,说明二进制最高 位为1,则将j 的最高位变为0,通过/2j j N ?-实现,同时令/2k k ?,接着判断次高位是否为0,直到位为0时,令j j k =+ 。归结起来算法流程图如图5所示。

2 一维基2 FFT 算法编程

图5 倒位序程序流程图 图6 频域抽取FFT 程序流程图 3)蝶形运算单元和同址计算

频域抽取的信号流图中,基本的运算结构如图7所示,该运算结构的形状像蝴蝶,故称为“蝶形运算单元”。

在这一结构中,DFT 和IDFT 运算关系分别为

1111[][][]

[]([][])m m m r m m m N

F p F p F q F p F p F q W ----=+???=-??

1111[]([][])/2[]([][])/2

r

m m m N r m m m N f p f p f q W f p f p f q W ------?=+??=-?? (12)

快速傅里叶变换FFT 算法及其应用

(a) 两点DFT 的计算

(b) 两点IDFT 的计算

图7 频域抽取FFT 算法流图中第m 级碟形单元

而在时域抽取的信号流图中,基本的运算结构如图8所示。在这一结构中,DFT 和IDFT 运算关系分别为

1111[][][][][][]r

m m m N r m m m N

F p F p F q W F p F p F

q W ----?=+??=-??

1111[]([][])/2

[]([][])/2

m m m r m m m N f p f p f q f p f p f q W -----=+???=-?? (13)

(a) 两点DFT 的计算

(b) 两点IDFT 的计算

图8 时域抽取FFT 算法流图中第m 级碟形单元

其中,p 、q 分别表示该蝶形运算单元的上下节点的序号。可以看出参与运算的输入序号p ,输出序号仍为q ,并且该运算不涉及到其它的点,因此我们可以将输出的结果仍然放在数组中,称这样的操作为同址计算。也就是说,共同占有同一个存储单元。

4)寻址和相移因子r N W 的计算

时域抽取基2 FFT 信号流图中,每一级有个蝶形单元。每一级的个蝶形单元又可以分为若干组,每一组具有相同的结构和因子的分布。

如图1所示,第1级分为1组,第2级分为2组,…,第m 级分为12m -组。

3 一维任意非基2 FFT 算法

在第m 级中,相邻组之间的间距(也即每个分组所含节点数)为12M m +-,每个蝶形单元的上下节点之间的距离(也即每个分组所含碟形单元数)为2M m -。每组的相移因子

22cos(

)sin(

)r

N W r i r N

N

ππ=-,其中m-1

r=(l-1)2

,

? 0,1,l =,21M m --

综合以上各步骤,得到频域抽取FFT 程序流程图如图6所示。采用类似的步骤可得到频域抽取IFFT 流程图、时域抽取FFT 与IFFT 流程图(略)。

频域抽取FFT 算法、时域抽取FFT 算法的Visual C++源程序分别见附录1.(1),1.(2)。在Matlab 中,傅里叶变换及其逆变换分别用dwt()和idwt()函数实现。

3 一维任意非基2 FFT 算法

3.1 Cooley-Tukey FFT 算法

F F T

的核心是将一层运算映射为二层运算。作N 点F F T 时,若N 不是素数,

则N 可分解为12N N N =,那么由[]f n 的D FT

1

[][]01N nk

N

n F k f n W k N -==

≤≤-

(14)

通过映射:

21211221121

12201,0101,01n N n n n N n N k k N k k N k N =+≤≤-≤≤-=+≤≤-≤≤-

(15)

可得到

212112211121221122()()

()

N n n k N k N n k N N n k n k N n k nk

N N

N

W W W +++++==

而12N N N =,1

2

N N N W W =,2

1

N N N W W =,可化简为

11

21

22

1

2

n k n k n k nk N N N N W W W W = (16)

从而式(14)转化为

2122

21112

1211

1

12120

[,]([,])N N n k n k n k

N N

N n n F k k W

W

f n n W --===∑∑

(17)

其中

112201,01k N k N ≤≤-≤≤-。

以20点F F T 为例,1220,5,4N N N ===,映射方式为:124n n n =+,

快速傅里叶变换FFT 算法及其应用

125k k k =+,则计算流图如图9

所示。

3.2 素因子算法(Prime Factor Algorithm, PFA)

当Cooley-Tukey FFT 算法中的1N 、2N 互素的话,相移因子21

n k N W 可通过选择

12,,n n 12,k k 前的特殊系数而消去,FFT 的算法进一步的简化。

121

1

22

121122

01,0101,01n A n B n n N n N k C k D k k N k N =+≤≤

-≤≤

-

=+≤

≤-≤≤- (18)

当A B C D 、、、满足以下条件

0m od 0m od AD N BC N

≡≡ (19)

图9 Cooley-T ukey 20 点FFT 算法

3 一维任意非基2 FFT 算法

2

1

m o d m o d A C N N B D N N ≡≡

(19)

时,有

1212

11122122

211122

11

2

2

12

()()

()

An Bn C k D k nk

N N

AC n k AD n k BC n k BD n k N N n k N n k N n k

n k N N W W W W

W W ++++++==== (20)

于是式(14)化简为 2122

1121211

1

12120

[,]([,])N N n k n k

N N n n F k k W

f n n W --===

∑∑ (21)

从而消去了相移因子21

n k N W 。同样以20点F F T 为例,修改映射方式为:

20,N = 125,4N N ==

121245,04,03n n n n n =+≤≤≤≤ (22) 12121625,04,03k k k k k =+≤≤≤≤ (23) 则由式(22)得到的映射关系如表2,由式(23)得到的映射关系如表3,计算流图如图10所示。

快速傅里叶变换FFT 算法及其应用

3.3 一维任意非基2 FFT 算法

对于非素数N 点D FT ,对N 做因式分解

12l N N N N = (24) 令22l l N N N = ,则12l N N N =。于是式(24)中多层F F T 转化为二层F F T 。如果1N 与2l N 互素,那么采用PFA 算法进行映射,否则采用Cooley-Tukey FFT 算法(此时需乘以相移因子)。22l l N N N = 可采用同样的方法分解成2N 个3l N 点

D FT

,其中33l l N N N = ,依此类推,直到D FT 长度为l N 。 可以证明,复乘的总次数不大于

12()l N N N N l +++- (25)

例如,若63337N ==??,则复乘总次数至多为63(3373)630???-=。而用基2的F F T 算法计算64点D FT ,需要的复乘总次数为192。这说明,将N 分解得越细,运算量越少。实际中,常常将输入序列补零,使得N 成为2的幂次数,这样能够减少复乘运算的次数。

3 一维任意非基2 FFT 算法

图10 素因子(PFA)20 点FFT 算法

再以20点F F T 为例,进行如下三层因式分解

123522

N N N N ==??

即15N =,23224N =?=,由于5与4互素,所以第一层采用PFA 算法,相应的二层映射为

12312345,04,03

n n n n n =+≤≤≤≤

1231231625,04,03k k k k k =+≤≤≤≤

由于2与2不互素,所以第二层采用Cooley-Tukey FFT 算法,相应的二层映射为

2323232,01,01n n n n n =+≤≤≤≤

快速傅里叶变换FFT 算法及其应用

2323232,01,01k k k k k =+≤≤≤≤

总的F F T 变换公式如式(26),计算流图如图11所示。

图11 多层分解时20 点FFT 算法

321333222113

23

2

13211

1

1

1231230

[,,]{([,,])}N N N n k n k n k n k

N N N N n n n F k k k W

W

W

f n n n W ---====

∑∑∑

4 一维FFT 算法的应用

3332221132111

4

2

4

2

12350

{([,,])}n k n k n k n k

n n n W

W

W

f n n n W ====

∑∑∑

(26)

比较正变换D FT 和反变换ID FT 的定义式可知,在正变换前加上乘1/N 的运算,把W 换成1W -,并交换[]f n 、[]F k 和n 、k ,就得到反变换的算法。

一维任意非基2 FFT 算法的Visual C++源程序见附录2。在Matlab 中,傅里叶变换及其逆变换也分别用dwt()和idwt()函数实现。

4 一维FFT 算法的应用

4.1 利用FFT 计算连续时间信号的傅里叶变换

设()x t 是连续时间信号,并假设0t <时()0x t =,则其傅里叶变换由下式给出

()()i t

X x t e

dt ωω∞

-=

?

令Γ是一个固定的正实数,N 是一个固定的正整数。当

,0,1,2,,1k k N ω=Γ=- 时,利用FFT 算法可计算()X ω。

已知一个固定的时间间隔T ,选择T 足够小,使得每一个T 秒的间隔

(1)nT t n T

≤<+内,()x t 的变化很小,则式中积分可近似为

(1)0()()()

n T iw t

nT

n X e

dt x nT ω∞

+-==

∑?

(

1)0

1[

]()

i t t n T

t n T

n e x n T i ωω

-=+==-=

∑ 0

1()i T

i nT

n e

e

x nT i ωωω

-∞

-=-=

∑ (27)

假设N 足够大,对于所有n N ≥的整数,幅值()x nT 很小,则式(27)变为 1

1()()i T N i nT

n e

X e

x nT i ωωωω

---=-=

∑ (28)

当2/k N T ωπ=时,式(28)两边的值为 2/2/1

2/0

211(

)()[]2/2/i k N i k N

N i nk N

n k e

e

X e

x nT X k N T

i k N T

i k N T

ππππππ----=--=

=

∑ (29)

其中[]X k 代表抽样信号[]()x n x nT =的N 点D FT 。最后令2/N T πΓ=,则上式

快速傅里叶变换FFT 算法及其应用

变为

2/1()[]

0,1,2,,12/i k N

e

X k X k k N i k NT

ππ--Γ=

=- (30)

首先用FFT 算法求出[]X k ,然后可用上式求出0,1,2,,1k N =- 时的

()X k Γ。

应该强调的是,式(28)只是一个近似表示,计算得到的()X ω只是一个近似值。通过取更小的抽样间隔T ,或者增加点数N ,可以得到更精确的值。如果

B ω>时,幅度谱()X ω很小,对应于奈奎斯特抽样频率2s B ω=,抽样间隔T 选

择/B π比较合适。如果已知信号只在时间区间10t t ≤≤内存在,可以通过对

1n T t >时的抽样信号[]()x n x nT =补零,使N

足够大。

例1 利用FFT 计算傅里叶变换 如图12所示的信号

1

02()0

t t x t -≤

?其它

其傅里叶变换为:

2

cos()sin()

()2i X e

i

ω

ωωωωω

--=

利用下面的命令,可得到()x t 的近

似值和准确值。 图12 连续时间信号x(t)

N=input('Input N:'); T=input('Input T:'); %计算X(w)近似值 t=0:T:2;

x=[t-1 zeros(1,N-length(t))]; X=fft(x);

gamma=2*pi/(N*T); k=0:10/gamma;

Xapp=(1-exp(-i*k*gamma*T))/(i*k*gamma)*X; %计算真实值X(w)

w=0.05:0.05:10;

Xact=exp(-i*w)*2*i.*(w.*cos(w)-sin(w))./(w.*w); plot(k*gamma,abs(Xapp(1:length(k))),'o',w,abs(Xact)); legend('近似值','真实值'); xlabel('频率(rad/s)');ylabel('|X|')

运行程序后输入N=128,T=0.1,此时0.4909Γ=,得到实际的和近似的傅里

FFT超全快速傅里叶

快速傅里叶变换 FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。 虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。 现在圈圈就根据实际经验来说说FFT结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。 采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示 采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高

实验二 快速傅里叶变换(FFT)及其应用

《数字信号处理》课程 (2010-2011学年第1学期)成绩: 实验二快速傅里叶变换(FFT)及其应用 学生姓名:闫春遐 所在院系:电子信息工程学院自动化系 年级专业:2008级自动化系 学号:00824049 指导教师:王亮 完成日期:2010年9月27日

实验二 快速傅里叶变换(FFT )及其应用 一、实验目的 (1)在理论学习的基础上,通过本实验,加深对FFT 的理解,熟悉MATLAB 中的有关函数。 (2)应用FFT 对典型信号进行频谱分析。 (3)了解应用FFT 进行信号频谱分析过程可能出现的问题,以便在实际中正确应用FFT 。 (4)应用FFT 实现序列的线性卷积和相关。 二、实验内容 实验中用到的信号序列: a )高斯序列 2 ()015()0 n p q a e n x n --??≤≤=???其他 b )衰减正弦序列 sin(2)015 ()0an b e fn n x n π-?≤≤=?? 其他 c )三角波序列 03()847 0c n n x n n n ≤≤?? =-≤≤??? 其他 d )反三角波序列 403()447 0d n n x n n n -≤≤?? =-≤≤??? 其他 上机实验内容: (1)观察高斯序列的时域和幅频特性,固定信号()a x n 中参数8p =,改变q 的值,使q 分别等于2、4、8,观察他们的时域和幅频特性,了解当q 取不同值时,对信号的时域和幅频特性的影响;固定8q =,改变p ,使p 分别等于8、13、

14,观察参数p变化对信号序列的时域及幅频特性的影响,注意p等于多少时,会发生明显的泄漏现象,混叠是否也随之出现?记录实验中观察到的现象,绘出相应的时域序列和幅频特性曲线。 解答: >> n=0:1:15; >> xn=exp(-(n-8).^2/2); >> subplot(1,2,1);stem(n,xn);xlabel('t/T');ylabel('x(n)'); >> xk1=fft(xn);xk1=abs(xk1); >> subplot(1,2,2);stem(n,xk1);xlabel('k');ylabel('X(k)'); >> xn=exp(-(n-8).^2/4); >> subplot(1,2,1);stem(n,xn);xlabel('t/T');ylabel('x(n)'); >> xk1=fft(xn);xk1=abs(xk1); >> subplot(1,2,2);stem(n,xk1);xlabel('k');ylabel('X(k)');

快速傅里叶变换(FFT)课程设计

快速傅里叶变换(FFT)的DSP 实现 (马灿明 计算机学院 计算机应用技术 2110605410) 摘要:本文对快速傅里叶变换(FFT)原理进行简单介绍后,然后介绍FFT 在TMS320C55xx 定 点DSP 上的实现,FFT 算法采用C 语言和汇编混合编程来实现,算法程序利用了CCS 对其结果进行了仿真。 关键字:FFT ,DSP ,比特反转 1.引言 傅里叶变换是将信号从时域变换到频域的一种变换形式,是信号处理领域中一种重要的分析工具。离散傅里叶变换(DFT )是连续傅里叶变换在离散系统中的表现形式。由于DFT 的计算量很大,因此在很长一段时间内使其应用受到很大的限制。 20世纪60年代由Cooley 和Tukey 提出了快速傅里叶变换(FFT )算法,它是快速计算DFT 的一种高效方法,可以明显地降低运算量,大大地提高DFT 的运算速度,从而使DFT 在实际中得到了广泛的应用,已成为数字信号处理最为重要的工具之一。 DSP 芯片的出现使FFT 的实现变得更加方便。由于多数的DSP 芯片都能在单指令周期内完成乘法—累加运算,而且还提供了专门的FFT 指令(如实现FFT 算法所必需的比特反转等),使得FFT 算法在DSP 芯片上实现的速度更快。本节首先简要介绍FFT 算法的基本原理,然后介绍FFT 算法的DSP 实现。 2.FFT 算法的简介 快速傅里叶变换(FFT )是一种高效实现离散傅里叶变换(DFT )的快速算法,是数字信号处理中最为重要的工具之一,它在声学,语音,电信和信号处理等领域有着广泛的应用。 2.1离散傅里叶变换DFT 对于长度为N 的有限长序列x(n),它的离散傅里叶变换(DFT )为 1,1,0, )()(1 0-==∑-=N k W n x k X n n nk N (1) 式中, N j N e W /2π-= ,称为旋转因子或蝶形因子。 从DFT 的定义可以看出,在x(n)为复数序列的情况下,对某个k 值,直接按(1) 式计算X(k) 只需要N 次复数乘法和(N-1)次复数加法。因此,对所有N 个k 值,共需要N 2 次复数乘法和N(N-1)次复数加法。对于一些相当大有N 值(如1024点)来说,直接计算它的DFT 所需要的计算量是很大的,因此DFT 运算的应用受到了很大的限制。 2.2快速傅里叶变换FFT 旋转因子W N 有如下的特性。 。对称性: 2/N k N k N W W +-= 。周期性: N k N k N W W += 利用这些特性,既可以使DFT 中有些项合并,减少了乘法积项,又可以将长序列的DFT

傅里叶变换及应用

傅里叶变换在MATLZB里的应用 摘要:在现代数学中,傅里叶变换是一种非常重要的变换,且在数字信号处理中有着广泛的应用。本文首先介绍了傅里叶变换的基本概念、性质及发展情况;其次,详细介绍了分离变数法及积分变换法在解数学物理方程中的应用。傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号,再利用傅立叶反变换将这些频域信号转换成时域信号。应用MATLAB实现信号的谱分析和对信号消噪。 关键词:傅里叶变换;MA TLAB软件;信号消噪 Abstract: In modern mathematics,Fourier transform is a transform is very important ,And has been widely used in digital signal processing.This paper first introduces the basic concepts, properties and development situation of Fourier transform ;Secondly, introduces in detail the method of separation of variables and integral transform method in solving equations in Mathematical Physics.Fourier transformation makes the original time domain signal whose analysis is difficult easy, by transforming it into frequency domain signal that can be transformed into time domain signal by inverse transformation of Fourier. Using Mat lab realizes signal spectral analysis and signal denoising. Key word: Fourier transformation, software of mat lab ,signal denoising 1、傅里叶变换的提出及发展 在自然科学和工程技术中为了把较复杂的运算转化为较简单的运算,人们常常采用所谓变换的方法来达到目的"例如在初等数学中,数量的乘积和商可以通过对数变换化为较简单的加法和减法运算。在工程数学里积分变换能够将分析运算(如微分,积分)转化为代数运算,正是积分变换这一特性,使得它在微分方程和其它方程的求解中成为重要方法之一。 1804年,法国科学家J-.B.-J.傅里叶由于当时工业上处理金属的需要,开始从事热流动的研究"他在题为<<热的解析理论>>一文中,发展了热流动方程,并且指出如何求解"在求解过程中,他提出了任意周期函数都可以用三角级数来表示的想法。他的这种

详解FFT(快速傅里叶变换FFT.

kn N W N N 第四章 快速傅里叶变换 有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长 序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换 (FFT). 1965 年,Cooley 和 Tukey 提出了计算离散傅里叶变换(DFT )的快 速算法,将 DFT 的运算量减少了几个数量级。从此,对快速傅里叶变换(FFT ) 算法的研究便不断深入,数字信号处理这门新兴学科也随 FFT 的出现和发 展而迅速发展。根据对序列分解与选取方法的不同而产生了 FFT 的多种算 法,基本算法是基2DIT 和基2DIF 。FFT 在离散傅里叶反变换、线性卷积 和线性相关等方面也有重要应用。 快速傅里叶变换(FFT )是计算离散傅里叶变换(DFT )的快速算法。 DFT 的定义式为 N ?1 X (k ) = ∑ x (n )W N R N (k ) n =0 在所有复指数值 W kn 的值全部已算好的情况下,要计算一个 X (k ) 需要 N 次复数乘法和 N -1 次复数加法。算出全部 N 点 X (k ) 共需 N 2 次复数乘法 和 N ( N ? 1) 次复数加法。即计算量是与 N 2 成正比的。 FFT 的基本思想:将大点数的 DFT 分解为若干个小点数 DFT 的组合, 从而减少运算量。 W N 因子具有以下两个特性,可使 DFT 运算量尽量分解为小点数的 DFT 运算: (1) 周期性: ( k + N ) n N = W kn = W ( n + N ) k (2) 对称性:W ( k + N / 2 ) = ?W k N N 利用这两个性质,可以使 DFT 运算中有些项合并,以减少乘法次数。例子: 求当 N =4 时,X(2)的值

快速傅里叶变换在OFDM系统中的应用

快速傅里叶变换在OFDM系统中的应用 李晓亮,王红军 (1.江西鹰潭工业技术研究所,江西鹰潭335001; 2.解放军电子工程学院,安徽合肥 230031) 摘要:本文简要分析了未来OFDM数字通信系统的基本模型和可能采用的信号调制与解调的方法,在此基础上详细地解析了数据序列经过快速傅里叶逆变换/快速傅里叶变换(IFFT/FFT)后的输出结果与M进制数字调制解调之间的联系,并给出了能够实现OFDM调制解调的合适的IFFT/FFT算法,实际仿真结果表明快速傅里叶变换及反变换在未来OFDM技术中具有一定的实用价值。 关键词:正交频分复用技术;调制;解调; IFFT;FFT Application of IFFT /FFT in OFDM Systems LIXiao-liang , WANGHong-jun (1.The Industry Technology Institute, Yingtan 335001,China;2. PLA Electronic Engineering Institute, Hefei230037,China) Abstract: On the basis of the analysis of the basic model of OFDM system and its potential means of modulating and demodulating, this paper discusses the mutual relation of the sequence of data IFFT/FFT and the result of M-modulation and M-demodulation in detail, then gives the appropriate modulation and demodulation algorithm of IFFT/FFT to OFDM system. The simulation result shows the definite importance of IFFT/FFT to OFDM in future practical application. Key words: OFDM technology; Modulation; Demodulation; IFFT; FFT

fft快速傅里叶变换 c语言实现

#include #include #include #define N 1000 /*定义复数类型*/ typedef struct{ double real; double img; }complex; complex x[N], *W; /*输入序列,变换核*/ int size_x=0; /*输入序列的大小,在本程序中仅限2的次幂*/ double PI; /*圆周率*/ void fft(); /*快速傅里叶变换*/ void initW(); /*初始化变换核*/ void change(); /*变址*/ void add(complex ,complex ,complex *); /*复数加法*/ void mul(complex ,complex ,complex *); /*复数乘法*/ void sub(complex ,complex ,complex *); /*复数减法*/ void output(); int main(){ int i; /*输出结果*/ system("cls"); PI=atan(1)*4; printf("Please input the size of x:\n"); scanf("%d",&size_x); printf("Please input the data in x[N]:\n"); for(i=0;i

实验二应用快速傅里叶变换对信号进行频谱分析

实验二、应用快速傅里叶变换对信号进行频谱分析 一、 实验目的 1、 加深对DFT 算法原理和基本性质的理解,熟悉FFT 算法原理。 2、 掌握应用FFT 对信号进行频谱分析的方法。 3、 通过本实验进一步掌握频域采样定理。 4、 了解应用FFT 进行信号频谱分析过程中可能出现的问题,以便在实际中 正确应用FFT 。 二、 实验原理 1、 一个连续时间信号()a x t 的频谱可以用它的傅里叶变换表示为: ()()j t a a X j x t e dt +∞ -Ω-∞ Ω=? 如果对信号进行理想采样,得: ()()a x n x nT =, 其中,T 为采样周期。对()x n 进行Z 变换,得: ()()n n X Z x n z +∞ -=-∞ = ∑ 当jwt z e -=时,我们便得到序列傅氏变换SFT : ()()jw jwn n X e x n e +∞ -=-∞ = ∑ 其中w 称为数字角频率:/s w T F =Ω=Ω。

2、12()[()]jw a m w m X e X j T T T π+∞=-∞=-∑,序列的频谱是 原模拟信号频谱的周期延拓,这样,可以通过分析序列的频谱,得到相应连续信号的频谱。 3、离散傅里叶变换(DFT )能更好的反映序列的频域特性。 当序列()x n 的长度为N 时,它的离散傅氏变换为: 1 0()[()]()N kn N n X k DFT X n x n W -===∑ 它的反变换为: 10 1()[()]()N kn N n x n IDFT X k X k W N --===∑ 比较Z 变换式和DFT 式,令k N z W -=,则 10 ()|()[()]k N N kn N z W n X z x n W DFT X n --====∑ 因此有 ()()|k N z W X k X z -== 即k N W -是z 平面单位圆上幅角为2/w k N π=的点,也即是将单位圆 N 等分后的第k 点。所以()X k 是()x n 的Z 变换在单位圆上的 等距采样,或者说是序列傅氏变换的等距采样。 三、 如何提高估计精度 增大做FFT 运算的点数 四、 幅频特性曲线及结果分析

实验四 快速傅里叶变换(FFT)

实验四 快速傅里叶变换(FFT ) 4.1实验目的 1)加深对快速傅里叶变换(FFT )基本理论的理解; 2)了解使用快速傅里叶变换(FFT )计算有限长序列和无限长序列信号频谱的方法; 3)掌握用MATLAB 语言进行快速傅里叶变换时常用的子函数。 4.2实验原理 1)用MATLAB 提供的子函数进行快速傅里叶变换 从理论学习可知,DFT 是唯一在时域和频域均为离散序列的变换方法,它适用于有限长序列。尽管这种变换方法是可以用于数值计算的,但如果只是简单的按照定义进行数据处理,当序列长度很大时,则将占用很大的内存空间,运算时间将很长。 快速傅里叶变换是用于DFT 运算的高效运算方法的统称,FFT 只是其中的一种。FFT 主要有时域抽取算法和频域抽取算法,基本思想是将一个长度为N 的序列分解成多个短序列,如基2算法、基4算法等,大大缩短了运算的时间。 MATLAB 中提供了进行快速傅里叶变换(FFT )的子函数,用fft 计算DFT ,用ifft 计算IDFT 。 2)用FFT 计算有限长序列的频谱 基本概念: 一个序号从1n 到2n 的时域有限长序列()x n ,它的频谱()j X e ω定义为它的离散时间傅里叶变换,且在奈奎斯特(Nyquist )频率范围内有界并连续。序列的长度为N ,则211N n n =?+。计算()x n 的离散傅里叶变换(DFT )得到的是()j X e ω的N 个样本点()k j X e ω。其中数字频率为 k 2πω()d ωk k N == 式中:d ω为数字频率的分辨率;k 取对应-(N -1)/2到(N -1)/2区间的整数。 在实际使用中,往往要求计算出信号以模拟频率为横坐标的频谱,此时对应的模拟频率为 s s 2π2π?ω/T ()()T k k k k kD N L ==== 式中:D 为模拟频率的分辨率或频率间隔;T s 为采样信号的周期,Ts =1/Fs ;定义信号时域长度L =N T s 。

快速傅里叶变换的应用发展浅述

快速傅里叶变换的应用发展浅述 摘要:快速傅里叶变换是数字信号处理的常用数学工具, 以运算速度快和信噪 比阈值低为特点。随着时代的进步与科技的日新月异,FFT(快速傅里叶变换)已 经广泛应用于现代数字信号处理的各个领域,如雷达信号处理、卫星通信、无线 通信,故障诊断等,本文将对FFT 在各行业的应用进行综合总述。 一 快速傅里叶变换的产生及定义 1.快速傅里叶变换的产生 快速傅里叶变换的产生来源于离散傅里叶变换。有限长序列可以通过离散傅里叶 变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问 题,因此引出了快速傅里叶变换(FFT). 1965年,Cooley 和Tukey 提出了计算离散 傅里叶变换(DFT )的快速算法,将DFT 的运算量减少了几个数量级。从此, 对快速傅里叶变换(FFT )算法的研究便不断深入,数字信号处理这门新兴学科 也随FFT 的出现和发展而迅速发展。 2.根据对序列分解与选取方法的不同而产生了FFT 的多种算法,基本算法是基2 DIT 和基2DIF 。FFT 在离散傅里叶反变换、线性卷积和线性相关等方面也有重 要应用。快速傅里叶变换(FFT )是计算离散傅里叶变换(DFT )的快速算法。DFT 的定义式为 )(k X =)()(1 0k R W n x N N n kn N ∑-= 在所有复指数值kn N W 的值全部已算好的情况下,要计算一个)(k X 需要N 次复数 乘法和N -1次复数加法。算出全部N 点)(k X 共需2N 次复数乘法和)1(-N N 次 复数加法。即计算量是与2N 成正比的。 FFT 的基本思想:将大点数的DFT 分解为若干个小点数DFT 的组合,从而 减少运算量。 3. 快速傅里叶变换原理 快速傅里叶变换并不象模拟信号或离散信号的傅里叶变换那样的积分变换,它仅 是离散傅里叶变换的快速算法,它是在196年由美国的库里( C o o l e y ,J .W .) 和图基( J .W .Tu k e y ) [ 二人提 出来的,它的出现使博里叶变换的数字实现 大为提高.使信号分析的面貌 为之改观,具有极大的科学价值。

快速傅里叶变换(FFT)试题

第一章 快速傅里叶变换(FFT ) 4.1 填空题 (1)如果序列)(n x 是一长度为64点的有限长序列)630(≤≤n ,序列)(n h 是一长度为128点 的有限长序列)1270 (≤≤n ,记)()()(n h n x n y *=(线性卷积),则)(n y 为 点的序列,如果 采用基FFT 2算法以快速卷积的方式实现线性卷积,则FFT 的点数至少为 点。 解:64+128-1=191点; 256 (2)如果一台通用机算计的速度为:平均每次复乘需100s μ,每次复加需20s μ,今用来计算N=1024点的DFT )]([n x 。问直接运算需( )时间,用FFT 运算需要( )时间。 解:①直接运算:需复数乘法2 N 次,复数加法) (1-N N 次。 直接运算所用计算时间1T 为 s s N N N T 80864.12512580864020110021==?-+?=μ)( ② 基2FFT 运算:需复数乘法 N N 2log 2 次,复数加法N N 2log 次。 用FFT 计算1024点DTF 所需计算时间2T 为 s s N N N N T 7168.071680020log 100log 2 222==?+?=μ。 (3)快速傅里叶变换是基于对离散傅里叶变换 和利用旋转因子k N j e π2-的 来减少计算量,其特点是 _______、_________和__________。 解:长度逐次变短;周期性;蝶形计算、原位计算、码位倒置 (4)N 点的FFT 的运算量为复乘 、复加 。 解:N N L N mF 2log 2 2== ;N N NL aF 2log == 4.2 选择题 1.在基2DIT —FFT 运算中通过不断地将长序列的DFT 分解成短序列的DFT ,最后达到2点DFT 来降低运算量。若有一个64点的序列进行基2DIT —FFT 运算,需要分解 次,方能完成运算。 A.32 B.6 C.16 D. 8 解:B 2.在基2 DIT —FFT 运算时,需要对输入序列进行倒序,若进行计算的序列点数N=16,倒序前信号点序号为8,则倒序后该信号点的序号为 。 A. 8 B. 16 C. 1 D. 4 解:C 3.在时域抽取FFT 运算中,要对输入信号x(n)的排列顺序进行“扰乱”。在16点FFT 中,原来x(9)

快速傅里叶变换原理及其应用(快速入门)

快速傅里叶变换的原理及其应用 摘要 快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。傅里叶变换的理论与方法在“数理方程”、“线性系统分析”、“信号处理、仿真”等很多学科领域都有着广泛应用,由于计算机只能处理有限长度的离散的序列,所以真正在计算机上运算的是一种离散傅里叶变换. 虽然傅里叶运算在各方面计算中有着重要的作用,但是它的计算过于复杂,大量的计算对于系统的运算负担过于庞大,使得一些对于耗电量少,运算速度慢的系统对其敬而远之,然而,快速傅里叶变换的产生,使得傅里叶变换大为简化,在不牺牲耗电量的条件下提高了系统的运算速度,增强了系统的综合能力,提高了运算速度,因此快速傅里叶变换在生产和生活中都有着非常重要的作用,对于学习掌握都有着非常大的意义。 关键词快速傅氏变换;快速算法;简化;广泛应用

Abstract Fast Fourier Transform (FFT), is a discrete fast Fourier transform algorithm, which is based on the Discrete Fourier Transform of odd and even, false, false, and other characteristics of the Discrete Fourier Transform algorithms improvements obtained. Its Fourier transform theory has not found a new, but in the computer system or the application of digital systems Discrete Fourier Transform can be said to be a big step into. Fourier transform theory and methods in the "mathematical equation" and "linear systems analysis" and "signal processing, simulation," and many other areas have a wide range of applications, as the computer can only handle a limited length of the sequence of discrete, so true On the computer's operation is a discrete Fourier transform. Fourier Although all aspects of computing in the calculation has an important role, but its calculation was too complicated, a lot of computing system for calculating the burden is too large for some Less power consumption, the slow speed of operation of its system at arm's length, however, have the fast Fourier transform, Fourier transform greatly simplifying the making, not in power at the expense of the conditions to increase the speed of computing systems, and enhance the system The comprehensive ability to improve the speed of operation, the Fast Fourier Transform in the production and life have a very important role in learning to master all have great significance. Key words Fast Fourier Transform; fast algorithm; simplified; widely used

快速傅里叶变换(FFT)的原理及公式

快速傅里叶变换(FFT)的原理及公式 原理及公式 非周期性连续时间信号x(t)的傅里叶变换可以表示为 式中计算出来的是信号x(t)的连续频谱。但是,在实际的控制系统中能够得到的是连续信号x(t)的离散采样值x(nT)。因此需要利用离散信号x(nT)来计算信号x(t)的频谱。 有限长离散信号x(n),n=0,1,…,N-1的DFT定义为: 可以看出,DFT需要计算大约N2次乘法和N2次加法。当N较大时,这个计算量是很大的。利用WN的对称性和周期性,将N点DFT分解为两个N/2点 的DFT,这样两个N/2点DFT总的计算量只是原来的一半,即(N/2)2+(N/2)2=N2/2,这样可以继续分解下去,将N/2再分解为N/4点DFT等。对于N=2m点的DFT都可以分解为2点的DFT,这样其计算量可以减少为(N/2)log2N 次乘法和Nlog2N次加法。图1为FFT与DFT-所需运算量与计算点数的关系曲线。由图可以明显看出FFT算法的优越性。 将x(n)分解为偶数与奇数的两个序列之和,即

x1(n)和x2(n)的长度都是N/2,x1(n)是偶数序列,x2(n)是奇数序列,则 其中X1(k)和X2(k)分别为x1(n)和x2(n)的N/2点DFT。由于X1(k)和X2(k)均以N/2为周期,且WN k+N/2=-WN k,所以X(k)又可表示为: 上式的运算可以用图2表示,根据其形状称之为蝶形运算。依此类推,经过m-1次分解,最后将N点DFT分解为N/2个两点DFT。图3为8点FFT的分解流程。 FFT算法的原理是通过许多小的更加容易进行的变换去实现大规模的变换,降低了运算要求,提高了与运算速度。FFT不是DFT的近似运算,它们完全是等效的。 关于FFT精度的说明: 因为这个变换采用了浮点运算,因此需要足够的精度,以使在出现舍入误差时,结果中的每个组成部分的准确整数值仍是可辨认的。为了FFT的舍入误差,应该允许增加几倍log2(log2N)位的二进制。以256为基数、长度为N字节的数

快速傅里叶变换FFT算法源码经典

快速傅里叶变换FFT算法及其应用 摘要 本文较为系统地阐述了快速傅里叶变换的算法原理及其在数字信号处理等 工程技术中的应用。根据抽取方法的不同,一维基2 FFT算法分为两种:频域抽取的FFT算法和时频域抽取的FFT算法。第1节阐述了这两种FFT算法的原理。第2节给出了两种算法的编程思想和步骤。第3节阐述了一维非基2 FFT的两种算法:Cooley-tukey FFT算法和素因子算法(Prime Factor Algorithm)的思想原理,给出了在把一维非基2 DFT的多层分解式转化为二层分解的过程中,如何综合运用这两种算法以达到总运算次数最少的方案;并以20点DFT为例描述了非基2 FFT算法实现的一般步骤。第4节介绍了一维FFT算法在计算连续时间信号的傅里叶变换、离散信号的线性卷积、离散信号压缩和滤波等数字信号处理中的典型应用。第5节把一维FFT变换推广到二维FFT变换,并在一维FFT算法的基础上,给出了二维FFT算法的原理和实现过程。最后在附录中给出了一维DFT 的基2 FFT 算法(包括频域抽取的FFT和IFFT算法、时域抽取的FFT和IFFT 算法),一维任意非基2 FFT算法,二维DFT的基2 FFT 算法以及二维DFT的任意非基2 FFT 算法的详细的Visual C++程序。 本文通过各种流程图和表格,较为深入系统地阐述了FFT的算法原理;运用Matlab编程,通过大量生动的实例,图文并茂地列举出了FFT算法的各种应用,并在每个实例中都附上了完整的Matlab程序,可供读者参考。由于篇幅所限,本文未涉及FFT变换以及其应用的数学理论背景知识。 关键词:FFT算法的应用,一维基2 FFT算法,频域抽取,时域抽取,非基2 FFT算法,Cooley-Tukey算法,素因子算法,线形卷积,信号压缩和滤波,二维FFT算法

快速傅里叶变换及其应用

实验三快速傅里叶变换及其应用 04012636 陈郁蕾 一.实验目的 1.在理论学习的基础上,通过本实验,加深对FFT的理解,熟悉MATLAB中的有关函数。 2.应用FFT对典型信号进行频谱分析。 3.了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT。 4.应用FFT实现序列的线性卷积和相关。 二.实验原理 1.混叠 采样序列的频谱是被采样信号频谱的周期延拓,当采样频率不满足奈奎斯特采样定理的时候,就会发生混叠,使得刺痒后的序列信号的频谱不能真实的反映原采样信号的频谱。 2.泄漏 根据理论分析,一个时间的信号其频带宽度为无限,一个时间无限的信号其频带宽度则为有限。因此对一个时间有限的信号,应用DFT进行分析,频谱混叠难以避免。对一个时间无限的信号虽然频带有限,但在实际运算中,时间总是取有限值,在将信号截断的过程中,出现了展谱线的现象,称之为频谱泄漏或功率泄漏。 3.栅栏效应 DFT是对单位圆上Z变换的均匀采样,所以它不可能将频谱视为一个连续函数,就在一定意义上看,用DFT来观察频谱就好象通过一个栅栏来观看一个景象一样,只能在离散点上看到真实的频谱,这样就有可能发生一些频谱的峰点和谷点被“尖桩的栅栏” 所挡住,不能被我们观察到。 4.圆周卷积 把序列X(N)分布在N等份的圆周上,而序列Y(N)经反摺后也分布在另一个具有N等份的同心圆的圆周上。两圆上对应的数两量两相乘求和,就得到全部卷积序列。 这个卷积过程称做圆周卷积。 5.互相关函数 反映了两个序列X(N)和Y(N)的相似程度,用FFT可以很快的计算互相关函数。 三.实验内容及结果 1.观察高斯序列的时域和幅频特性,固定信号xa(n)中参数p=8,改变q的值,使 q分别等于2,4,8,观察他们的时域和幅频特性,了解当q取不同值时,对信号序列的时域和幅频特性影响;改变p,使p分别等于8,13,14,观察参数p变化对信号序列的时域和幅频特性影响,注意p等于多少时,会发生明显的泄漏现象,混叠是否也随之出现?记录实验中观察到的现象,绘出相应的时域序列和幅频特性曲线。 1.1幅频特性曲线 1.1.1p=8,q=2

快速傅里叶变换FFT原理与实现

FFT原理与实现 2010-10-07 21:10:09| 分类:数字信号处理 | 标签:fft dft |举报|字号订阅 在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征。尽管传统的DFT算法能够获取信号频域特征,但是算法计算量大,耗时长,不利于计算机实时对信号进行处理。因此至DFT被发现以来,在很长的一段时间内都不能被应用到实际的工程项目中,直到一种快速的离散傅立叶计算方法——FFT,被发现,离散傅立叶变换才在实际的工程中得到广泛应用。需要强调的是,FFT并不是一种新的频域特征获取方式,而是DFT的一种快速实现算法。本文就FFT的原理以及具体实现过程进行详尽讲解。 DFT计算公式 本文不加推导地直接给出DFT的计算公式: 其中x(n)表示输入的离散数字信号序列,WN为旋转因子,X(k)为输入序列x(n)对应的N个离散频率点的相对幅度。一般情况下,假设x(n)来自于低通采样,采样频率为fs,那么X(k)表示了从-fs/2率开始,频率间隔为fs/N,到fs/2-fs/N截至的N个频率点的相对幅度。因为DFT计算得到的一组离散频率幅度值实际上是在频率轴上从成周期变化的,即X(k+N)=X(k)。因此任意取连续的N个点均可以表示DFT的计算效果,负频率成分比较抽象,难于理解,根据X(k)的周期特性,于是我们又可以认为X(k)表示了从零频率开始,频率间隔为fs/N,到fs-fs/N 截至的N个频率点的相对幅度。 N点DFT的计算量

根据(1)式给出的DFT计算公式,我们可以知道每计算一个频率点X(k)均需要进行N次复数乘法和N-1次复数加法,计算N各点的X(k)共需要N^2次复数乘法和N*(N-1)次复数加法。当x(n)为实数的情况下,计算N点的DFT需要2*N^2次实数乘法,2*N*(N-1)次实数加法。 旋转因子WN的特性 1.WN的对称性 2.WN的周期性 3.WN的可约性 根据以上这些性质,我们可以得到式(5)的一系列有用结果 基-2 FFT算法推导 假设采样序列点数为N=2^L,L为整数,如果不满足这个条件可以人为地添加若干个0以使采样序列点数满足这一要求。首先我们将序列x(n)按照奇偶分为两组如下: 于是根据DFT计算公式(1)有:

FFT快速傅里叶变换word精品文档16页

快速傅里叶变换[编辑] 维基百科,自由的百科全书 跳转至:导航、搜索 傅里叶变换 Z变换 傅里叶级数 傅里叶变换 离散傅里叶级数 离散时间傅里叶变换 离散傅里叶变换 快速傅里叶变换 分数傅里叶变换 短时距傅立叶变换 小波变换 离散小波变换 连续小波变换 快速傅里叶变换(英语:Fast Fourier Transform, FFT),是离散傅里叶变换的快速算法,也可用于计算离散傅里叶变换的逆变换。快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。本条目只描述各种快速算法。 对于复数序列,离散傅里叶变换公式为: 直接变换的计算复杂度是(参见大O符号)。快速傅里叶变换可以计算出与直接计算相同的结果,但只需要的计算复杂度。通常,快速算法要求n能被因数分解,但不是所有的快速傅里叶变换都要求n是合数,对于所有的整数n,都存在复杂度为 的快速算法。

除了指数的符号相反、并多了一个1/n的因子,离散傅里叶变换的正变换与逆变换具有相同的形式。因此所有的离散傅里叶变换的快速算法同时适用于正逆变换。 目录 [隐藏] ? 1 一般的简化理论 ? 2 快速傅里叶变换乘法量的计算 ? 3 Cooley-Tukey算法 o 3.1 设计思想 ? 4 其他算法 ? 5 实数或对称资料专用的算法 ? 6 复杂度以及运算量的极限 ?7 参考资料 ?8 参阅 一般的简化理论[编辑] 假设一个M*N Sub-rectangular matrix S可分解成列向量以及行向量相乘: 若有个相异的non-trivial values( where ) 有个相异的non-trivial values

快速傅里叶变换FFT的C语言实现及应用

快速傅里叶变换FFT的C语言实现及应用 快速傅里叶变换简介 计算离散傅里叶变换的一种快速算法,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。 有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化 快速傅里叶变换 成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT). 1965年,Cooley和Tukey提出了计算离散傅里叶变换(DFT)的快速算法,将DFT的运算量减少了几个数量级。从此,对快速傅里叶变换(FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生了FFT的多种算法,基本算法是基2DIT和基2DIF。FFT在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。 快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。 设 快速傅里叶变换 x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实

快速傅里叶变换 数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N 项复数序列的X (m ),即N 点DFT 变换大约就需要N^2次运算。当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT 中,利用WN 的周期性和对称性,把一个N 项序列(设N=2k,k 为正整数),分为两个N/2项的子序列,每个N/2点DFT 变换需要(N/2)2次运算,再用N 次运算把两个N/2点的DFT 变换组合成一个N 点的DFT 变换。这样变换以后,总的运算次数就变成N+2(N/2)2=N+N2/2。继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT 运算单元,那么N 点的DFT 变换就只需要Nlog2N 次的运算,N 在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT 的优越性。 FFT 算法的基本原理 FFT 算法的基本思想:利用DFT 系数的特性,合并DFT 运算中的某些项,吧长序列的DFT —>短序列的DFT ,从而减少其运算量。 FFT 算法分类:时间抽选法DIT: Decimation-In-Time ;频率抽选法DIF: Decimation-In-Frequency 按时间抽选的基-2FFT 算法 1、算法原理 设序列点数 N = 2L ,L 为整数。 若不满足,则补零。N 为2的整数幂的FFT 算法称基-2FFT 算法。将序列x(n)按n 的奇偶分成两组: 则x(n)的DFT: ()()()()12221x r x r x r x r =+=0,1,...,12N r =-()()()()111000N N N nk nk nk N N N n n n X k x n W x n W x n W ---=====+∑∑∑n 为奇数 n 为偶数()()()221121200221N N r k rk N N r r x r W x r W --+===++∑∑()()()()2211221200N N rk rk k N N N r r x r W W x r W --===+∑∑

相关文档
最新文档