第 3 章 FFT 快速傅氏变换
-
Upload
karina-baldwin -
Category
Documents
-
view
158 -
download
6
description
Transcript of 第 3 章 FFT 快速傅氏变换
3.1 引言
3.2 直接计算DFT的问题及改进的途径
3.3 按时间抽取(DIT)的基2-FFT算法
3.4 按频率抽取(DIF)的基2-FFT算法
3.5 N为复合数的FFT算法
3.6 线性调频Z变换(Chirp-Z变换)算法
3.7 利用FFT分析时域连续信号频谱
3.8 FFT的其他应用
3.2 直接计算 DFT 的问题及改进的途径
3.2.1 直接计算 DFT 的运算量问题
1,,1,0 ,)()(1
0
NkWnxkXN
n
nkN
1
0
1,,1,0 ,)(1
)(N
k
nkN NnWkX
Nnx
两者的差别仅在指数的符号和因子 1/N.
通常x(n)和 都是复数,所以计算一个 X(k)的值需要N次复数乘法运算,和 次 复数加法运算.那么,所有的X(k)就要 N2次复 数乘法运算,N(N-1)次复数加法运算.
nkNW
1N
一个 X(k) 的值的工作量 ,如 X(1)
1210 )1()2()1()0()1( NNNNN WNxWxWxWxX
N 点 DFT 运算量:
复数乘法: N2
复数加法: N(N-1)
3.2.2 改进的途径的对称性、周期性、可约性nk
NW
.
),1(1
),1(
)2/(
2/
)(2)()(
2
kN
NkN
jN
NN
nkNnN
NkN
nkN
knNN
kNnN
WW
eWW
eWWWWWN
nkN
nkN WW *)(对称性 :
mnk
mN
nmkmN
nkN WWW 可约性 :
周期性 : )()( NknN
kNnN
nkN WWW
3.3 按时间抽取 (DIT) 的基- 2FFT 算法 (库利 -图基算法)
( 一 )N/2 点 DFT1. 先将 x(n) 按 n的奇偶分为两组作 DFT, 设 N=2
M , 这样有 : n 为偶数时 : n 为奇数时 : 1,,1,0 ),()12(
1,,1,0 ),()2(
22
21
N
N
rrxrx
rrxrx
1
0
)()]([)(N
n
nkNWnxnxDFTkX
3.3.1 算法原理
1
0
)12(1
0
222
)12()2(NN
r
krN
r
rkN WrxWrx
1
0
1
0)()()(
N
n
N
n
nkN
nkN WnxWnxkX
(n 为偶数 ) (n 为奇数 )
2
22 )/(222
N
NN WeeW
jjN
因为:
)()()()()( 21
1
02
1
01
2
2
2
2kXWkXWrxWWrxkX k
Nr
rkkN
r
rkN
N
N
N
1
0
22
1
0
21
22
))(())((NN
r
rkN
kN
r
rkN WrxWWrx
2.两点结论: (1) X (k),X (k)均为 N/2点的 DFT。 (2) X(k)=X (k)+W X (k)只能确定出
X(k)的 k= 个;即前一半的结果。
1
0
1
022
1
0
1
011
2
2
2
2
2
2
2
2
12
2
N
N
N
N
N
N
N
N
r
rk
r
rk
r
rk
r
rk
WrxWrxkX
WrxWrxkX
)()()(
)()()(
1 2
1 2kN
1,,1,0 2 N
这就是说 ,X1(k),X2(k) 的后一半 , 分别 等于其
前一半的值。
3.X(k) 的后一半的确定
)()()()2
( 1
1
01
)(1
011
2
2
2
2
2
kXWrxWrxkN
X
N
N
N
N
N
r
rkkr
r
rkkrN
N
N WW2
2
2
)( 由于 (周期性)
)()( kXkN
X 22 2同理:
可见 ,X(k)的后一半,也完全由 X1(k), X2 (k)的前一半所确定。
*N 点的 DFT 可由两个 N/2 点的 DFT 来计算。
)2
()2
()2
( 212
NkXW
NkX
NkX
Nk
N
1,,1,0 ),()(221 Nk
N kkXWkX
kN
kNN
kN WWWW
NN
22 )(又由于 ,所以
实现上式运算的流图称作蝶形运算( N/2 个蝶形 )
4. 蝶形运算
12
2,1,0k )()()(
12
2,1,0k ()()(
21
21
NkXWkXkX
NkXWkXkX
kN
kN
后一半
)前一半
( 前一半 ))()()( kXWkXkX kN 21
( 后一半 ))()()2
( 21 kXWkXkN
X kN
1 1
11
-1
)(1 kX
)(2 kXk
NW
(1)N/2 点的 DFT 运算量 :复乘次数 :复加次数 :
(2) 两个 N/2 点的 DFT 运算量 :复乘次数 :复加次数 :
(3)N/2 个蝶形运算的运算量 :复乘次数 :复加次数 :
5. 计算工作量分析
复乘 :复加 :
4)
2(
22 NN
)12
(2
NN
2
2N
)12
( N
N
2
N
NN
22
2)1
2(
2NN
NN
222
22 NNN总共运算量 :
按奇、偶分组后的计算量:
* 但是 ,N 点 DFT 的复乘为 N2 ; 复加 N(N-1);与分解后相比可知 , 计算工作点差不多减少 一半。
例如 N=8 时的 DFT, 可以分解为两个 N/2=4 点的 DFT. 具体方法如下 :
(1)n 为偶数时 , 即 分别记作 :
)(42/ 1 kXDFTN ,得点的进行
3,2,1,0
)2()()(3
04
3
0411
k
WrxWrxkXr
rk
r
rk
);6()3(
),4()2(
),2()1(
),0()0(
1
1
1
1
xx
xx
xx
xx
);6(),4(),2(),0( xxxx
(2) n为奇数时 ,分别记作 :
);7()3(
),5()2(
),3()1(
),1()0(
2
2
2
2
xx
xx
xx
xx
3,2,1,0
)12()()(3
04
3
0422
k
WrxWrxkXr
rk
r
rk
)(42/ 2 kXDFTN ,得点的进行
3,2,1,0),()()4(
)()()(
21
21
kkXWkXkX
kXWkXkXk
N
kN
x1(0)=x(0)
x1(1)=x(2) N/2点 x1(2)=x(4) DFT
x1(3)=x(6)
x2(0)=x(1)
x2(1)=x(3) N/2点 x2(2)=x(5) DFT
x2(3)=x(7)
1 2~ ~
X1(0)
X1(1)
X1(2)
X1(3)
X2(0)
X2(1)
X2(2)
X2(3)WN
2
WN1
WN0
WN3
-1
-1
-1
-1
X(0)
X(1)X(2)
X(3)
X(4)
X(5)
X(6)X(7)
(3)对 X (k)和 X (k)进行蝶形运算 ,前半部为 X(0) X(3), 后半部分为 X(4) X(7) 整个过程如下图所示 :
由于 N=2 M , 所以 N/2 仍为偶数 ,可以进一步把每个 N/2 点的序列再按其奇偶部分分解为两个 N/4 的子序列。例如,n为偶数时的 N/2 点分解为 :
( 二 ) N/4 点 DFT
1102431 Nlxlx ,,,),()(
1,,1,0),()12( 441 Nlxlx
klN
l
lkN
l
lkN
l
lkN
l
WlxWlxkX
WlxWlxkX
NN
NN
)12(2/
1
014/
1
044
22/
1
014/
1
033
)12()()(
)2()()(
44
44
(偶中偶
)
(偶中奇 )
进行 N/4 点的 DFT, 得到
)()()( 4312
kXWkXkX kN
1,,1,0 4 Nk
从而可得到前 N/4 的 X1(k)
后 N/4 的 X1(k) 为
)()()4
( 4312
kXWkXkN
X kN
1,,1,0 4 Nk
( 奇中偶 )
1
04/64/
1
026
1
04/5
1
04/25
44
44
)()12()(
)()2()(
NN
NN
l
lkN
lkN
l
l
lkN
l
lkN
WlxWlxkX
WlxWlxkX
( 奇中奇)
同样对 n为奇数时, N/2 点分为两个 N/4 点 的序列进行 DFT ,则有 :
14
,,1,0k
; (k)XW(k) X(k) X 6kN/252
N
14
,,1,0k
; (k)XW(k) Xk)4
N( X 6
kN/252
N
进行碟形运算,得:、由 )()( 65 kXkX
例如 ,N=8时的 DFT可分解为四个 N/4的DFT,
具体步骤如下 :
)4()2()1(
)0()0()0(
)()()(
13
13
13
xxx
xxx
nxrxlx
(1) 将原序列 x(n) 的“偶中偶”部分 :
构成 N/4 点 DFT ,从而得到 X3(0), X3(1) 。
)6()3()1(
)2()1()0(
)()()(
14
14
14
xxx
xxx
nxrxlx
(2) 将原序列 x(n) 的“偶中奇”部分 :
构成 N/4 点 DFT ,从而得到 X4(0), X4(1) 。
(3) 将原序列 x(n) 的“奇中偶”部分 :
)5()2()1(
)1()0()0(
)()()(
25
25
25
xxx
xxx
nxrxlx
构成 N/4 点 DFT ,从而得到 X5(0), X5(1) 。
(4) 将原序列 x(n) 的“奇中奇”部分 :
)7()3()1(
)3()1()0(
)()()(
26
26
26
xxx
xxx
nxrxlx
构成 N/4 点 DFT ,从而得到 X6(0), X6(1) 。
( 5 )由 X3(0),X3(1),X4(0),X4(1) 进行碟形运算
, 得到 X1(0),X1(1),X1(2),X1(3) 。
( 6 )由 X5(0),X5(1),X6(0),X6(1) 进行碟形运
算 ,得到 X2(0),X2(1),X2(2),X2(3) 。
(0)= (0)= (0) N/4 (1)= (2)= (4) DFT (0)= (1)= (2) N/4 (1)= (3)= (6) DFT (0)= (0)= (1) N/4
(1)= (2)= (5) DFT (0)= (1)= (3) N/4 (1)= (3)= (7) DFT
3 1
3 1
4 1
4 1
5 2
5 2
6 2
6 2
0
2N
N
0
2
N
N
W
W
W
W
0
1
2
3
N
N
N
N
-1
-1
-1
-2
-1
-1
W
W
W
W
X (0)
X (1)
X (0)
X (1)
X (0)
X (1)
X (0)
X (1)
3
3
4
4
5
5
6
6
X (0)
X (1)
X (2)
X (3)
X (0)
X (1)
X (2)
X (3)
1
1
1
2
2
2
2
1
X(0)
X(1)
X(2)
X(3)
X(4)
X(5)
X(6)
X(7)
(7) 由 X1(0),X1(1),X1(2),X1(3); X2(0),X2(1), X2(2),X2(3) 进行碟形运算 , 得到 X(0), X(1), X(2), X(3) X(4), X(5), X(6), X(7) 。
这样,又一次分解,得到四个N/4点 DFT, 两级蝶形运算,其运算量有大约减少一半, 即为N点 DFT的 1/4。对于N=8时 DFT,N/4点即为两点DFT,因此
0,1k ,)()(
0,1k ,)()(
0,1k ,)()(
0,1k ,)()(
4/
1
066
1
04/55
1
04/44
1
04/33
lkN
l
l
lkN
l
lkN
l
lkN
WlxkX
WlxkX
WlxkX
WlxkX
)4()0()1()0()1(
)4()0()1()0()0(0
31233
03
0233
xWxxWxX
xWxxWxX
N
N
)6()2()1()0()1(
)6()2()1()0()0(0
41244
04
0244
xWxxWxX
xWxxWxX
N
N
)5()1()1()0()1(
)5()1()1()0()0(0
51255
05
0255
xWxxWxX
xWxxWxX
N
N
)7()3()1()0()1(
)7()3()1()0()0(0
61266
06
0266
xWxxWxX
xWxxWxX
N
N
(0) (4) (2) (6) (1) (5) (3) (7)
WN0
WN0
WN0
W 0N
-1
-1
-1
-1
X (0)
X (1)
X (0)
X (1)
X (0)
X (1)
X (0)
X (1)
3
3
4
4
5
5
6
6
WN0
WN2
WN0
WN2
-1
-1
-1
-1
X (0)
X (1)
X (2)
X (3)
X (0)
X (1)
X (2)
X (3)
1
1
1
2
1
2
2
2
W
W
W
W
N0
N1
N2
N3
-1
-1
-1
-1
X(0)
X(1)
X(2)
X(3)
X(4)
X(5)
X(6)
X(7)
x
xx
x
xx
x
x
因此 ,8 点 DFT 的 FFT 的运算流图如下:
3.3.2 按时间抽取的 FFT 算法与直接计算 DFT 运算量的比较
复乘 : mF = ( N/2).M= ( N/2)log2 N
复加 : aF =N .M=N log2 N
lbN
N
lbNN
N
MNN 2
22
22
由上节分析可知 ,N=8 需三级蝶形运算 由此可知 ,N=2M 共需 M级蝶形运算 , 而且每级都由 N/2 个蝶形运算 组成 ,每个蝶 形运算有一次复乘 ,两次复加。因此 ,N点的 FFT 的运算量为 :
直接计算 DFT 与 FFT 算法的计算量之比:
例:如果通用计算机的速度为平均每次复数乘需要 5us ,每次复数加法需要 0.5us 用它来计算 512 点的 DFT 〔 x(n)〕,问 1) 直接计算需要多长时间? 2)用 FFT 需要多长时间?解: 1) 直接计算复乘: T1 = 5×10 - 6×N2=1.31072S
sN N 01152.0log2 2
2) 用 FFT 计算复乘: T1 = 5×10 - 6×
sN N 002304.0log2 复加: T2 = 0.5×10 - 6×
T= T1+ T2=0.013824s
思考:若计算 300 点的 DFT ,运算量个为多少?
复加: T2 = 0.5×10 - 6×N(N-1)=0.130816 S T= T1+ T2=1.441526s
(0)=X0(0) X1(0) X2(0) X3(0)=X(0)
(4)=X0(1) X1(1) X2(1) X3(1)=X(1)
(2)=X0(2) X3(2)=X(2)
(6)=X0(3) X3(3)=X(3)
(1)=X0(4) X1(4) X2(4) X3(4)=X(4)
(5)=X0(5) X3(5)=X(5)
(3)=X0(6) X3(6)=X(6)
(7)=X0(7) X1(7) X2(7) X3(7)=X(7)
W
W
W
W
N0
N2
N0
N2
-1
-1
-1
-1
W
W
W
WN
N
N
N0
1
2
3
W
W
W
W
N0
N0
N0
N0
-1
-1
-1
-1
.
.
.
.
.
.
.
.
.
.
.
3.3.3 按时间抽取的的 FFT 算法的特点及 DIT-FFT 程序框图
1. 原位运算输入数据、中间运算结果和最后输出均用同一存储器。
xxx
xxxxx
r
Nmmm
rNmmm
WjXkXjX
WjXkXkX
)()()(
)()()(
11
11
设用 m(m=1,2,… ,M) 表示第 m列 ;用 k,j 表示蝶形
输入数据所在的(上 /下)行数 (0,1,2,… ,N-1);这时任何一个蝶形运算可用下面通用式表示:
由运算流图可知 ,一共有 N个输入 /出行 ,一共有log2 N=M 列(级)蝶形运算 .
-1
)()()( 11 jXWkXkX mr
Nmm
)()()( 11 jXWkXjX mk
Nmm
)(1 kX m
)(1 jX mr
NW
可见 ,在某列进行蝶形运算的任意两个节点 (行 )k 和 j的节点变量
就完全可以确定蝶形运算的结果 , 与其它行 (节点 )无关。 这样 ,蝶形运算的两个输出值仍可放回蝶形运算的两个输入所在的存储器中 ,即实现所谓原位运算。每一组 (列 )有 N/2 个蝶形运算 ,所以只需N个存储单元,可以节省存储单元。
)(),( jXkX mm
)(),( 11 jXkX mm
2 倒位序规律
由图可知 ,输出 X(k) 按正常顺序排
列在存储单元 ,而输入是按顺序 :
这种顺序称作倒位序 ,即二进制数倒位。
);); 7(),3(),5(),1(6(),2(),4(),0( xxxxxxxx
n =00
n =10
n =01
n =11
n =01
n =11
0
1
0
1
0
1
0
1
),,( 012 nnnx
(n2)
x(000) 0
x(100) 4
x(010) 2
x(110) 6
x(001) 1
x(101) 5
x(011) 3
x(111) 7
(偶)
(奇)
这是由奇偶分组造成的 ,以 N=8 为例 说明如下 :
3. 倒位序实现 输入序列先按自然顺序存入存储单元 ,然后经变址运算来实现倒位序排列
设输入序列的序号为 n, 二进制为 (n2 n1 n0 )2 , 倒位序顺序用 表示 ,其倒位序二进制为 (n0 n1 n2 )2 , 例如 , N=8 时如下表:
n̂
0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 4 2 0 1 0 0 1 0 2 3 0 1 1 1 1 0 6 4 1 0 0 0 0 1 1 5 1 0 1 1 0 1 5 6 1 1 0 0 1 1 3 7 1 1 1 1 1 1 7
自然顺序 n 二进制 n n n 倒位序二进制 n n n 倒位顺序 n^2 1 0 0 1 2
A(1) A(2) A(3) A(4) A(5) A(6) A(7) A(8)x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7)
x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7)
变址处理方法
存储单元自然顺序
变址
倒位序4. 蝶形运算两节点的距离 :2m-1
其中 ,m表示第 m列 ,且 m =1,… ,M 例如 N=8=23 , 第一级 (列 )距离为 21-1=1, 第二级 (列 )距离为 22-1=2 , 第三级 (列 )距离为 23-1=4。
5.WNr 的确定
考虑蝶形运算两节点的距离为 2m-1 , 蝶形运算可表为 Xm(k)=Xm-1(k)+Xm-1(k+2m-1)WN
r
Xm(k+2m-1)=Xm-1(k)-Xm-1(k+2m-1)WNr
由于 N为已知 ,所以将 r的值确定即可。
为此,令第一个节点标号 k=(n2n1n0)2 , 再将 k= (n2n1n0)2 左移 (M-m) 位 ,右边位置补零 , 就可得到 (r)2 的值,即 (r)2 =(k)22M-
m 。
r 的确定 :
例如 N=8=23
(1)k=2 , m=3 的 r 值 ,
∵k=2=(010)2 左移M-m=3-3=0 ,
∴ r=(010)2=2;
(2)k=3 ,m=3 的 r 值 ; k= 3=(011)2,
左移 0 位 ,r=3;
(3)k=5 ,m=2 的值 ; k=5=(101)2 ,
左移M-m=1 位 r=(010)2 =2 。
共计 (N+N/2) 个存储单元。
6. 存储单元
x 存输入序列 (n),n=0,1, ,N-1,
计 N 个单元 ;
r
NW 存放 系数 , r=0,1, , ( N/2 ) -1, 需 N/2 个存储单元;
3.4 按频率抽取( DIF) 的基- 2FFT 算法 (桑德—图基算法 )
3.4.1 算法原理 1.N 点 DFT 的另一种表达形式
1
0
)()(N
n
nkNWnxkX
1
2/
1
0
)()(2 N
Nn
nkN
n
nkN WnxWnx
N
1
0
)(1
0
22
2
)2
()(
NN
N
n
knN
n
nkN W
NnxWnx
nkN
n
kN WW
Nnxnx
NN
1
0
22)
2()(
, 12 jN eW
N kkN
N
W )1(2
nkN
n
k WN
nxnxkX
N
1
0
2
)2
()1()()(
1,,1,0 Nk
2.N 点 DFT 按 k的奇偶分组可分为两个 N/2 的 DFT 当 k 为偶数 ,即 k=2r 时 ,(-1)k =1; 当 k 为奇数 ,即 k=2r+1 时 (-1)k =-1 。 这时 X(k) 可分为两部分:
nr
n
nrN
n
N
N
N
WN
nxnx
WN
nxnxrX
2
2
2
1
0
21
0
)2
()(
)2
()()2(
1,,1,0 2 Nr
k 为偶数时:
k 为奇数时:
nr
n
nN
rnN
n
N
N
N
WWN
nxnx
WN
nxnxrX
2
2
2
1
0
)12(1
0
)2
()(
)2
()()12(
1,,1,0 2 Nr
1,,1,0
)]2
()([)(
)2
()()(
2
2
1
N
nN
n
WN
nxnxnx
Nnxnxnx
1,,1,0
)()12(
)()2(
21
2
02
12
01
2
2
N
nr
N
n
nr
N
n r
WnxrX
WnxrX
N
N
可见 ,上面两式均为 N/2 的 DFT 。
)2
()()(1
Nnxnxnx
1,,1,02 Nn
nNW
Nnxnxnx
)
2()()(2
3. 蝶形运算进行如下碟形运算:和 )
2()(
Nnxnx
-1n
NW)
2(
Nnx
)(nx
-1
-1
-1
-1
W
W
W
W
N
N
N
N
0
1
2
3
4.N=8 时 , 按 k 的奇偶分解过程
先蝶形运算,后 DFT:)0(x)1(x
)5(x)4(x
)3(x
)2(x
)7(x)6(x
)0(X
)2(X
)6(X
)1(X)3(X
)5(X
)7(X
)4(XDFT
N点2
DFT
N点2
5.仿照 DIT的方法
再将 N/2 点 DFT 按 k的奇偶分解为两个
N/4 点的 DFT
X[0]
X[6]
X[4]
X[2]
X[1]
X[5]
X[3]
X[7]
0NW1NW2
NW3
NW-1
-1
-1
-1
x[0]
x[3]
x[1]
x[2]
x[4]
x[5]
x[6]
x[7]
0NW
2NW
2 点DFT
-1
-1
2NW
0NW
-1
-1
2 点DFT
2 点DFT
2 点DFT
(0) X(0) (1) X(4) (2) X(2) (3) X(6) (4) X(1) (5) X(5) (6) X(3) (7) X(7)
-1
-1
-1
-1
W
W
W
W
N
N
N
N
0
1
2
3
-1
-1
-1
-1
W
W
W
W
N
N
N
N
0
2
0
2
-1
-1
-1
-1
W
W
W
W
N
N
N
N
0
0
0
0
x
x
x
x
x
x
x
x
6. 如此进行下去 , 直至分解为 2点 DFT
3.4.2 按频率抽取法的运算特点
rNmmm
mmm
WjXkXjX
jXkXkX
)]()([)(
)()()(
11
11
-1 WN
r
)(1 kX m
)(1 jX m
)()()( 11 jXkXkX mmm
rNmmm WjXkXjX )]()([)( 11
每级 ( 列 ) 都是由 N/2 个蝶形运算构成 ,即 :
DIF 法与 DIT 法的异同
1.相同点 (1) 进行原位运算; (2) 运算量相同;
2.不同点 DIT 先作复乘再作加减; DIF 先作减法再作复乘
Matlab 中快速离散傅立叶变换函数一维快速离散傅立叶正变换函数Y = fft(x) 当 x 的长度为 2 的整数幂时,用基- 2 算法,否则用分裂算法Y = fft(x,n) n 点的快速傅立叶变换,当 x 大于 n 时截断x ,当 x小于 n 时补零一维快速离散傅立叶逆变换函数Y =ifft(x)Y = ifft(x,n)
例:求 ; N=14 点的 DFT
)14/6cos()( nnx
Matlab 程序如下:
clear allN=14;n=0:1:N-1;xn=cos((6*pi*n)/14);XK =fft(xn,N);magXK=abs(XK);phaXK=angle(XK);subplot(2,1,1);stem(n,xn)xlabel('n');ylabel('x(n)');title('x(n)) N=14');subplot(2,1,2)k=0:length(magXK)-1;stem(k,magXK,'.');xlabel('k');ylabel('|X(k)|');title('X(k) N=14');
3.5 N 为复合数的 FFT 算法
1) 若序列的点数 N=2M 时,采用基 -2FFT 算法的基本原理。这种基 -2FFT 算法程序简单,效率高,使用方便,在实际中使用得最多。
2) 若不满足 N=2M ,可将 x(n)增补一些零值点。 有限长序列补零之后,并不影响其频谱 X(ejω) ,只不过其频谱的抽样点数增加了,所造成的结果是增加了计算量而已。 但是,有时计算量增加太多,浪费较大。
3) 若 N 是一个复合数,即它可以分解成一些因子的乘积,则可以
用 FFT 的一般算法,即混合基 FFT 算法,如库利 - 图基( Coole
y Tukey )算法,而基 -2 算法只是这种一般算法的特例。
问题引出:( 1)实际中,也许对其它围线上 z变换取样发生兴趣。如语音处理中,常常需要知道某一围线 z变换的极点所处的复频率。
( 2)只需要计算单位圆上某一段的频谱。如窄带信号,希望在窄带频率内频率抽样能够非常密集,提高分辨率,带外则不考虑。
( 3)若 N是大素数时,不能加以分解,又如何有效计算这种序列 DFT 。例 N=311 ,若用基2则须补 N=28=512 点,要补 211 个零点。
3.6 线性调频 Z变换( Chirp-Z变换)算法
单位圆与非单位圆采样( a ) 沿单位圆采样 ; (b) 沿 AB 弧采样
o o
o o A B
X (e j)
Re [z ] Re [z ]
jIm [z ]jIm [z ]
A
B
(a ) (b )
X (e j)
3.6.1 算法基本原理 已知 x(n) ( 0≤n≤N-1 )是有限长序列,其 Z变换为
1
0)()(
N
n
nznxzX
为适应 z可以沿 Z平面更一般的路径取值,故沿 Z平面上的一段螺线作等分角的采样, z的这些采样点 zk 为 zk=AW-k k=0, 1, …, M-1
M 为所要分析的复频率的点数,即采样点的总数,不一定等于 N; A和 W都是任意复数,可表示为 :
0
0
0
0
j
j
eWW
eAA
令:
)(0000
0000 kjkjkkjk eWAeWeAz 则:
])1(()1(001
)(00
)(1001
00
00
00
00
0
MjMM
kjkk
j
j
eWAz
eWAz
eWAz
eAz
螺线采样
A0 表示起始采样点 z0 的矢量半径长度,通常 A0≤1; 否则 z0将处于单位圆 |z|=1 的外部。 θ0 表示起始采样点 z0 的相角,它可以是正值或负值。φ0 表示两相邻采样点之间的角度差。 φ0 为正时,表示 zk 的路径是逆时针旋转的; φ0 为负时,表示 zk 的路径是顺时针旋转的。W0 的大小表示螺线的伸展率。W0>1 时,随着 k 的增加螺线内缩 ; W0<1 时,则随 k 的增加螺线外伸 ; W0=1 时,表示是半径为 A0 的一段圆弧。 若又有 A0=1, 则这段圆弧是单位圆的一部分。
1
0
1
0
)(
)()(
N
n
nkn
N
n
nkk
WAnx
znxzX
0≤k≤M-1
复数乘法: NM次 复数加法: (N-1)M 次当 N , M很大时 , 这个量很大 , 这就限制了运算速度。但是,我们通过一定的变换,可以采用 FFT 算法,这样就可以大大提高运算速度。
这样,延螺线采样值为:
nk 可以用以下表达式来替换
])([2
1 222 nkknnk
2
)(1
0
22
22
)(1
0
2
222
222
])([
)()(
nkN
n
nn
k
knkN
n
nn
k
WWAnxW
WWWAnxzX
如果定义 :
2
2
2
2
)(
)()(n
nn
Wnh
WAnxng
n=0, 1, …, N-1
则它们的卷积为:
2
)(1
0
2
1
0
22
])([
)()()()(
nkN
n
nn
N
n
WWAnx
nkhngkhkg
)]()([)( 2
2
khkgWzXk
k 所以:k=0, 1, …, M-1
Chirp-Z变换的线性系统表示
x (n )
2/ 2 )( nWnh
2/ 2nnWA
g (n )h (n )
£ £½£ 1 / h (n )
X (zn
)
线性系统 h(n) 是非因果的,当 n 的取值为 0 到 N-1 , k 的取值为 0, 1, …, M-1 时, h(n) 是在 n=-(N-1) 到 n=M-1 取值。也就是说, h(n) 是一个有限长序列,点数为 N+M-1 ,见图 3-20( a)。输入信号 g(n)也是有限长序列,点数为 N 。 g(n)*h(n)的点数为 2N+M-2 ,因而用圆周卷积代替线性卷积且不产生混叠失真条件是圆周卷积的点数应大于或等于 2N+M-2 。但是,由于我们只需要前 M 个值 X ( zk ) (k=0, 1, …, M-1) ,对以后的其他值是否有混叠失真并不感兴趣,这样可将圆周卷积的点数缩减到最小为 N+M-1 。当然,为了进行基 -2 FFT 运算,圆周卷积的点数应取为 L≥N+M-1 ,同时又满足 L=2m 的最小 L。这样可将 h(n) 先补零值点,补到点数等于 L,也就是从 n=M开始补 L-(N+M-1) 个零值点,补到 n=L-N处,或补 L-(N+M-1) 个任意序列值,然后将此序列以 L为周期而进行周期延拓,再取主值序列,从而得到进行圆周卷积的一个序列,如图 3-20 ( b)所示。 进行圆周卷积的另一个序列只需要将 g(n)补上零值点,使之成为 L点序列即可,如图 3-20 ( c)所示。
3.6.2 Chirp-Z 变换( CZT )的实现步骤
图 3-20 Chirp-Z 变换的圆周卷积图( M≤n≤L-1 时, h(n) 和 g(n) 的圆周卷积不代表线性卷积)
o n
n
n
no
o
o
M £ 1
M £ 1 L £ N £«1 L £ 1
£ ( N £ 1)
N £ 1
M £ 1
¡
2 2n
W£
2/]))[(( 2 )( LnWnh £ £½
ÈÎÒâÖµ
2
2
)( )(n
nWAnxng £ £½
h (n ) g (n )
(a )
(b )
(c )
(d )
n £½M ÒÔºóµÄÐòÁÐûÓл ³ö
L £ 1
L
( 1 )选择一个最小的整数 L,使其满足 L≥N+M-1 ,同时满足 L=2m ,以便采用基 -2 FFT 算法。
0
)()(2
2
nxWAng
nn 0≤n≤N-1
N≤n≤L-1
1
0
2
)()(N
n
rnL
jengrG
0≤r≤L-1
CZT 运算的实现步骤:
2
2
)()(n
nWAnxng ( 2 )将 补上零值点, 变为 L点序列,因而有:
( 3)形成 L点序列 h(n)
2
)(
2
2
2
)(0)(nL
n
W
W
nh 或任意值
0≤n≤M-1
L-N+1≤n≤L-1
M≤n≤L-N
1
0
2
)()(L
n
rnL
jenhrH
0≤r≤L-1
( 4 )将 H(r) 和 G(r) 相乘,得 Q(r)=H(r)G(r) , Q(r) 为 L点频域离散序列。
( 5 )用 FFT 法求 Q(r) 的 L点 IDFT ,得 h(n) 和 g(n)的圆周卷积
1
0
2
)()(1
)()()(L
r
rnL
jerGrH
Lnqngnh
L
式中,前 M 个值等于 h(n) 和 g(n) 的线性卷积结果[ h(n)*g(n) ] ; n≥M 的值没有意义,不必去求。
10)()( 2
2
MkkqWzXk
k
( 6)求 )( kzX
1 )形成 L点序列 ,但只有其中 N点序列值,需要 N次复乘,而系数 可事先准备好。
)()()( 2
2
nxWAngn
n
2
2nnWA
3.6.3 运算量的估计
2 )形成 L点序列 h(n) 。 h(n)也可事先准备好, h(n) 的 L点 FFT 即 H(r)也可预先计算好,可不用考虑其计算量。
5)计算 X(zk)= ( 0≤k≤M-1 ),需要 M次复乘。 )(2
2
kqWk
3 )计算 G(r) , q(n), 需要 2次 L点 FFT ( IFFT ),共需要 LlbL次复乘。 4 ) 计算 Q(r)=G(r)H(r), 需要 L 次复乘
当 N, M 都较大时(例如 N, M 都大于 50 时), CZT 的 FFT 算法比直接算法的运算量要小得多。
CZT 总的复数乘法次数为: mc=L lbL+N+M+L
与标准 FFT 算法相比, CZT 算法有以下特点:输入序列长 N 及输出序列长 M不需要相等。 N 及 M不必是高度合成数,二者均可为素数。 Zk 的角间隔是任意的,其频率分辨率也是任意的。周线不必是 z 平面上的圆,在语音分析中螺旋周线具有某些优点。
起始点 z0 可任意选定,因此可以从任意频率上开始对输入数据进行窄带高分辨率的分析。
若 A=1,M=N, 可用 CZT 来计算 DFT ,即使 N 为素数时也可以。
总之, CZT 算法具有很大的灵活性,在某种意义上说 ,它是一个一般化的 DFT 。
FFT 算法应用
利用 N点复序列的 FFT 计算两个 N点实序列 FT
利用 N点复序列的 FFT ,计算 2N点序列的 FFT
利用 FFT 计算 IFFT
利用 N点复序列的 FFT 算法计算
两个 N点实序列 FFT
x1(n), x2(n) 是实序列,
将其构成复序列 Y(k)=X1(k)+j X2(k)
DFT{x1( n)+j x2(n)}=YR (k)+jYI (k)
?)(1 nxDFT
?)(2 nxDFT
)()( 21 njxnxDFT ])[(])[( NINR kjYkY
]))[(][(])[(][2
1][1 NIINRR mYmYjmYmYkxDFT
]))[(][(])[(][2
1][2 NIINRR mYmYjmYmY
jkxDFT
利用 N 点复序列的 FFT ,计算 2N 点序列的 FFT
y[k] 是一个长度为 2N 的序列
1,1,0]12[][
]2[][][
2
1
Nkkykx
kykxky
1,,1,0 ][][][
][][][
221
221
NmmXWmXNmY
mXWmXmYmN
mN
问题:如何利用 N点 FFT ,计算 4N点序列的 FFT ?
利用 FFT 实现 IFFT mk
N
N
kWkxkxDFTmX ][][][
1
0
mkN
N
mWmX
NmXIDFTkx
][
1][][
1
0
mk
N
N
m
WmXN
kx ][1
][1
0
步骤: A) 将 X [m] 取共轭]}[{) mXDFTFFTB 流图计算用
C) 对 B) 中结果取共轭并除以 N
[例 ] 有一频谱分析用的 FFT处理器,其采 样点数必须是 2的整数幂 , 假定没有采用任何特殊的数据处理措施,已知条件为(1)频 率分辨率为 ( 2)信号的最高频率 ,试确定以下参量:( 1)最小记录长度 ;(2) 采样点间的最大时间间隔 T; (3) 在一个记录中的最小点数 N。
ZH10ZkH4
Pt
解: ( a ) 最小记录长度
sFtP 1.01011 stP 1.0,
( b )最大的采样时间间隔 T
s
ffT hs
3
3
10125.0
1042/12/1/1
(c) 最小记录点数 N
10242
80010/1042/210
3
N
FfN h
取
3.7.2 可能出现的误差用 FFT 对连续信号进行傅氏分析时可能造成的误差 1.混叠现象 为避免混叠 , 由采样定理可知,须满足 其中 , 为采样频率 ; 为信号的最高频率分量;
或者
其中 ,T 为采样间隔。但 和 F 矛盾:兼顾 和 F 应:
hs ff 2sf hf
hs ffT
2
11
hf
F
f
FN h21
hf
2. 栅栏效应 用 FFT 计算频谱时,只是知道为频率 的频谱采样值。在两个谱线之间的情况就不知道 , 这相当通过一个栅栏观察景象一样,故称作栅栏效应。
Nkwk2
减少栅栏效应的一个方法就是使频域采样更密,增加频域采样点数 N ,即在数据末端添加一些零值点,可使 F 变小来提高 辨力,使谱线更密。
3. 频谱泄漏与谱间干扰
在实际应用中,通常将所观测的信号 限制在一定的时间间隔内 ,也 就是说,在时域对信号进行截断操作 ,或 称作加时间窗 ,亦即用时间窗函数乘以信号 ,由卷积定理可知,时域相乘 ,频域为卷积 ,这就造成拖尾现象 , 称之为频谱泄漏 .
)(1 nx
0n
0
)(1 nx )(1jeX
n
)(2 nx
)(2jeX
n
)()( 21 nxnxny
jeY
减少频谱泄漏与谱间干扰:截断长度应该是周期的整数倍(正弦信号)
增加信号的长度
信号不要突然截断
例:求其 X(ejw) , X(k)
)n.cos()n.cos()n(x 520480
x(n) 前 10 点数据,求 X(ejw) , |X(k)|
混叠、不能区分 21 ,ww
x(n) 前 10 点数据,后补零至 100 点 , 求 X(ejw) , |X(k)|
混叠、 X(k)密度增加,不能区分 21 ,ww
x(n) 前 100 点数据,求 X(ejw) , |X(k)|
无混叠、能区分 21 ,ww
x(n) 前 128 点数据,求 X(ejw) , |X(k)|
有混叠、能区分 21 ,ww
x(n) 前 50 数据,求 X(ejw) , |X(k)|
无混叠、能区分 21 ,ww
例 :x(n)=e (-0.05n) ,取 N=20 求其 X(k)
o
o
o
o
o N / 4 N / 2 k
/ (rad / s)
f / Hz
f¡ä
/ rad
0.5
fs / 2
s / 2
ͼ3-25
例 3-已知信号
x(t)=0.15sin(2πf1t)+sin(2πf2t)-0.1sin(2πf3t) ,其
中 , f1=1Hz, f2=2 Hz, f3=3Hz。 x(t)包含三个正弦波,
但从时域波形图 3-26 ( a)来看,似乎是一个正弦信号,
很难看到小信号的存在, 因为它被大信号所掩盖。 取 fs=3
2 Hz作频谱分析。
nnnnTxnx
32
6sin1.0
32
4sin
32
2sin15.0)()(
解 因 fs=32 Hz ,故
该信号为周期信号,其周期为 N=32 。现对 x(n) 作32 点的离散傅里叶变换 (DFT) ,其幅度特性 |X(k)|如图 3-26(b) 所示。图中仅给出了 k=0, 1, …, 15 的结
果。 k=16, 17, …, 32 的结果可由 |X(N-k)|=|X(k)|
得出。因 N=32, 故频率分辨率 F=fs/N=1Hz。 由图 3-
26(b) 可知 , k=1, 2, 3 所对应的频谱即为频率 f1=1
Hz, f2=2 Hz, f3=3Hz 的正弦波所对应的频谱。幅
频图如图 3-26 ( b) , 该图中小信号成分清楚显示
出来。 可见小信号成分在时域中很难辨识而在频域中
容易识别。
图 3-26 已知信号的时域图和幅频图
£ 2
£ 1
0
1
2
0 10 20 30
(a ) (b )
00
5 10 15
8
16
n k
x (n ) |X (k )|
3.8 FFT 的其他应用一. FFT算法的快速卷积法1 原理
1
0
)()()()()(L
m
mnhmxnhnxny
点,则:为输出 1)( MLny
)(nh离散线性移不变系统的冲激响应 M 点)(nx输入有限长序列 L 点
直接计算乘法次数 md= ML
由圆周卷积定理得 Y ( k ) =X ( k ) H ( k )
)]().([)]([)( kHkXIDFTkYIDFTny
)()()()()(
1
nhnxnhnxny
MLN
则若取
2 用 FFT 算 的步骤 )(ny
;1)(),(.1 点补零点,至少为将 LMNnhnx
;求 )()(.2 nhFFTkH
;求 )()(.3 nxFFTkX ;求 )()()(.4 kHkXkY
。求 )()(.5 kYIFFTny
计算量:
)2
31(
2
3lbNNNNlbNmF
3 快速卷积结构图
h(n)N 点FFT H(k)
Y(k)
N 点FFT
X(k))(nx
N 点IFFT
)()()( nhnxny
四、直接计算线性卷积和 FFT 法计算线性卷积比较:
)1(123
1)1(
123
1
LMbLM
ML
bNN
ML
m
mK
F
dm
分两种情况讨论如下: ( 1 ) x(n) 与 h(n) 点数差不多。 例如, M=L ,则 N=2M-1≈2M ,则
bM
M
bM
MKm 135
123
25
2
这样可得下表:
M=L 8 16 32 64 128 256 512 1024 2048 4096
Km 0.572 0.941 1.6 2.78 5.92 8.82 16 29.24 53.9 99.9
当 M=8 时, FFT 法的运算量大于直接法;当 M=32 时,二者相当;当 M=512 时, FFT 法运算速度可快 16 倍;当 M=4096
时, FFT 法约快 100 倍。可以看出,当 M=L 且 M 超过 32 以后,M 越长, FFT 法的好处越明显。因而将圆周卷积称为快速卷积。
( 2 ) 当 x(n) 的点数很多时,即当 L>>M 。通常不允许等 x
(n) 全部采集齐后再进行卷积 ; 否则,使输出相对于输入有较长
的延时。此外,若 N=L+M-1 太大, h(n) 必须补很多个零值点,
很不经济,且 FFT 的计算时间也要很长。这时 FFT 法的优点就
表现不出来了,因此需要采用分段卷积或称分段过滤的办法。即
将 x(n) 分成点数和 h(n) 相仿的段,分别求出每段的卷积结果,
然后用一定方式把它们合在一起,便得到总的输出,其中每一段
的卷积均采用 FFT 方法处理。有两种分段卷积的办法 : 重叠相
加法和重叠保留法。
五 .几点说明 1.当 M=L 时 ,用圆周卷积计算线性 卷积的速度快 ,点数越多,速度越快 , N≥64时 ,速度增加明显 .
2. L>>M 时 , 速度增加不太明显 , 为了 增加速度 ,采用 : (1)重叠相加法 (2)重叠保留法。
例 x(n)=0.8n 长度为 12 , h(n) = R6(n) ,求线性卷积
n=[0:1:11];m=[0:1:5]N1=length(n);N2=length(m);
xn=0.8.^n;hn=ones(1,N2);yn1=conv(xn,hn);
N=N1+N2-1;XK=fft(xn,N);HK=fft(hn,N);
YK=XK.*HK;yn2=ifft(YK,N);
x=0:N-1;subplot(211);stem(x,yn1,'.')subplot(212);stem(x,yn2,'.')
N=17 点
N=22 点
N=10 点