我是靠谱客的博主 眼睛大歌曲,这篇文章主要介绍频谱细化-----CZT算法介绍及MATLAB实现,现在分享给大家,希望可以做个参考。

CZT变换

采用FFT算法可以很快算出全部N点DFT值,即Z变换 X ( z ) Xleft( z right) X(z)在Z平面单位圆上的全部等间隔取样值。实际中,也许不需要计算整个单位圆上Z变换的取样,如对于窄带信号,只需要对信号所在的一段频带进行分析,这时希望频谱的采样集中在这一频带内,以获得较高的分辨率,而频带以外的部分可不考虑,或者对其他围线上的Z变换取样感兴趣,例如语音信号处理中,需要知道Z变换的极点所在频率,如极点位置离单位圆较远,则其单位圆上的频谱就很平滑,这时很难从中识别出极点所在的频率,如果采样不是沿单位圆而是沿一条接近这些极点的弧线进行,则在极点所在频率上的频谱将出现明显的尖峰,由此可较准确地测定极点频率。螺旋线采样是一种适合于这种需要的变换,且可以采用FFT来快速计算,这种变换也称作Chirp-z变换。
已知 x ( n ) xleft( n right) x(n), 0 ≤ n ≤ N − 1 0le nle N-1 0≤n≤N−1,是有限长序列,它的Z变换为:
X ( z ) = ∑ n = 0 N − 1 x ( n ) z − n Xleft( z right)=sumlimits_{n=0}^{N-1}{xleft( n right){{z}^{-n}}} X(z)=n=0∑N−1​x(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=A0​ejθ0​W=W0​e−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}^{jleft( {{theta }_{0}}+k{{phi }_{0}} right)}} zk​=A0​ejθ0​W0−k​ejkϕ0​=A0​W0−k​ej(θ0​+kϕ0​)
因此有
z 0 = A 0 e j θ 0 {{z}_{0}}={{A}_{0}}{{e}^{j{{theta }_{0}}}} z0​=A0​ejθ0​
z 1 = A 0 W 0 − 1 e j ( θ 0 + ϕ 0 ) {{z}_{1}}={{A}_{0}}W_{0}^{-1}{{e}^{jleft( {{theta }_{0}}+{{phi }_{0}} right)}} z1​=A0​W0−1​ej(θ0​+ϕ0​)
z k = A 0 W 0 − k e j ( θ 0 + k ϕ 0 ) {{z}_{k}}={{A}_{0}}W_{0}^{-k}{{e}^{jleft( {{theta }_{0}}+k{{phi }_{0}} right)}} zk​=A0​W0−k​ej(θ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}^{jleft[ {{theta }_{0}}+left( M-1 right){{phi }_{0}} right]}} zM−1​=A0​W0−(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=A0​ejθ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}}}}=-jfrac{2pi }{N}left( {{W}_{0}}=1,{{phi }_{0}}=2pi /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} & Xleft( {{z}_{k}} right)=sumlimits_{n=0}^{N-1}{xleft( n right)z_{k}^{-n}} \ & begin{matrix} {} & begin{matrix} {} & =sumlimits_{n=0}^{N-1}{xleft( n right)} \ end{matrix} \ end{matrix}{{A}^{-n}}{{W}^{nk}}begin{matrix} {} & 0le kle M-1 \ end{matrix} \ end{aligned} ​X(zk​)=n=0∑N−1​x(n)zk−n​​​=n=0∑N−1​x(n)​​A−nWnk​0≤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 Xleft( {{z}_{k}} right)=sumlimits_{n=0}^{N-1}{xleft( 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}}}sumlimits_{n=0}^{N-1}{left[ xleft( n right){{A}^{-n}}{{W}^{frac{{{n}^{2}}}{2}}} right]}{{W}^{-frac{{{left( k-n right)}^{2}}}{2}}} X(zk​)=n=0∑N−1​x(n)A−nW2n2​W−2(k−n)2​W2k2​=W2k2​n=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 gleft( n right)=xleft( n right){{A}^{-n}}{{W}^{frac{{{n}^{2}}}{2}}},hleft( n right)={{W}^{-frac{{{n}^{2}}}{2}}},0le gleft( n right)le N-1,-left( N-1 right)le hleft( 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 gleft( k right)*hleft( k right)=sumlimits_{n=0}^{N-1}{gleft( n right)}hleft( k-n right)=sumlimits_{n=0}^{N-1}{left[ xleft( 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−1​g(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 ) ] Xleft( {{z}_{k}} right)={{W}^{frac{{{k}^{2}}}{w}}}centerdot left[ gleft( k right)*hleft( 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 hleft( n right)={{W}^{-{{n}^{2}}/2}} h(n)=W−n2/2的线性系统即求 g ( n ) gleft( n right) g(n)与 h ( n ) hleft( n right) h(n)的线性卷积;最后,对该系统的前M点输出再做一次加权,这样就得到了全部 M M M点螺线采样值 X ( z n ) ( n = 0 , 1 , . . . , M − 1 ) Xleft( {{z}_{n}} right)left( n=0,1,...,M-1 right) X(zn​)(n=0,1,...,M−1)。
由于系统的单位脉冲响应 h ( n ) = W − n 2 / 2 hleft( n right)={{W}^{-{{n}^{2}}/2}} h(n)=W−n2/2可以想象为频率随时间[n]呈线性增长的复指数序列。在雷达系统中,这种信号称为线性调频信号,因此这里的变换称为线性调频Z变换。

具体过程

(1) 选择一个最小的整数 L L L,使其满足 L ≥ N + M − 1 Lge 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 gleft( n right)=xleft( 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 gleft( n right)=left{ begin{matrix} {{A}^{-n}}{{W}^{frac{{{n}^{2}}}{2}}}xleft( n right) & 0le nle N-1 \ 0 & 0le nle L-1 \ end{matrix} right. g(n)={A−nW2n2​x(n)0​0≤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} Gleft( r right)=sumlimits_{n=0}^{N-1}{gleft( n right)}{{e}^{-jfrac{2pi }{L}rn}} & 0le rle L-1 \ end{matrix} G(r)=n=0∑N−1​g(n)e−jL2π​rn​0≤r≤L−1​
(4) 形成 L L L点序列 h ( n ) hleft( 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 ) hleft( n right) h(n)为任意值(一般为零),在 L = N + M − 1 L=N+M-1 L=N+M−1到 L − 1 L-1 L−1段取 h ( n ) hleft( 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 hleft( n right)=left{ begin{matrix} {{W}^{-frac{{{n}^{2}}}{2}}} & 0le nle M-1 \ begin{matrix} 0 \ {{W}^{-frac{{{left( L-n right)}^{2}}}{2}}} \ end{matrix} & begin{matrix} Mle nle L-N \ L-N+1le nle L-1 \ end{matrix} \ end{matrix} right. h(n)=⎩ ⎨ ⎧​W−2n2​0W−2(L−n)2​​​0≤n≤M−1M≤n≤L−NL−N+1≤n≤L−1​​
此 h ( n ) hleft( n right) h(n)实际上是序列 W − m 2 / 2 {{W}^{-{{m}^{2}}/2}} W−m2/2以 L L L为周期的周期延拓序列的主值序列
用FFT法求 h ( n ) hleft( 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} Hleft( r right)=sumlimits_{n=0}^{L-1}{hleft( n right)}{{e}^{-jfrac{2pi }{L}rn}} & 0le rle L-1 \ end{matrix} H(r)=n=0∑L−1​h(n)e−jL2π​rn​0≤r≤L−1​
(5) 将 H ( r ) Hleft( r right) H(r)和 G ( r ) Gleft( r right) G(r)相乘,得 Q ( r ) = H ( r ) G ( r ) Qleft( r right)=Hleft( r right)Gleft( r right) Q(r)=H(r)G(r), Q ( r ) Qleft( r right) Q(r)为 L L L点频域离散序列
(6) 用FFT法求 Q ( r ) Qleft( r right) Q(r)的 L L L点IDFT,得 h ( n ) hleft( n right) h(n)和 g ( n ) gleft( 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 hleft( n right)gleft( n right)=qleft( n right)=frac{1}{L}sumlimits_{r=0}^{L-1}{Hleft( r right)}Gleft( r right){{e}^{jfrac{2pi }{L}rn}} h(n)g(n)=q(n)=L1​r=0∑L−1​H(r)G(r)ejL2π​rn
式中,前 M M M个值等于 h ( n ) hleft( n right) h(n)和 g ( n ) gleft( n right) g(n)的线性卷积结果 [ h ( n ) ∗ g ( n ) ] left[ hleft( n right)*gleft( n right) right] [h(n)∗g(n)], n ≥ M nge M n≥M的值没有意义,不需要求。
(7) 最后求 X ( z k ) Xleft( {{z}_{k}} right) X(zk​):
X ( z k ) = W k 2 2 q ( k ) 0 ≤ k ≤ M − 1 begin{matrix} Xleft( {{z}_{k}} right)={{W}^{frac{{{k}^{2}}}{2}}}qleft( k right) & 0le kle M-1 \ end{matrix} X(zk​)=W2k2​q(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函数介绍

最后

以上就是眼睛大歌曲最近收集整理的关于频谱细化-----CZT算法介绍及MATLAB实现的全部内容,更多相关频谱细化-----CZT算法介绍及MATLAB实现内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(290)

评论列表共有 0 条评论

立即
投稿
返回
顶部