信号处理原理 FFT实验 张 哲 沈阳广播电视大学 FFT算法 计算DFT需要: N*N=N2次复数乘法 N*N=N2次复数加法 直接计算DFT的复杂度为O(N2) FFT不是一种新的算法,而只是DFT的快速算法 k N W 被称为旋转因子,可以预先算好并保存 离散谱的性质 离散谱定义 离散序列h(nTs) (0n   k  ( k  Z ) Hk  H   NT  S   离散谱性质 周期性 序列的N点DFT离散谱是周期为N的序列。 如果离散序列x(nTs)(0n 关于原点和N/2都有 ☆共轭对称性 * H k  H k * H.

Download Report

Transcript 信号处理原理 FFT实验 张 哲 沈阳广播电视大学 FFT算法 计算DFT需要: N*N=N2次复数乘法 N*N=N2次复数加法 直接计算DFT的复杂度为O(N2) FFT不是一种新的算法,而只是DFT的快速算法 k N W 被称为旋转因子,可以预先算好并保存 离散谱的性质 离散谱定义 离散序列h(nTs) (0n   k  ( k  Z ) Hk  H   NT  S   离散谱性质 周期性 序列的N点DFT离散谱是周期为N的序列。 如果离散序列x(nTs)(0n 关于原点和N/2都有 ☆共轭对称性 * H k  H k * H.

Slide 1

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 2

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 3

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 4

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 5

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 6

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 7

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 8

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 9

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 10

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 11

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 12

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 13

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 14

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 15

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 16

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 17

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 18

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 19

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 20

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 21

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 22

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 23

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 24

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 25

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。


Slide 26

信号处理原理

FFT实验




沈阳广播电视大学
1

FFT算法
计算DFT需要:
N*N=N2次复数乘法
N*N=N2次复数加法
直接计算DFT的复杂度为O(N2)
FFT不是一种新的算法,而只是DFT的快速算法
k
N

W 被称为旋转因子,可以预先算好并保存

2

离散谱的性质
离散谱定义
离散序列h(nTs) (0n


 k 
( k  Z )
Hk  H 
 NT 
S 


离散谱性质
周期性 序列的N点DFT离散谱是周期为N的序列。
如果离散序列x(nTs)(0n关于原点和N/2都有
☆共轭对称性
*

H k  H k

*

H N k  H k

HN

*

k

 HN

2

k

2

☆幅度对称性
H k  H k

H N k  H k

HN
2

k

 HN

k

2

3

FFT的原理


H k   DFT h(n) 

N 1

 h(n)WN

nk

,

(k  0,1, , N  1)

n 0

1 W具有周期性

W

nk

W

经过周期性与对称性简化之后,容易发
现DFT运算中存在着不必要的重复计算,
避免这种重复,是简化运算的关键.

nk % N

2 W具有对称性

W

( nk  N2 )

 W

nk

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和。
DFT的复杂度与点数N有关!
4

FFT的原理
H (k ) 

 h(n)WN 
nk

偶数n
N
2

1

 h(n)WN

nk

奇数 n

 

  h( 2 r ) W

2 rk
N

N
2

W

k
N

r 0
N
2

 h(2r  1)W 

2 rk
N

r 0

1

  h(2r )W N  W
rk

k
N

2

r 0

1

N
2

1

 h(2r  1)WN

rk

r 0

2

 H e (k )  WN H o (k )
k

( N2  k )

WN

H (k )  H e (k )  WN H o (k )
k

 H e (k )  WN H o (k )
k

k

k

( N2  k )

N
2

 WN  WN
 WN

H (  k )  H e (  k )  WN
N
2

N
2

H o ( N2  k )

H e ( N2  k )  H e (k )
H o ( N2  k )  H o (k )

k  0,1,, N2  1
5

FFT逐级分解
x(0)
x( 4)

x( 2)

x(6)

N/4点
DFT

N/4点
DFT

X (0)
X (1)

N/4点
DFT

N


X (2)

X (3)



x(1)

x(5)

x(3)

x (7)

N/4点
DFT


N/4点



DFT

X (5)

X (6)

N/4点
DFT
第一级

X (4)

X (7)

第二级

第三级

6

FFT运算流程图

蝶形运
算单元

x(0)

x1(0)

x 2(0)

X (0)

x( 4)

x1(1)

x 2(1)

X (1)

x( 2)

x1(2)

x 2(2)

X (2)

x(6)

x1(3)

x 2(3)

X (3)

x(1)

x1(4)

x 2(4)

X (4)

x(5)

x1(5)

x 2(5)

X (5)

x(3)

x1(6)

x 2(6)

X (6)

x (7)

x1(7)

x 2(7)

X (7)



第一级

第二级

第三级

7

FFT蝶形运算单元
x(0)

x1(0)
W

x( 4)

W

0

0

x1(1)
可以共享

x1(0)  x(0)  x(4) W

0

x1(0)  x(0)  x(4) W

0

一个蝶形单元只需一次复数乘法和两次复数加法
8

FFT算法流程说明
☆ 全部计算分解为M级,或称为M次迭代。
☆ 输入序列x(n)按码位倒读顺序排列,输出序列X(k)按
自然顺序排列。
☆ 每级都包含N/2个蝶形单元。
☆ 每级的若干蝶形单元组成“群”。第1级群数为N/2,
第2级群数为N/4,……第i级群数为N/2i,最后一级
的群数为1。
☆ 每个蝶形单元都包含乘Wnk与-Wnk的运算(可简化为
乘Wnk与加、减法各一次)。
☆ 同一级中,各个群的W分布规律完全相同。
9

FFT算法流程说明
各级中W的排列规律(自上而下)
第1级: W 0
N
第2级: W

0
N

第3级: W

0
N

N
4

WN

N
8

WN

2N
8

WN

3N
8

WN

……

第i级: W

0
N

N
i
2

WN

2N
i
2

WN

(2

…… W
N

i 1

1) Ni
2

……
W的指数为:

第M级: W 0
N

1

WN

2

WN

3

WN

…… W
N

N
2

1

次序*本级群数

10

FFT算法流程说明
码位倒读
输入序列x(n)的排列次序不符合自然顺序。此现象是由于
按n的奇偶分组进行DFT运算而造成的,这种排列方式称
为“码位倒读”的顺序。
所谓“倒读”,是指按二进制表示的数字首尾位置颠倒,
重新按十进制读数。
自然顺序

二进制顺序

码位倒置

码位倒读顺序

0

000

000

0

1

001

100

4

2

010

010

2

3

011

110

6

4

100

001

1

5

101

101

5

6

110

011

3

7

111

111

7

码位倒读示例(N=8)

11

码位倒读算法
int BitReverse(int src, int size)
// src是待倒读的数,size是数二进制位数
{
int tmp = src;

int des = 0;
for (int i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}

取出tmp的最后一位,
放到des的指定位上。
12

FFT算法流程框架
1 按下标二进制对输入进行整序
2 FOR(I=0,L=N/2; I// 逐级计算. L:级内群数
FOR(J=0, M=1; JFOR(K=0; K// 逐蝶形单元计算
POS = K + J * (M*2) ;
TMP = DATA[POS + M] * W[K*L] ;
DATA[POS + M] = DATA[POS] - TMP ;
DATA[POS]
+= TMP ;
}
}
L /= 2;
// 群数减少一倍
M *= 2;
// 蝶形单元数增加一倍
}
符号
说明

N=2R是FFT的点数。
I表示当前级,J表示当前群,K表示当前蝶形单元。
L表示当前级内的群数,M表示当前群内的蝶形单元数。

13

FFT算法复杂度分析
FFT的复杂度分析

N 2

r

预先计算好 WNk

一个对偶结点对的计算需要2次复数
加法和1次复数乘法
对任一次迭代,共有N/2对结点,因此
共需N次复数加法和N/2次复数乘法
复数加法次数 rN  N log 2 N
r次迭代的总计算量为
复数乘法次数

rN / 2 

1
2

算法复杂度

O ( N log

2

N log 2 N

N)

IDFT同样可用FFT实现,算法复杂度相同。
14

FFT实验
二维离散傅里叶变换2D-DFT
R

M N

空间中的矩阵向量(或点)表示为

 g (0,0)


g (1,0)

[ g ] g (m, n) 


 g ( M  1,0)

g (0,1)



g (1,1)




g ( M  1,1)



g (0, N  1)



g (1, N  1)



g ( M  1, N  1)

☆ 可以把[g(m,n)]看作是一幅二维数字图像,则g(m,n)是图像在
坐标(m,n)处的亮度(灰度级)。

☆ 若把g(m,n)视为一个二元函数(自变量为m和n),则它是数字
图像在平面上的亮度分布函数。
15

FFT实验
定义1:二维矩阵向量[g(m,n)]的2D-DFT


G ( p, q)  F g (m, n) 

M 1 N 1

 g (m, n)WM WN
mp

nq

m 0 n 0

0  p  M 1

0  q  N 1

定义2:二维矩阵谱向量[G(p,q)]的2D-IDFT


g (m, n)  F

1

G( p, q) 

0  m  M 1

1
MN

M 1 N 1

 G( p, q)WM WN
 mp

 nq

p 0 q 0

0  n  N 1
16

FFT实验
二维FFT
二维FFT相当于对行和列分别进行一维FFT运算。
具体的实现办法是:先对各行逐一进行一维FFT,
然后再对各列逐一进行一维FFT。

for (int i=0; i
数据第i行

FFT_1D(ROW[i],N);
for (int j=0; j
数据第j列

FFT_1D(COL[j],M);
17

FFT实验
实验数据
• 实验数据为一图像数据文件,文件格式是纯文本格式。

• 文件正文的第一行的值表示矩阵的大小,即N值。后面
的N行是点阵图像,每行有N个数据。N最大为256。
• 在图像点阵中,‘.’代表0(即没有点), ‘o’代表1
(即有点)。
文件内容示例
(9x9汉字大)

9
.........
....o....
....o....
.ooooooo.
....o....

可视为一个9X9的
二维矩阵向量

...o.o...
..o...o..
o.......o
.........

18

FFT实验
实验内容
◆ 施加FFT,再直接IFFT,显示还原后的N*N汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后IFFT,
最后显示还原后的(N/2)*(N/2)的汉字图像。
◆ 施加FFT,再压缩为(N/2)*(N/2)的谱,然后先补
零再IFFT,最后显示还原后的N*N的汉字图像。

19

FFT实验
实验注意事项
☆ 图像数据是以文本形式存放在文件中的,读入后要
转化为数值(如·转为0,o转为10),才能进行FFT
变换。
☆ 为了显示还原后的图像,需要将IFFT变换后的数据
以文本形式入文件中。
☆ IFFT变换后的数据是复数,根据复数模的大小,将
它们分别转成·和o字符。这就要设定一个控制阈值,
模大于阈值的复数对应o字符,模小于阈值的复数对
应·字符。
☆ 控制阈值要通过实验确定。
20

21

关于FFT的概念
FFT(Fast Fourier Transform)快速 傅里
叶变换的缩写。它是由Cooley和Tukey于
1965年提出来的。是一种按时间序列的奇
偶顺序分组的算法。又称为“时间抽取基
2FFT算法。
FFT具有 线性性、对偶性、频移性等
特性。

关于对偶性:
就是把频域的波形形状放到时域去,
变成:F(t ),求其傅里叶变换,所求频谱与
原信号时域的波形形状f(t)的内在关系,
就是对偶特性
f [F(t)]=2πf(-w)

关于线性性:
线性性包含两部分内容::

一是齐次性,即信号倍数的傅里叶变换
等于信号傅里叶变换的倍数:
F[af(t)]=aF[f(t)]

二是叠加性,即和的傅里叶变换等于傅
里叶变换的和:
F[f1(t)+f2(t)]=F[f1(t)]+F[f2(t)]

关于频移特性:
当时域信号乘以一个复指数信号时,
相当于把其频谱搬移到复指数信号的频
率处。又称为“频谱搬移”。

f [ f (t ) e

jwt

]  F ( w  w0 )

关于DFT的概念
DFT:(Discrete Fourier Transform)是离
散傅里叶变换的缩写。是一个连续信号经
过时域抽样、截断和周期延拓后的信号,
是一个离散的和周期的冲激序列,我们从
时域和频域各取一个周期内的N个点,在
它们的强度之间建立对应关系,就是离散
的傅里叶变换DFT。