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