CZT变换
采用FFT算法可以很快算出全部N点DFT值,即Z变换
X
(
z
)
X\left( z \right)
X(z)在Z平面单位圆上的全部等间隔取样值。实际中,也许不需要计算整个单位圆上Z变换的取样,如对于窄带信号,只需要对信号所在的一段频带进行分析,这时希望频谱的采样集中在这一频带内,以获得较高的分辨率,而频带以外的部分可不考虑,或者对其他围线上的Z变换取样感兴趣,例如语音信号处理中,需要知道Z变换的极点所在频率,如极点位置离单位圆较远,则其单位圆上的频谱就很平滑,这时很难从中识别出极点所在的频率,如果采样不是沿单位圆而是沿一条接近这些极点的弧线进行,则在极点所在频率上的频谱将出现明显的尖峰,由此可较准确地测定极点频率。螺旋线采样是一种适合于这种需要的变换,且可以采用FFT来快速计算,这种变换也称作Chirp-z变换。
已知
x
(
n
)
x\left( n \right)
x(n),
0
≤
n
≤
N
−
1
0\le n\le N-1
0≤n≤N−1,是有限长序列,它的Z变换为:
X
(
z
)
=
∑
n
=
0
N
−
1
x
(
n
)
z
−
n
X\left( z \right)=\sum\limits_{n=0}^{N-1}{x\left( n \right){{z}^{-n}}}
X(z)=n=0∑N−1x(n)z−n
为适应
z
z
z可以沿
Z
Z
Z平面更一般的路径取值,故沿Z平面上的一段螺线作等分角的抽样,
z
z
z的这些抽样点
z
k
{{z}_{k}}
zk为:
z
k
=
A
W
−
k
,
k
=
0
,
.
.
.
,
M
−
1
{{z}_{k}}=A{{W}^{-k}},k=0,...,M-1
zk=AW−k,k=0,...,M−1
M为所要分析的复频谱的点数,即采样点的总数,不一定等于
N
N
N。
A
A
A和
W
W
W都是任意复数,可表示为:
{
A
=
A
0
e
j
θ
0
W
=
W
0
e
−
j
ϕ
0
\left\{ \begin{matrix} A={{A}_{0}}{{e}^{j{{\theta }_{0}}}} \\ W={{W}_{0}}{{e}^{-j{{\phi }_{0}}}} \\ \end{matrix} \right.
{A=A0ejθ0W=W0e−jϕ0
z
k
=
A
0
e
j
θ
0
W
0
−
k
e
j
k
ϕ
0
=
A
0
W
0
−
k
e
j
(
θ
0
+
k
ϕ
0
)
{{z}_{k}}={{A}_{0}}{{e}^{j{{\theta }_{0}}}}W_{0}^{-k}{{e}^{jk{{\phi }_{0}}}}={{A}_{0}}W_{0}^{-k}{{e}^{j\left( {{\theta }_{0}}+k{{\phi }_{0}} \right)}}
zk=A0ejθ0W0−kejkϕ0=A0W0−kej(θ0+kϕ0)
因此有
z
0
=
A
0
e
j
θ
0
{{z}_{0}}={{A}_{0}}{{e}^{j{{\theta }_{0}}}}
z0=A0ejθ0
z
1
=
A
0
W
0
−
1
e
j
(
θ
0
+
ϕ
0
)
{{z}_{1}}={{A}_{0}}W_{0}^{-1}{{e}^{j\left( {{\theta }_{0}}+{{\phi }_{0}} \right)}}
z1=A0W0−1ej(θ0+ϕ0)
z
k
=
A
0
W
0
−
k
e
j
(
θ
0
+
k
ϕ
0
)
{{z}_{k}}={{A}_{0}}W_{0}^{-k}{{e}^{j\left( {{\theta }_{0}}+k{{\phi }_{0}} \right)}}
zk=A0W0−kej(θ0+kϕ0)
z
M
−
1
=
A
0
W
0
−
(
M
−
1
)
e
j
[
θ
0
+
(
M
−
1
)
ϕ
0
]
{{z}_{M-1}}={{A}_{0}}W_{0}^{-\left( M-1 \right)}{{e}^{j\left[ {{\theta }_{0}}+\left( M-1 \right){{\phi }_{0}} \right]}}
zM−1=A0W0−(M−1)ej[θ0+(M−1)ϕ0]
(1)
A
0
{{A}_{0}}
A0表示起始采样点
z
0
{{z}_{0}}
z0的矢量半径长度,通常
A
0
≤
1
{{A}_{0}}\le 1
A0≤1;否则
z
0
{{z}_{0}}
z0将处于单位圆
∣
z
∣
=
1
\left| z \right|=1
∣z∣=1的外部。
(2)
θ
0
{{\theta }_{0}}
θ0表示起始采样点
z
0
{{z}_{0}}
z0的相角,它可以是正值或负值。
(3)
ϕ
0
{{\phi }_{0}}
ϕ0表示两相邻采样点之间的角度差。
ϕ
0
{{\phi }_{0}}
ϕ0为正时,表示
z
k
z{}_{k}
zk的路径沿逆时针旋转;
ϕ
0
{{\phi }_{0}}
ϕ0为负时,表示
z
k
{{z}_{k}}
zk的路径沿顺时针旋转。
(4)
W
0
{{W}_{0}}
W0的大小表示螺旋线的伸展率,
W
0
<
1
{{W}_{0}}<1
W0<1时,则随[k]的增加螺线外伸;
W
0
>
1
{{W}_{0}}>1
W0>1时,则随
k
k
k的增加螺线内缩(反时针);
W
0
=
1
{{W}_{0}}=1
W0=1时,表示是半径为
A
0
{{A}_{0}}
A0的一段圆弧。若又有
A
0
=
1
{{A}_{0}}=1
A0=1,则这段圆弧则是单位圆的一部分。
当
M
=
N
M=N
M=N,
A
=
A
0
e
j
θ
0
=
1
A={{A}_{0}}{{e}^{j{{\theta }_{0}}}}=1
A=A0ejθ0=1时,满足:
W
=
W
0
⋅
e
−
j
ϕ
0
=
−
j
2
π
N
(
W
0
=
1
,
ϕ
0
=
2
π
/
N
)
W={{W}_{0}}\centerdot {{e}^{-j{{\phi }_{0}}}}=-j\frac{2\pi }{N}\left( {{W}_{0}}=1,{{\phi }_{0}}=2\pi /N \right)
W=W0⋅e−jϕ0=−jN2π(W0=1,ϕ0=2π/N)这一特殊情况时,各
z
k
{{z}_{k}}
zk就均匀等间隔地分布在单位圆上,这就是求序列的DFT。
X
(
z
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
z
k
−
n
=
∑
n
=
0
N
−
1
x
(
n
)
A
−
n
W
n
k
0
≤
k
≤
M
−
1
\begin{aligned} & X\left( {{z}_{k}} \right)=\sum\limits_{n=0}^{N-1}{x\left( n \right)z_{k}^{-n}} \\ & \begin{matrix} {} & \begin{matrix} {} & =\sum\limits_{n=0}^{N-1}{x\left( n \right)} \\ \end{matrix} \\ \end{matrix}{{A}^{-n}}{{W}^{nk}}\begin{matrix} {} & 0\le k\le M-1 \\ \end{matrix} \\ \end{aligned}
X(zk)=n=0∑N−1x(n)zk−n=n=0∑N−1x(n)A−nWnk0≤k≤M−1
n
k
nk
nk用表达式来替换:
n
k
=
1
2
[
n
2
+
k
2
−
(
k
−
n
)
2
]
,
n
=
0
,
1
,
.
.
.
,
N
−
1
,
k
=
0
,
1
,
.
.
.
,
M
−
1
nk=\frac{1}{2}\left[ {{n}^{2}}+{{k}^{2}}-{{\left( k-n \right)}^{2}} \right],n=0,1,...,N-1,k=0,1,...,M-1
nk=21[n2+k2−(k−n)2],n=0,1,...,N−1,k=0,1,...,M−1
可得:
X
(
z
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
A
−
n
W
n
2
2
W
−
(
k
−
n
)
2
2
W
k
2
2
=
W
k
2
2
∑
n
=
0
N
−
1
[
x
(
n
)
A
−
n
W
n
2
2
]
W
−
(
k
−
n
)
2
2
X\left( {{z}_{k}} \right)=\sum\limits_{n=0}^{N-1}{x\left( n \right)}{{A}^{-n}}{{W}^{\frac{{{n}^{2}}}{2}}}{{W}^{-\frac{{{\left( k-n \right)}^{2}}}{2}}}{{W}^{\frac{{{k}^{2}}}{2}}}={{W}^{\frac{{{k}^{2}}}{2}}}\sum\limits_{n=0}^{N-1}{\left[ x\left( n \right){{A}^{-n}}{{W}^{\frac{{{n}^{2}}}{2}}} \right]}{{W}^{-\frac{{{\left( k-n \right)}^{2}}}{2}}}
X(zk)=n=0∑N−1x(n)A−nW2n2W−2(k−n)2W2k2=W2k2n=0∑N−1[x(n)A−nW2n2]W−2(k−n)2
定义:
g
(
n
)
=
x
(
n
)
A
−
n
W
n
2
2
,
h
(
n
)
=
W
−
n
2
2
,
0
≤
g
(
n
)
≤
N
−
1
,
−
(
N
−
1
)
≤
h
(
n
)
≤
M
−
1
g\left( n \right)=x\left( n \right){{A}^{-n}}{{W}^{\frac{{{n}^{2}}}{2}}},h\left( n \right)={{W}^{-\frac{{{n}^{2}}}{2}}},0\le g\left( n \right)\le N-1,-\left( N-1 \right)\le h\left( n \right)\le M-1
g(n)=x(n)A−nW2n2,h(n)=W−2n2,0≤g(n)≤N−1,−(N−1)≤h(n)≤M−1
则:
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
g\left( k \right)*h\left( k \right)=\sum\limits_{n=0}^{N-1}{g\left( n \right)}h\left( k-n \right)=\sum\limits_{n=0}^{N-1}{\left[ x\left( n \right){{A}^{-n}}{{W}^{\frac{{{n}^{2}}}{2}}} \right]}{{W}^{-\frac{{{\left( k-n \right)}^{2}}}{2}}}
g(k)∗h(k)=n=0∑N−1g(n)h(k−n)=n=0∑N−1[x(n)A−nW2n2]W−2(k−n)2
X
(
z
k
)
=
W
k
2
w
⋅
[
g
(
k
)
∗
h
(
k
)
]
X\left( {{z}_{k}} \right)={{W}^{\frac{{{k}^{2}}}{w}}}\centerdot \left[ g\left( k \right)*h\left( k \right) \right]
X(zk)=Wwk2⋅[g(k)∗h(k)]
先进行一次加权
A
−
n
W
n
2
/
2
{{A}^{-n}}{{W}^{{{n}^{2}}/2}}
A−nWn2/2处理,然后通过一个单位脉冲响应为
h
(
n
)
=
W
−
n
2
/
2
h\left( n \right)={{W}^{-{{n}^{2}}/2}}
h(n)=W−n2/2的线性系统即求
g
(
n
)
g\left( n \right)
g(n)与
h
(
n
)
h\left( n \right)
h(n)的线性卷积;最后,对该系统的前M点输出再做一次加权,这样就得到了全部
M
M
M点螺线采样值
X
(
z
n
)
(
n
=
0
,
1
,
.
.
.
,
M
−
1
)
X\left( {{z}_{n}} \right)\left( n=0,1,...,M-1 \right)
X(zn)(n=0,1,...,M−1)。
由于系统的单位脉冲响应
h
(
n
)
=
W
−
n
2
/
2
h\left( n \right)={{W}^{-{{n}^{2}}/2}}
h(n)=W−n2/2可以想象为频率随时间[n]呈线性增长的复指数序列。在雷达系统中,这种信号称为线性调频信号,因此这里的变换称为线性调频Z变换。
具体过程
(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,以便采用基-2FFT算法。
(2) 将
g
(
n
)
=
x
(
n
)
A
−
n
W
n
2
/
2
g\left( n \right)=x\left( n \right){{A}^{-n}}{{W}^{{{n}^{2}}/2}}
g(n)=x(n)A−nWn2/2补上零值点,变为
L
L
L点序列,因而有
g
(
n
)
=
{
A
−
n
W
n
2
2
x
(
n
)
0
≤
n
≤
N
−
1
0
0
≤
n
≤
L
−
1
g\left( n \right)=\left\{ \begin{matrix} {{A}^{-n}}{{W}^{\frac{{{n}^{2}}}{2}}}x\left( n \right) & 0\le n\le N-1 \\ 0 & 0\le n\le L-1 \\ \end{matrix} \right.
g(n)={A−nW2n2x(n)00≤n≤N−10≤n≤L−1
(3) 并利用FFT法求此序列的
L
L
L点DFT:
G
(
r
)
=
∑
n
=
0
N
−
1
g
(
n
)
e
−
j
2
π
L
r
n
0
≤
r
≤
L
−
1
\begin{matrix} G\left( r \right)=\sum\limits_{n=0}^{N-1}{g\left( n \right)}{{e}^{-j\frac{2\pi }{L}rn}} & 0\le r\le L-1 \\ \end{matrix}
G(r)=n=0∑N−1g(n)e−jL2πrn0≤r≤L−1
(4) 形成
L
L
L点序列
h
(
n
)
h\left( n \right)
h(n),在
n
=
0
n=0
n=0到
M
−
1
M-1
M−1一段
W
−
n
2
2
{{W}^{-\frac{{{n}^{2}}}{2}}}
W−2n2,
n
=
M
n=M
n=M到
L
−
N
L-N
L−N段取
h
(
n
)
h\left( n \right)
h(n)为任意值(一般为零),在
L
=
N
+
M
−
1
L=N+M-1
L=N+M−1到
L
−
1
L-1
L−1段取
h
(
n
)
h\left( n \right)
h(n)为
W
−
n
2
2
{{W}^{-\frac{{{n}^{2}}}{2}}}
W−2n2的周期延拓序列
W
−
(
L
−
n
)
2
2
{{W}^{-\frac{{{\left( L-n \right)}^{2}}}{2}}}
W−2(L−n)2,即有
h
(
n
)
=
{
W
−
n
2
2
0
≤
n
≤
M
−
1
0
W
−
(
L
−
n
)
2
2
M
≤
n
≤
L
−
N
L
−
N
+
1
≤
n
≤
L
−
1
h\left( n \right)=\left\{ \begin{matrix} {{W}^{-\frac{{{n}^{2}}}{2}}} & 0\le n\le M-1 \\ \begin{matrix} 0 \\ {{W}^{-\frac{{{\left( L-n \right)}^{2}}}{2}}} \\ \end{matrix} & \begin{matrix} M\le n\le L-N \\ L-N+1\le n\le L-1 \\ \end{matrix} \\ \end{matrix} \right.
h(n)=⎩
⎨
⎧W−2n20W−2(L−n)20≤n≤M−1M≤n≤L−NL−N+1≤n≤L−1
此
h
(
n
)
h\left( n \right)
h(n)实际上是序列
W
−
m
2
/
2
{{W}^{-{{m}^{2}}/2}}
W−m2/2以
L
L
L为周期的周期延拓序列的主值序列
用FFT法求
h
(
n
)
h\left( n \right)
h(n)的
L
L
L点DFT:
H
(
r
)
=
∑
n
=
0
L
−
1
h
(
n
)
e
−
j
2
π
L
r
n
0
≤
r
≤
L
−
1
\begin{matrix} H\left( r \right)=\sum\limits_{n=0}^{L-1}{h\left( n \right)}{{e}^{-j\frac{2\pi }{L}rn}} & 0\le r\le L-1 \\ \end{matrix}
H(r)=n=0∑L−1h(n)e−jL2πrn0≤r≤L−1
(5) 将
H
(
r
)
H\left( r \right)
H(r)和
G
(
r
)
G\left( r \right)
G(r)相乘,得
Q
(
r
)
=
H
(
r
)
G
(
r
)
Q\left( r \right)=H\left( r \right)G\left( r \right)
Q(r)=H(r)G(r),
Q
(
r
)
Q\left( r \right)
Q(r)为
L
L
L点频域离散序列
(6) 用FFT法求
Q
(
r
)
Q\left( r \right)
Q(r)的
L
L
L点IDFT,得
h
(
n
)
h\left( n \right)
h(n)和
g
(
n
)
g\left( n \right)
g(n)的圆周卷积:
h
(
n
)
g
(
n
)
=
q
(
n
)
=
1
L
∑
r
=
0
L
−
1
H
(
r
)
G
(
r
)
e
j
2
π
L
r
n
h\left( n \right)g\left( n \right)=q\left( n \right)=\frac{1}{L}\sum\limits_{r=0}^{L-1}{H\left( r \right)}G\left( r \right){{e}^{j\frac{2\pi }{L}rn}}
h(n)g(n)=q(n)=L1r=0∑L−1H(r)G(r)ejL2πrn
式中,前
M
M
M个值等于
h
(
n
)
h\left( n \right)
h(n)和
g
(
n
)
g\left( n \right)
g(n)的线性卷积结果
[
h
(
n
)
∗
g
(
n
)
]
\left[ h\left( n \right)*g\left( n \right) \right]
[h(n)∗g(n)],
n
≥
M
n\ge M
n≥M的值没有意义,不需要求。
(7) 最后求
X
(
z
k
)
X\left( {{z}_{k}} \right)
X(zk):
X
(
z
k
)
=
W
k
2
2
q
(
k
)
0
≤
k
≤
M
−
1
\begin{matrix} X\left( {{z}_{k}} \right)={{W}^{\frac{{{k}^{2}}}{2}}}q\left( k \right) & 0\le k\le M-1 \\ \end{matrix}
X(zk)=W2k2q(k)0≤k≤M−1
关于该算法的实现,MATLAB有自带的CZT函数,具体用法为
y = czt(x,m,w,a),其中x为输入信号,m为变换的长度,默认值为信号长度,w为螺旋轮廓点之间的比值,a为螺旋轮廓起点
该函数返回由x 沿由 w 和 a 定义的 z 平面上的螺旋轮廓的长度,其中z = a*w.^-(0:m-1),使用默认值 m、w 和 a,czt 返回 x 在单位圆周围 m 个等距点处的 Z 变换,结果等效于由 fft(x) 给出的 x 的离散傅立叶变换 (DFT) .
下面给出一个简单的仿真实验,对比直接FFT与CZT之间的效果,细化频率75Hz~175Hz。
从图中可以看出,FFT的频率之间是由明显的间隔,在75Hz~175Hz之间,CZT的频率更加细化
显示100Hz~115Hz之间的结果可以看出,经过CZT之后有更高的频率分辨率,这也与上述的分析一致。
代码如下:
clear;
close all;
clc;
fs = 1000; %采样频率
d = designfilt('lowpassfir','FilterOrder',30,'CutoffFrequency',125, ...
'DesignMethod','window','Window',@rectwin,'SampleRate',fs);
h = tf(d); %系统传递函数
m = 1024; %变换点数
y = fft(h,m); % 直接FFT结果
f1 = 75; %细化起始频率
f2 = 175; %细化结束频率
w = exp(-1j*2*pi*(f2-f1)/(m*fs)); %螺旋轮廓点之间的比值
a = exp(1j*2*pi*f1/fs); %螺旋轮廓起点
z = czt(h,m,w,a); %CZT变换
fn = (0:m-1)'/m;
fy = fs*fn; %频率
fz = (f2-f1)*fn + f1;
figure(1);
plot(fy,abs(y),'r-*',fz,abs(z),'b')
xlim([50 200])
legend('FFT','CZT')
xlabel('Frequency (Hz)')
grid on;
figure(2);
plot(fy,abs(y),'r-*',fz,abs(z),'b')
xlim([100 115])
legend('FFT','CZT')
xlabel('Frequency (Hz)')
grid on;
figure(3);
plot(fy,abs(y),'r-*',fz,abs(z),'b-p')
xlim([100 115])
legend('FFT','CZT')
xlabel('Frequency (Hz)')
grid on;
参考文献
[1]王旭刚. 基于FMCW体制K波段测距雷达的研究与实现[D].南京航空航天大学,2012.
[2]Matlab CZT函数介绍