Chirp-Z变换(Chirp-Z Transform,CZT)
采用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
算法流程图如下:
实现步骤
- 选择一个最小整数 L L L,使其满足 L ≥ N + M − 1 L\ge N+M-1 L≥N+M−1,同时 L = 2 m L=2^m L=2m;
- 求
h
(
n
)
h(n)
h(n)的主值序列
h
^
(
n
)
\hat h(n)
h^(n),并计算DFT;
h ^ ( n ) = { W − n 2 2 0 ≤ n ≤ M − 1 任意值 N ≤ n ≤ L − 1 W − ( n − L ) 2 2 L − N + 1 ≤ n ≤ L − 1 \hat h(n)=\left\{\begin{array}{ll} W^{-\frac{n^2}{2}} & 0\le n \le M-1 \\ \text{任意值} & N \le n \le L-1 \\ W^{-\frac{(n-L)^2}{2}} & L-N+1\le n \le L-1 \end{array}\right. h^(n)=⎩ ⎨ ⎧W−2n2任意值W−2(n−L)20≤n≤M−1N≤n≤L−1L−N+1≤n≤L−1
H ( k ) = D F T [ h ^ ( n ) ] , L 点 H(k)=DFT[\hat h(n)],\ \ L点 H(k)=DFT[h^(n)], L点 - 对
x
(
n
)
x(n)
x(n)加权、补零,并计算DFT;
g ( n ) = { x ( n ) A − n W n 2 2 0 ≤ n ≤ N − 1 0 N ≤ n ≤ L − 1 g(n)=\left\{\begin{array}{ll} x(n)A^{-n}W^{\frac{n^2}{2}} & 0\le n \le N-1 \\ 0 & N \le n \le L-1 \end{array}\right. g(n)={x(n)A−nW2n200≤n≤N−1N≤n≤L−1
G ( k ) = D F T [ g ( n ) ] , L 点 G(k)=DFT[g(n)],\ \ L点 G(k)=DFT[g(n)], L点 - Y ( k ) = G ( k ) H ( k ) , L 点 Y(k)=G(k)H(k),\ \ L点 Y(k)=G(k)H(k), L点;
- y ( n ) = I D F T [ Y ( k ) ] , L 点 y(n)=IDFT[Y(k)],\ \ L点 y(n)=IDFT[Y(k)], L点;
- X ( z k ) = W k 2 2 y ( k ) , 0 ≤ k ≤ M − 1 X(z_k)=W^{\frac{k^2}{2}}y(k),\ \ 0 \le k \le M-1 X(zk)=W2k2y(k), 0≤k≤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');