DSP4 快速傅里叶变换

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 77

第4章 快速傅⽴叶变换(FFT)

4.1 概述
4.2 时间抽取基 2 算法
4.3 频率抽取基 2 算法
4.4 减少运算量的措施
4.5 分裂基算法
4.6 线性调频 Z 变换
(输⼊、输出取少数点的简化算法)1
4.1 概述 Fast Fourier-Transform

FFT是DFT的快速算法,
不是新的变换⽅法

2
计算DFT的计算量:
• 每算⼀个X(k),需要N次复数乘法,
N-1次加法
• 因此,N点DFT需要N*N次复数乘法,
N(N-1)次复数加法

直接计算 DFT的复杂度为
直接计算DFT 的复杂度为O(N
O(N2)

尽管预先算好并保存旋转因⼦ WNk 可节省部分运算,


但按定义求DFT的运算量仍然很⼤ 3
解决耗时的乘法问题是将DSP理论⽤于实际的
关键。特别是60年前,计算机的速度相当慢。
很多学者致⼒于解决DFT的快速计算问题。
Cooley J W, Tukey J W. An algorithm for the
machine computation of complex Fourier series.
Mathematics of Computation, 1965, pp297~301

4
FFT 的思路:

如何充
分利⽤
这些关

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

N点DFT运算可以分解为两组
N/2点DFT运算,然后再取和

DFT的复杂度与点数N有关!
6
四点
DFT

16乘,12加 7




1乘, 8加


=-j 8
4.2 时间抽取基 2 算法(库⾥-图基算法)

N点 N/2点 N/4点 2点
DFT DFT DFT DFT

1个 2个 4个 N/2个
问题是如何分最有效?可以对时间变量分
(DIT),也可对频率变量分(DIF)
9
令:

10
A(k), B(k)为
N/2点的DFT

11
12
都是 N/2 点的 DFT,它们各⾃⼜
可分成 N/4 点的DFT,如此继续分下去,直⾄
两点DFT。两点DFT不需要乘法运算:

每分⼀次
称⼀“级”

每⼀级有 N/2 个如下的“蝶形”单元:

13
{
即: 每⼀个蝶形单元仅需⼀个复数乘法、两个
复数加法。p,q两点构成⼀个蝶形单元,并且这
两点不再参与同级的别的蝶形单元的运算。
每个节点作为输⼊,只参与⼀个蝶形;作为输
出,也只参与⼀个蝶形 ——同址运算14
同址(in place)计算
 每⼀级的蝶形运算的输⼊和输出在运算前后
可以存储在同⼀地址的存储单元中,这种存
储策略称为同址计算
 同址计算可以节省存储单元,从⽽降低算法
对计算机存储容量的要求,降低了硬件实现
的成本

15
第0级 第1级 第2级

4组 2组 1组
4

所需运算量: 注意:
 因⼦的规律;
 输⼊序列的顺序
--码位倒置
16
logN级, 每级N/2个蝶形, 每个蝶形1个乘法, 2个加法
FFT算法与直接DFT算法运算量的⽐较

计算 计算
N N2 量之 N N2 量之
⽐ ⽐
2 4 1 4.0 128 16 384 448 36.6
4 16 4 4.0 256 65 536 1 024 64.0
8 64 12 5.4 512 262 144 2 304 113.8
16 256 32 8.0 1024 1 048 576 5 120 204.8
32 1028 80 12.8 2048 4 194 304 11 264 372.4

64 4049 192 21.4

17
第0级 第1级 第2级

4组 2组 1组

所需运算量: 注意:
 因⼦的规律;
 输⼊序列的顺序
--码位倒置
18
旋转因⼦(指数因⼦) 的确定:
随着蝶形运算在DIT中的级数以及该级
DIT节点数的不同⽽有规律的变化的:
级数 的取值范围 重复组数
第0级
第1级
第2级

第m-1级

第M-1级 1
19
第0级 第1级 第2级

4组 2组 1组

所需运算量: 注意:
 因⼦的规律;
 输⼊序列的顺序
--码位倒置
20
码位倒置(倒读,
0 000 000 0 倒位序):
4 100 001 1 是指按⼆进制表
2 010 010 2 示的数字⾸尾位
6 110 011 3 置颠倒,重新按
1 001 100 4 ⼗进制读数
5 101 101 5
3 011 110 6
7 111 111 7
21
倒位序的树状图(N=8)

第⼀次分组观察最低位n0 22
23
DIT-FFT算法流程
☆ 全部计算分解为 M=log2N 级,或称为M次迭代
☆ 每级都包含N/2个蝶形单元
☆ 每个蝶形单元都包含乘W与加、减法各⼀次

☆ 输⼊序列x(n)按码位倒置顺序排列,输出序
列X(k)按⾃然顺序排列

☆ 每级的若⼲蝶形单元组成“组(或称群)”。
第0级群数为N/2,第1级群数为N/4,……第i
级群数为N/2i+1,最后⼀级的群数为1
☆ 同⼀级中,各个群的W分布规律完全相同
24
4.3 频率抽取基 2 算 (Sande-Tukey算法)

- n = m + N/2
-
-

令:

25
(换底)

各是 N/2 点的
DFT

26
27
各是 N/2 点的
DFT

继续分解,直到两点DFT

将 分解: Decimation In Time, DIT 时间抽取


将 分解: Decimation In Freq. ,DIF 频率抽取
注意 DIT 和 DIF 的对偶性质
28
★DIT分解规则:
规则1 对时间进⾏偶奇分;
规则2 对频率进⾏前后分。

★DIF分解规则:
规则1 对时间进⾏前后分;
规则2 对频率进⾏偶奇分 。
29
输⼊正序,输出倒序。注意 因⼦的位置
30
DIT与DIF的异同
1. 相同运算量,相同分级数、每级蝶形数,
同址运算特点
2. DIT输⼊码位倒置,DIF输出码位倒置
——不是本质区别:输⼊输出可以重排

3. 蝶形单元不同:DIT先复乘后加减,
DIF先减再复乘 —— 本质区别!!
4. DIF、DIT蝶形单元互为易位(转置)
(交换输⼊输出,所有⽀路反向,⻅T 2.1531)
作业1

 画出DIF蝶形单元(输⼊左,
输出右),写出迭代公式

—— 参考图4.2.3,公式(4.2.8)
32
4.4 进⼀步减少运算量的措施
第0级 第1级 第2级

4组 2组 1组

33
4.4.1 多类蝶形单元
FFT中乘法运算主要来⾃和复指数相乘:
(1 组)
复数
(2 组) 乘法
(4 组) 数

(N/4 组)
(N/2 组)
34
旋转因⼦
(twiddle
factor)

不需要乘法:
平凡(trivial )旋转因⼦

35
M 级,前两级都是 ,去除之:
(复乘)

( 如第2级共有 N/8 组,
后 M-2 级,含有
每组2个平凡因⼦ )

再去除之:

36
虚实部相等,
trivial ~
两个复数相乘,需要四次实乘、两次实加。
实现和 的相乘,需两次实乘,两次实加。
N点FFT中,有多少个 第2级起,每组各有1

将所有平凡旋转因⼦去除,或单独考虑
37
实乘
实加

各种算法⽐较的基础

• 以上称为多蝶形单元运算
• 计算量的减少以增加程序复杂度为代价
38
4

多蝶形单元运算所需计算量的⽐较
(三、四类 实数加并⽆变化) 39
4.4.2 旋转因⼦的⽣成
产⽣旋转因⼦的⽅法直接影响运算速度。
⽅法⼀:在每⼀级运算中直接产⽣;
⽅法⼆:在FFT程序开始前预先计算出旋
转因⼦,存放在⼀个数组中,作为旋转
因⼦表,在程序执⾏过程中采⽤查表法,
这样运算速度可⼤⼤提⾼,缺点是旋转
因⼦表要占⽤较多的内存
40
4.4.3 实序列的FFT

作业2

P 181, T 4.8

41
4.5 分裂基 (Split-radix) 算法
基-2 算法: 1965年, DSP 发展⾥程碑;
基-4 算法 : 对基-2 算法的改进;
分裂基算法: 1984年, 接近最优的 FFT!

Winograd 算法:1976年提出,是具有鲜明特
⾊的FFT! ⽤到较多的数论知识,可⽤于N不
等于2的整次幂情形
42
(基4 DIT 的基本单元) = -j 43
基4 DIF 的基本单元: 不需要乘法!

以 4 为基,分解时级数可减少1半,因此可减
少乘法次数。

44
基2 和基4 算法的⽐较:

基2 DIF:
旋转因⼦都出现在奇序号项输出,在求出
偶序号项时不需要乘法。每⼀级都是如此
基4
45

46
分析上述结果可知,在基-4 算法中,N/4个
偶序号输出也要乘W因⼦。⽽基-2 算法的
偶序号项都不要乘W因⼦。

对偶序号项输出⽤基-2 算法,
对奇序号项输出⽤基-4算法。

47
—————

基 2 / 4 算法
48
49
各种算法所需计算量的⽐较
(4类蝶形)
50
使
基2 ⽤



基4 形


分裂基 需


极限 量
51
4.6 线性调频Z变换
(输⼊输出点数较少时的FFT)

DFT:输⼊N点,输出N点, 输⼊、输出点数
相同。输出的N点均匀分布于单位圆上,频域
分辨率为
52
在实际应⽤中:
1. 当输⼊点数极少时,若希望频率分点较多,
则需要补零,结果是增加了计算量;
2. 对于窄带信号,我们只希望通带内分点密,
带外可以较疏,或根本不⽤计算。

1.Pruning(简化FFT)
2. CZT
53
⼀、Pruning(剪枝)
(⼀)输⼊端
Pruning
( DIF )







54

(⼆)输出端
Pruning
(窄带情况)







55
⼆、CZT(Chirp-Z变换)线性调频Z变换

Z变换: 其中:

Z在其 ROC 内取值,现为Z指定⼀离散路径:

56
信号点数 N 和变换路径点数 M
可以不相等!
57

做DFT时,Z变换在 CZT时,离散路径
单位圆上的等分的 N 可在单位圆内、外,
个点上取值 或圆上
58
CZT在Z平⾯上的变换
路径是⼀条螺旋线:

决定CZT的起点;

1 决定变换路径如
何倾斜;

决定变换的步⻓

59
时,起点在单位圆外,
反之在圆内
o
时内旋,反之外旋;

时 CZT变换
路径 为单位圆上⼀段弧,

CZT变成了DFT
60
CZT的特点
 CZT可计算单位圆上(希望得到的是信号
的频谱分析,故常在单位圆上实现CZT,
即取A0=W0=1 )任⼀段曲线上的 Z 变换,
可任意给定起⽌频率;

 作变换时输⼊的点数N和输出点数M可以不
相等;

 可达到频域“细化”的⽬的。
61
CZT的计算:
由定义:

由于:

所以

令 ⼆次相位复指数序列
或 Chirp信号
或 线性调频信号
62
则:
0

式中: 0

63
64
CZT 的实际计算⽅法:

1. 是 点系列,由 所决定:

2. 是双边⽆穷⻓序列,由定义所决定:

65
3. 是 点序列,由需要所决定。y : M点
希望⽤DFT实现

截短
延拓
⽆限⻓序列与N点序列卷积,

结果只取 M点
——不参与计算的点直接抛弃!
66
67
h(m) N+M-1点

h’(m) L点

h’(-m)

h’(M-1-m) 移M-1位

h’(M-m) 移M位

g(m) N点
(M ≤ n ≤ L-1时, h(n)和g(n)的循环卷积
不代表
不代表线性卷积) 68
点序列

(取前M个点)

69
与本章有关的 MATLAB ⽂件主要是 fft, ifft 和
czt.m。fft实现快速傅⽴叶变换,ifft实现快速
傅⽴叶反变换,czt.m实现线性调频Z变换
1. fft的调⽤格式是:X=fft(x), 或 X=fft(x,N)
2. czt.m 调⽤格式是: X=czt(x, M, W, A) 。x
是待变换的时域信号,其⻓度设为N,M是变
换的⻓度,W 确定变换的步⻓,A 确定变换
的起点。若M=N, A=1, 则CZT变成DFT
70
例 设模拟信号 ,以 t =
0.01n (n=0: N-1) 进⾏取样,试⽤fft函数对其做频
谱分析。N分别为:
(1) N=45;(2) N=50;(3) N=55;(2) N=60。

程序清单如下 %计算N=45的FFT并绘出其幅频曲线
N=45;n=0:N-1;t=0.01*n;
q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
y=fft(x,N);
figure(1)
subplot(2,2,1)
plot(q,abs(y))
title('FFT N=45')
71
%计算N=50的FFT并绘出其幅频曲线
N=50;n=0:N-1;t=0.01*n;
q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
y=fft(x,N);
figure(1)
subplot(2,2,2)
plot(q,abs(y))
title('FFT N=50')
72
%计算N=55的FFT并绘出其幅频曲线
N=55;n=0:N-1;t=0.01*n;
q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
y=fft(x,N);
figure(1)
subplot(2,2,3)
plot(q,abs(y))
title('FFT N=55')
73
%计算N=60的FFT并绘出其幅频曲线
N=60;n=0:N-1;t=0.01*n;
q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
y=fft(x,N);
figure(1)
subplot(2,2,4)
plot(q,abs(y))
title('FFT N=60')

74
程序运⾏结果

从图中可以看出,这⼏种情况下均有较好的精度。
75
程序运⾏结果分析

分析:由t=0.01n进⾏取样可得,采样频率fs=100Hz。⽽
连续信号的最⾼模拟⻆频率为Ω=8 π ,由Ω=2 πf可得,
最⾼频率为8 π /2 π=4Hz。因此,满⾜采样定理的要求。
采样序列为

为周期序列,周期N=50。
将程序中plot改为stem函数,则可以更清楚地看出频谱。
76
修改程序运⾏结果

77

You might also like