赞
踩
采用FFT算法可以很快地计算出全部DFT值,即Z变换在单位圆上的全部等间隔采样值。
在实际情况中,并不需要对整个单位圆的频谱进行分析,例如,对于窄带信号,往往只需要对信号所在的一段频带进行分析,即可在所关心的这段频带内进行密集的采样,而对这个频带以外的部分可以完全不管。
Z变换的螺旋采样,它沿Z平面上的一段螺线进行等分角的采样,这些采样点可以表示为
z
k
=
A
W
−
k
,
k
=
0
,
1
,
⋯
,
M
−
1
z_k=AW^{-k},\ \ k=0,1,\cdots,M-1
zk=AW−k, k=0,1,⋯,M−1
其中,
M
M
M为采样点的总数,
A
A
A为起始点位置,可以用半径
A
0
A_0
A0及相角
θ
0
\theta_0
θ0表示为
A
=
A
0
e
j
θ
0
A=A_0 e^{j\theta_0}
A=A0ejθ0;
参数
W
W
W表示为
W
=
W
0
e
−
j
ϕ
0
W=W_0e^{-j\phi_0}
W=W0e−jϕ0,
W
0
W_0
W0为螺线的伸展率,
W
0
>
1
W_0>1
W0>1,螺线内缩,
W
0
<
1
W_0<1
W0<1,螺线外伸;
ϕ
0
\phi_0
ϕ0为螺线上采样点之间的等分角。
当
M
=
N
M=N
M=N、
A
=
1
A=1
A=1、
W
=
e
−
j
2
π
N
W=e^{-j\frac{2\pi}{N}}
W=e−jN2π时,
z
k
z_k
zk就等间隔地分布在单位圆上,这时CZT退化DFT。
假设
x
(
n
)
x(n)
x(n)是长度为
N
N
N的有限长序列,则其Z变换在采样点
z
k
z_k
zk上的值
X
(
z
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
z
k
−
n
,
k
=
0
,
1
,
1
,
⋯
,
M
−
1
X(z_k)=\sum_{n=0}^{N-1}x(n)z_k^{-n}, \ \ k=0,1,1,\cdots,M-1
X(zk)=n=0∑N−1x(n)zk−n, k=0,1,1,⋯,M−1
为减少计算量,将上式运算转换为卷积形式,从而采用FFT进行计算。
将
z
k
=
A
W
−
k
z_k=AW^{-k}
zk=AW−k代入
X
(
z
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
z
k
−
n
X(z_k)=\sum_{n=0}^{N-1}x(n)z_k^{-n}
X(zk)=∑n=0N−1x(n)zk−n可得
X
(
z
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
A
−
n
W
n
k
X(z_k)=\sum_{n=0}^{N-1}x(n)A^{-n}W^{nk}
X(zk)=n=0∑N−1x(n)A−nWnk
将
n
k
nk
nk替换为
1
2
[
k
2
+
n
2
−
(
k
−
n
)
2
]
\frac{1}{2}[k^2+n^2-(k-n)^2]
21[k2+n2−(k−n)2],则
X
(
z
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
A
−
n
W
1
2
[
k
2
+
n
2
−
(
k
−
n
)
2
]
=
W
k
2
2
∑
n
=
0
N
−
1
x
(
n
)
A
−
n
W
n
2
2
W
−
(
k
−
n
)
2
2
X(z_k)=\sum_{n=0}^{N-1}x(n)A^{-n}W^{\frac{1}{2}[k^2+n^2-(k-n)^2]}=W^\frac{k^2}{2}\sum_{n=0}^{N-1}x(n)A^{-n}W^{\frac{n^2}{2}}W^{-\frac{(k-n)^2}{2}}
X(zk)=n=0∑N−1x(n)A−nW21[k2+n2−(k−n)2]=W2k2n=0∑N−1x(n)A−nW2n2W−2(k−n)2
定义
g
(
n
)
=
x
(
n
)
A
−
n
W
n
2
2
,
n
=
0
,
1
,
2
,
⋯
,
N
−
1
g(n)=x(n)A^{-n}W^{\frac{n^2}{2}},\ \ n=0,1,2,\cdots,N-1
g(n)=x(n)A−nW2n2, n=0,1,2,⋯,N−1和
h
(
n
)
=
W
−
n
2
2
h(n)=W^{- \frac{n^2}{2}}
h(n)=W−2n2,则有
g
(
k
)
∗
h
(
k
)
=
∑
n
=
0
N
−
1
g
(
n
)
h
(
k
−
n
)
=
∑
n
=
0
N
−
1
x
(
n
)
A
−
n
W
n
2
2
W
−
(
k
−
n
)
2
2
,
k
=
0
,
1
,
⋯
,
M
−
1
g(k)\ast h(k)=\sum_{n=0}^{N-1}g(n)h(k-n)=\sum_{n=0}^{N-1}x(n)A^{-n}W^{\frac{n^2}{2}}W^{-\frac{(k-n)^2}{2}},\ \ k=0,1,\cdots,M-1
g(k)∗h(k)=n=0∑N−1g(n)h(k−n)=n=0∑N−1x(n)A−nW2n2W−2(k−n)2, k=0,1,⋯,M−1
则有
X
(
z
k
)
=
[
g
(
k
)
∗
h
(
k
)
]
W
k
2
2
,
k
=
0
,
1
,
⋯
,
M
−
1
X(z_k)=[g(k)\ast h(k)]W^\frac{k^2}{2},\ \ k=0,1,\cdots,M-1
X(zk)=[g(k)∗h(k)]W2k2, k=0,1,⋯,M−1
算法流程图如下:
上述步骤实现程序可见Matlab的czt函数内部程序。
此处使用函数czt实现Chirp-Z变换,并将结果与DFT和采样序列插0后序列的DFT进行对比。
clc;clear;close all; N = 8192; f1 = 100; f2 = 101; fs = 8000; Ts = 1/fs; ts = (1:N)*Ts; x = cos(2*pi*f1*ts) + cos(2*pi*f2*ts) + 0.5*randn(1,N); y_DFT = abs(fft(x)); %%DFT w = exp(-1i*2*pi*(150-50)/(N*fs)); a = exp(1i*2*pi*50/fs); y_CZT = abs(czt(x,N,w,a));%%CZT fn = (0:N-1)/N; fy = fs*fn; fz = (150-50)*fn + 50; fyy = fs*(0:2*N-1)/(2*N); xx = [x zeros(1,N)]; yy_DFT = abs(fft(xx)); %%插0 DFT plot(yy_DFT); plot(fy,20*log10(y_DFT), fz,20*log10(y_CZT), fyy,20*log10(yy_DFT)); xlim([80 120]); legend('DFT','CZT','插0 DFT');
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。