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

详解FFT(快速傅里叶变换FFT
详解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)的值

4 N N N

3

4

4

4

4

4

X (2) = n =0

x (n )W 2 n = x (0)W 0 + x (1)W 2 + x (2)W 4 + x (3)W 6

= [ x (0) + x (2)]W 0 + [ x (1) + x (3)]W 2

(周期性)

4

=[ x (0) + x (2)]-[ x (1) + x (3)]W 0

4

(对称性)

通过合并,使乘法次数由 4 次减少到 1 次,运算量减少。

FFT 的算法形式有很多种,但基本上可以分为两大类:按时间抽取 (DIT )和按频率抽取(DIF )。

4.1 按时间抽取(DIT )的 FTT

为了将大点数的 DFT 分解为小点数的 DFT 运算,要求序列的长度 N 为 复合数,最常用的是 N = 2

M

的情况(M 为正整数)。该情况下的变换称为

基 2FFT 。下面讨论基 2 情况的算法。

先将序列 x(n)按奇偶项分解为两组

?x (2r ) = x 1 (r ) ?

?x (2r +

1) = x 2 (r ) 将 DFT 运算也相应分为两组

N

r = 0,1,L , 2

? 1

N ?1

X (k ) = DFT [ x (n )] =

∑ x (n )W kn

n =0

N ?1

= ∑ x (n )W

kn

N ?1

∑ x (n )W

kn

n =0 n 为偶数

n =0 n 为奇数

N / 2?1

∑ (2 )

2 r k

+

N / 2?1

(2 + 1)

( 2 r +1) k

x r =0

r W N

x r

W N

r =0

N / 2?1

2 r k

+

N / 2?1 k

2 r k

rk k k = W )

r =0

x 1 (r )W N W N r =0

x 2 (r )W N

N / 2?1

= ∑ x 1 (r )W

r =0

N / 2

+ W

N

N / 2?1

∑ x 2 (r )W

r =0

rk N / 2

(因为W

2 rk N

rk

N / 2

= X 1 (k ) + W N X 2

(k )

1

N

2

N 1

N

1 N

2 1 N 2 N

W N

N k

其中 X 1 (k

) 、 X 2 (k ) 分别是 x 1 (n )、x 2 (n ) 的 N/2 点的 DFT

N / 2?1

N / 2?1

rk

rk

X 1 (k ) = ∑ x 1 (r )W N / 2 = ∑ x (2r )W N / 2 ,0 ≤ k ≤ ? 1

r =0

r =0

2

N / 2 ?1

N / 2 ?1

rk

rk

N X 2 (k ) = ∑ x 2 (r )W N / 2 = ∑ x (2r + 1)W N / 2 ,0 ≤ k ≤ ?1

r =0

r =0

2

至此,一个 N 点 DFT 被分解为两个 N/2 点的 DFT 。

上面是否将全部 N 点的 X (k ) 求解出来了?

分析: X 1 (k

) 和 N X 2 (k ) 只有 N/2 个点( k = 0,1,L ,

2

? 1 ),则 由

X (k ) = X (k ) + W k X (k ) 只能求出 X (k ) 的前 N/2 个点的 DFT ,要求出

全部 N 点的 X (k ) ,需要找出 X 1 (k

) 、 X 2 (k ) 和 X (k + N / 2) 的关系,其

N 中 k = 0,1,L , 2

? 1。由式子 X (k ) = X 1

(k ) + W k

X

2 (k ) 可得 X (k + N / 2) = X (k + N / 2) + W k + N / 2

k

X 2 (k + N / 2) 化简得

N

X (k + N / 2) = = X 1 (k ) ? W N X 2 (k ) , k = 0,1,L , 2

? 1

这样 N 点 DFT 可全部由下式确定出来:

?? X (k ) = X (k ) + W k X (k )

??? X (k + N / 2) = X (k ) ? W k

X (k ) k = 0,1,L , N

? 1 2

(*) 上式可用一个专用的碟形符号来表示,这个符号对应一次复乘和两次复加运 算。

a

a + W k b

b

a ? W k b

-1

N

2

图 蝶形运算符号

通过这样的分解以后,每一个 N /2 点的 DFT 只需要 ( N ) 2 =

N

次复数乘 2 4

+

N / 2

N

1 3 N

2 2 lk

法,两个 N/2 点的 DFT 需要 2( N ) 2 =

N

次复乘,再加上将两个 N /2 点

2 2

DFT 合并成 为 N 点 DFT 时有 N / 2 次与 W 因 子相 乘,一 共需 要

N +

N 2 2

N 2

≈ 次复乘。可见,通过这样的分解,运算量节省了近一半。

2

因为 N = 2 M ,N/2 仍然是偶数,因此可以对两个 N/2 点的 DFT 再

分别作进一步的分解,将两个 N/2 点的 DFT 分解成两个 N/4 点的 DFT 。

例如对 x 1 (r ) ,可以在按其偶数部分及奇数部分进行分解:

?x 1 (2l ) = x 3 (l ) ?

?x 1 (2l +

1) = x 4 (l ) 则的运算可相应分为两组:

N

l = 0,1,L , 4

? 1

N / 4?1

X 1 (k ) = ∑ x 1 (2l )W

l =0

2lk

N / 2

N / 4?1

+ ∑ x 1 (2l + 1)W

l =0 ( 2l +1) k

N / 2

N / 4?1 ∑

3

( )

/ 4

k N / 2

N / 4?1 ∑

4 ( )

lk N / 4

x l =0

l W N

W

k

x l W

l =0

N

= X 3 (k ) + W N / 2 X 4 (k )

将系数统一为以N为周期,即W

k

k = 0,1,L ,

4

? 1

= W 2 k ,可得

?? X (k ) = X (k ) + W 2 k ?

X 4 (k ) 2 k k = 0,1,L , N ? 1 X 1 (k + N / 4) = X 3 (k ) ? W N X 4 (k )

4

同样,对 X 2 (k ) 也可进行类似的分解。一直分解下去,最后是2点的

DFT ,2点 DFT 的运算也可用碟形符号来表示。这样,对于一个 N = 2 3 = 8

的DFT 运算,其按时间抽取的分解过程及完整流图如下图所示。

这种方法,由于每一步分解都是按输入序列在时域上的次序是属于偶数还是奇数来抽取的,故称为“时间抽取法”。

分析上面的流图, N = 2 M ,一共要进行 M 次分解,构成了从 x(n)到 X(k)的 M 级运算过程。每一级运算都是由 N/2 个蝶形运算构成,因此每一 级运算都需要 N/2 次复乘和 N 次复加,则按时间抽取的 M 级运算后总共需 要

复数乘法次数: m F = N ? M 2

= N log N

2 2 复数加法次数: a F = N ?

M = N log 2 N

根据上面的流图,分析FFT算法的两个特点,它们对FFT的软硬件 构成产生很大的影响。

(1) 原位运算 也称为同址运算,当数据输入到存储器中以后,每一级运算的结果仍然存储 在原来的存储器中,直到最后输出,中间无需其它的存储器。根据运算流图 分析原位运算是如何进行的。原位运算的结构可以节省存储单元,降低设备 成本。

(2) 变址 分析运算流图中的输入输出序列的顺序,输出按顺序,输入是“码位倒置” 的顺序。见图。

X(0) X(4) X(2) X(6) X(1) X(5) X(3) X(7)

码位倒置的变址处理

在实际运算中,直接将输入数据 x(n)按码位倒置的顺序排好输入很不

方便,一般总是先按自然顺序输入存储单元,然后通过变址运算将自然顺序

N

(N / 2)k nk

的存储换成码位倒置顺序的存储,这样就可以进行FFT 的原位运算。变质的功能如图所示。用软件实现是通用采用雷德(Rader)算法,算出I 的倒序J以后立即将输入数据X(I)和X(J)对换。尽管变址运算所占运算量的比例很小,但对某些高要求的应用(尤其在实时信号处理中),也可设法用适当的电路结构直接实现变址。例如单片数字信号处理器TMS320C25 就有专用于FFT 的二进制码变址模式。

4.2按频率抽取(DIF)的FTT

除时间抽取法外,另外一种普遍使用的FFT 结构是频率抽取法。频率抽取法将输入序列不是按奇、偶分组,而是将N点DFT 写成前后两部分:

N ?1

X (k ) = DFT [ x(n)] = ∑x(n)W kn

n=0

( N / 2)?1N ?1

= ∑x(n)W kn+∑x(n)W kn

n =0N N

n=N / 2

N / 2?1

∑( )nk +N / 2?1

∑( +/ 2)(n+N / 2)k

n=0x n W

N

x n N W

N

n=0

N / 2?1

=∑[x(n) +W N x(n + N / 2)]W N

n=0

因为W N / 2 = ?1,W ( N / 2) k= (?1) k ,k为偶数时(?1) k=1 ,k为奇数时N N

(?1) k= ?1,由此可将X(k)分解为偶数组和奇数组:

N / 2?1

∑N

X (k)=n=0[x(n) + (?1)k x(n + N / 2)]W nk

N / 2?1

∑N

X (2r)=n=0[x(n) + x(n + N / 2)]W 2n r N / 2?1

N / 2 =

[x(n) + x(n + N / 2)]W nr

n=0

N N / 2?1

N

X (2r + 1)=

N / 2?1

n =0

[ x (n ) ? x (n + N / 2)]W ( 2 r +1) n

N

N / 2

=

n =0

[ x (n ) ? x (n + N / 2)]W n W nr

?x 1 (n ) = x (n ) + x (n + N / 2)

令 ?

n = 0,1,L , N / 2 ? 1

?x 2 (n ) = [ x (n ) ? x (n + N / 2)]W

n

这两个序列都是 N/2 点的序列,对应的是两个 N/2 点的 DFT 运算:

N / 2?1

1

N / 2

X (2r )=

n =0

x (n )]W nr

N / 2?1

2

N / 2

X (2r + 1)= x n =0

(n )W rn

这样,同样是将一个 N 点的 DFT 分解为两个 N/2 点的 DFT 了。频率抽选法 对应的碟形运算关系图如下:

a

+ b

? b )W

n

b

N

n

-1

W N

对于 N=8 时频率抽取法的 FFT 流图如下:

∑ X (k )W

?n k , n = 0,1,L , N ? N

这种分组的办法由于每次都是按输出 X(k)在频域的顺序上是属于偶数还是 奇数来分组的,称为频率抽取法。与前面按时间抽取的方法相比,相同点 问题:如何利用快速算法计算 IDFT ? 分析 IDFT 的公式:

x (n ) = IDFT [ X (k )] = 1 N ?1

N

比较 DFT 的公式:

N k =0

N ?1

X (k ) = DFT [ x (n )] = ∑ x (n )W nk , k = 0,1,L , N ? 1

n =0

得知可用两种方法来实现 IDFT 的快速算法:(1)只要把 DFT 运算中的每

[∑ X * (k )W nk ]*

= 一个系数 W nk 该为 W ? nk ,并且最后再乘以常数

1

,就可以用时间抽取法

N

N

N

或频率抽取的 FFT 算法来直接计算 IDFT 。这种方法需要对 FFT 的程序和参 数 稍 加

改 动 才 能 实 现 。 ( 2 ) 因 为

x (n ) = 1 N ?1

N 1 {DFT [ X * (k )]}, n = 0,1,L , N ? 1 ,也就 N k =0 N

是说,可先将 X(k)取共轭变换,即将 X(k)的虚部乘以-1,就可直接调用 FFT 的程序,最后再对运算结果取一次共轭变换并乘以常数 1/N 即可得到 x(n)的值。这种方法中,FFT 运算和 IFFT 运算都可以共用一个子程序块, 在使用通用计算机或用硬件实现时比较方便。

4.1.3 混合基 FFT 算法

以上讨论的是基 2 的 FFT 算法,即 N = 2 M 的情况,这种情况实际

上使用得最多,这种 FFT 运算,程序简单,效率很高,用起来很方便。另 外,在实际应用时,有限长序列的长度 N 到底是多少在很大程度时是由人 为因素确定的,因此,大多数场合人们可以将 N 选定为 N = 2 M ,从而可 以直接调用以2为基数的 FFT 运算程序。

如果长度 N 不能认为确定,而 N 的数值又不是以 2 为基数的整数次

方,一般可有以下两种处理方法:

(1)

将 x(n)用补零的方法延长,使 N 增长到最邻近的一个

N = 2 M 数值。例如,N=30,可以在序列 x(n)中补进

x(30)=x(31)=0两个零值点,使 N=32。如果计算 FFT 的目的是为了了解整个频谱,而不是特定频率点,则此 法可行。因为有限长序列补零以后并不影响其频谱

X (e jw ) ,只是频谱的采样点数增加而已。

(2) 如果要求特定频率点的频谱,则 N 不能改变。如果 N 为复合数,则可以用以任意数为基数的 FFT 算法来计 算。快速傅里叶变换的基本思想就是要将 DFT 的运算 尽量分小。例如,N=6 时,可以按照 N=3×2分解,

将6点DFT 分解为3组2点DFT。举例:N=9 时的快速算法。

快速傅里叶变换的应用

4.2

?

?

凡是可以利用傅里叶变换来进行分析、综合、变换的地方,都可以利

用 FFT 算法及运用数字计算技术加以实现。FFT 在数字通信、语音信号处 理、图像处理、匹配滤波以及功率谱估计、仿真、系统分析等各个领域都得 到了广泛的应用。但不管 FFT 在哪里应用,一般都以卷积积分或相关积分 的具体处理为依据,或者以用 FFT 作为连续傅里叶变换的近似为基础。

4.2.1 利用 FFT 求线性卷积—快速卷积

在实际中常常遇到要求两个序列的线性卷积。如一个信号序列 x(n)

通过 FIR 滤波器时,其输出 y(n)应是 x(n)与 h(n)的卷积:

y (n ) = x (n ) ? h (n ) =

∑ x (m )h (n ? m )

m =?∞

有限长序列 x(n)与 h(n)的卷积的结果 y(n)也是一个有限长序列。假设 x(n)与 h(n)的长度分别为 N1 和 N2,则 y(n)的长度为 N=N1+N2-1。若通过补零使 x(n)与 h(n)都加长到 N 点,就可以用圆周卷积来计算线性卷积。这样得到用 FFT 运算来求 y(n)值(快速卷积)的步骤如下:

(1) 对 序 列 x(n) 与 h(n) 补 零至长为 N ,使 N ≥ N1+N2-1 ,并且

N = 2 M (M 为整数) ,即

x (n ) = ?x (n ), n = 0,1,L , N 1 ? 1 ?0, n = N 1, N 1 +

1,L , N ? 1

h (n ) = ?h (n ), n = 0,1,L , N 2 ?

1 ?0, n = N 2, N

2 + 1,L , N ?

1 (2) 用 FFT 计算 x(n)与 h(n)的离散傅里叶变换

x (n ) ? ( F FT ) ? X (k )

(N 点)

h (n ) ? ( F FT ) ? H (k )

快速傅里叶变换的应用

4.2

(N 点)

(3) 计算 Y(k)=X(k)H(k)

(4) 用 IFFT 计算 Y(k)的离散傅里叶反变换得:y(n)=IFFT[Y(k)] (N 点)

利用 FFT 求相关—快速相关

4.2.2

?

?

互相关及自相关的运算已广泛的应用于信号分析与统计分析,应用于连 续时间系统也用于离散事件系统。

用 FFT 计算相关函数称为快速相关,它与快速卷积完全类似,不同的 是一个应用离散相关定理,另一个应用离散卷积定理。同样都要注意到离散 傅里叶变换固有的周期性,也同样用补零的方法来绕过这个障碍。

设两个离散时间信号 x(n)与 y(n)为已知,离散互相关函数记作 R xy (n ) , 定义为

R xy (n ) =

∑ x (m ) y (n + m )

m =?∞

如果 x(n)与 y(n)的序列长度分别为 N1 和 N2,则用 FFT 求相关的计算步骤 如下:

( 1 )对序 列 x(n) 与 y(n) 补 零至长为 N ,使 N ≥ N1+N2-1 ,并且

N = 2 M (M 为整数) ,即

x (n ) = ?x (n ), n = 0,1,L , N 1 ?

1 ?0, n = N 1, N 1 +

1,L , N ? 1

y (n ) = ?

y (n ), n = 0,1,L , N 2 ? 1 ?0, n = N 2, N 2 + 1,L , N ?

1 (2)用 FFT 计算 x(n)与 y(n)的离散傅里叶变换

x (n ) ? ( F FT ) ? X (k )

(N 点)

y (n ) ? ( F FT ) ? Y (k )

(N 点)

(3)将 X(k)的虚部 Im[X(k)]改变符号,求得其共轭 X*(k) (4)计算 R xy (k ) =X*(k)Y(k)

(5) 用 IFFT 求得相关序列 R xy (n )

4.2.2R xy (n) =IFFT[ R xy (k ) ] (N 点)

利用FFT 求相关—快速相关

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)课程设计

快速傅里叶变换(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

详解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)的值

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

实验四 快速傅里叶变换(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 ) 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)的原理及公式

快速傅里叶变换(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原理与实现 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(快速傅里叶变换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)的值

快速傅里叶变换的原理及其应用

快速傅里叶变换的原理及其应用 摘要: 快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。傅里叶变换的理论与方法在“数理方程”、“线性系统分析”、“信号处理、仿真”等很多学科领域都有着广泛应用,由于计算机只能处理有限长度的离散的序列,所以真正在计算机上运算的是一种离散傅里叶变换. 虽然傅里叶运算在各方面计算中有着 重要的作用,但是它的计算过于复杂,大量的计算对于系统的运算负担过于庞大,使得一些对于耗电量少,运算速度慢的系统对其敬而远之,然而,快速傅里叶变换的产生,使得傅里叶变换大为简化,在不牺牲耗电量的条件下提高了系统的运算速度,增强了系统的综合能力,提高了运算速度,因此快速傅里叶变换在生产和生活中都有着非常重要的作用,对于学习掌握都有着非常大的意义。 关键词:快速傅氏变换;图像处理;matlab 前言: 傅里叶变换在信号处理中具有十分重要的作用,但是基于离散时间的傅里叶变换具有很大的时间复杂度,根据傅里叶变换理论,对一个有限长度且 长度为N的离散信号,做傅里叶变换的时间复杂度为) O,当N很大时τ, (2 N 其实现的时间是相当惊人的(比如当N为4 10 10时,其完成时间为τ8 (τ为计算机的时钟周期)),故其实现难度是相当大的,同时也严重制约了DFT在信号分析中的应用,故需要提出一种快速的且有效的算法来实 现。正是鉴于DFT极其复杂的时间复杂度,1965年..JWCooley 和..JWTukey巧妙地利用 NW因子的周期性和对称性,提出了一个DFT的快速算法,即快速傅里叶变换(FFT),从而使得DFT在信号处理中才得到真正的广泛应用。 傅立叶变化的原理; (1)原理

快速傅里叶变换(FFT)原理及源程序

《测试信号分析及处理》课程作业 快速傅里叶变换 一、程序设计思路 快速傅里叶变换的目的是减少运算量,其用到的方法是分级进行运算。全部计算分解为M 级,其中N M 2log =;在输入序列()i x 中是按码位倒序排列的,输出序列()k X 是按顺序排列;每级包含2N 个蝶形单元,第i 级有i N 2 个群,每个群有12-i 个蝶形单元; 每个蝶形单元都包含乘r N W 和r N W -系数的运算,每个蝶形 单元数据的间隔为12-i ,i 为第i 级; 同一级中各个群的系数W 分布规律完全相同。 将输入序列()i x 按码位倒序排列时,用到的是倒序算法——雷德算法。 自然序排列的二进制数,其下面一个数总比上面的数大1,而倒序二进制数的下面一个数是上面一个数在最高位加1并由高位向低位仅为而得到的。 若已知某数的倒序数是J ,求下一个倒序数,应先判断J 的最高位是否为0,与2 N k =进行比较即可得到结果。如果J k >,说明最高位为0,应把其变成1,即2 N J +,这样就得到倒序数了。如果J k ≤,即J 的最高位为1,将最高位化为0,即2N J -,再判断次高位;与4N k =进行比较,若为0,将其变位1,即4 N J +,即得到倒序数,如果次高位为1,将其化为0,再判断下一位……即从高位到低位依次判断其是否为1,为1将其变位0,若这一位为0,将其变位1,即可得到倒序数。若倒序数小于顺序数,进行换位,否则不变,防治重复交换,变回原数。 注:因为0的倒序数为0,所以可从1开始进行求解。 二、程序设计框图 (1)倒序算法——雷德算法流程图

(2)FFT算法流程

快速傅里叶变换fft变换

快速傅里叶变换FFT的C语言算法彻底研究LED音乐频谱显示的核心算法就是快速傅里叶变换,FFT的理解和编程还是比较难的,特地撰写此文分享一下研究成果。 一、彻底理解傅里叶变换 快速傅里叶变换(Fast Fourier Transform)是离散傅里叶变换的一种快速算法,简称FFT,通过FFT可以将一个信号从时域变换到频域。模拟信号经过A/D转换变为数字信号的过程称为采样。为保证采样后信号的频谱形状不失真,采样频率必须大于信号中最高频率成分的2倍,这称之为采样定理。假设采样频率为fs,采样点数为N,那么FFT结果就是一个N点的复数,每一个点就对应着一个频率点,某一点n(n 从1开始)表示的频率为:fn=(n-1)*fs/N。举例说明:用1kHz的采样频率采样128点,则FFT结果的128个数据即对应的频率点分别是0,1k/128,2k/128,3k/128,…,127k/128 Hz。这个频率点的幅值为:该点复数的模值除以N/2(n=1时是直流分量,其幅值是该点的模值除以N)。 二、傅里叶变换的C语言编程 1、对于快速傅里叶变换FFT,第一个要解决的问题就是码位倒序。假设一个N 点的输入序列,那么它的序号二进制数位数就是t=log2N.码位倒序要解决两个问题:①将t位二进制数倒序;②将倒序后的两个存储单元进行交换。如果输入序列的自然顺序号i用二进制数表示,例如若最大序号为15,即用4位就可表示n3n2n1n0,则其倒序后j对应的二进制数就是n0n1n2n3,那么怎样才能实现倒序呢?利用C语言的移位功能! 程序如下,我不多说,看不懂者智商一定在180以下!复数类型定义及其运算#define N 64 //64点 #define log2N 6 //log2N=6 /*复数类型*/ typedef struct { float real; float img; }complex; complex xdata x[N]; //输入序列 /*复数加法*/ complex add(complex a,complex b) { complex c; c.real=a.real+b.real; c.img=a.img+b.img; return c; } /*复数减法*/ complex sub(complex a,complex b) { complex c; c.real=a.real-b.real;

相关文档
最新文档