您可以计算帧中信号的瞬时频率。这可以按照本文中的概述来完成(例如方程(9))。您需要使用希尔伯特变换器计算解析信号:
xa[n]=x[n]+jxh[n](1)
其中是的希尔伯特变换。瞬时频率由 (1) 的相位的(离散时间)导数给出。如果您使用一阶差分来近似离散时间导数,您将得到方程式中给出的公式。(9) 上面引用的论文。给定瞬时频率的估计值,您可以简单地拟合一条线来估计扫描参数。xh[n]x[n]
这个小 Matlab/Octave 脚本显示了这种方法如何处理一个玩具问题:
% create chirp signal
N = 256;
n=(0:N-1)';
fx=(0.1+0.01*n/N);
x=sin(2*pi*fx.*n);
% compute analytic signal
xh=hilbert(x);
xr=real(xh);xi=imag(xh);
% compute instanteneous frequency (could be done over fewer points)
tmp1 = xr(1:N-1).*xi(2:N) - xr(2:N).*xi(1:N-1);
tmp2 = xr(1:N-1).*xr(2:N) + xi(1:N-1).*xi(2:N);
f=atan2(tmp1,tmp2)/(2*pi); % (biased) estimate of instanteneous frequency
% linear regression over center values of f
skip = floor(N/4); % skip unreliable points at beginning and end of f
na = skip:(N-skip);
A=[ones(length(na),1),na(:)];
u=A\f(na);
f0=u(1); k=u(2)/2; % remove bias
[f0,k]
% reconstructed linear frequency
fr = f0 + k*n;
plot(n,fx,(2:N),f-k*(2:N)',n,fr,':')
legend('exact','estimated','reconstructed')
axis([0,N,f0*.9,(f0+k*N)*1.1])
该图显示了信号的实际线性频率(蓝色)、分析信号的估计值(绿色)以及通过估计频率拟合一条线获得的重建频率。请注意,两端的估计都不可靠,因此该线拟合到频率估计的中心值。
