Professional Documents
Culture Documents
DSP4 快速傅里叶变换
DSP4 快速傅里叶变换
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)
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不需要乘法运算:
每分⼀次
称⼀“级”
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
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
★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变换: 其中:
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