如何估计非线性啁啾的频率特性?

信息处理 频谱 调频
2022-02-07 04:56:38

给定渐近接近频率的噪声损坏啁啾的部分时域记录,以及确定非线性的函数,我如何准确估计它接近的最终频率?

这是我正在谈论的一个例子。无线电接收器听到噪声直到样本 x=5100 左右,然后啁啾声从 f=0 开始,并迅速扫到未知频率,但随后在 x=5500 附近逐渐减弱到由硬件前端引起的一些恼人的滤波器振铃带通滤波器。

实际脉搏 X:样本计数,Y:ADC 计数

理想的解决方案将具有以下特点:

  1. 准确预测最终频率
  2. 在一系列最终频率上工作
  3. 对不同的起始频率保持不变
  4. 对不同的停止频率保持不变
  5. 计算速度相对较快

迄今为止尝试的方法:

  1. 使用过零估计瞬时频率,然后进行曲线拟合。似乎噪声和滤波器振铃会导致频率计算出现错误,使其对波形形状的微小变化非常敏感。如果首先将信号重新采样到更高的采样率,效果会更好但效果不佳。

  2. 使用自相关估计瞬时频率,然后使用自相关函数的最强滞后进行曲线拟合。考虑到传入频率的知识,这很有效,因此可以提前选择自相关窗口大小,但当 ACF 窗口不够宽而无法看到整个信号时会失败。如果 ACF 太宽,它有时会将谐波视为最强滞后。

  3. 曲线拟合原始信号。如果初始条件有一点点误差,或者信号中有噪声,这往往不会收敛。

  4. FFT/STFT,然后对 bin 进行曲线拟合。我在这里遇到的是垃圾箱似乎正在破坏信号的形状。我找不到能提供足够频率分辨率和时间分辨率的合适大小的 bin。

此处提供了示例记录。

1个回答

只是使用怎么样dϕdt计算瞬时频率?

GNU Octave 代码(我刚刚编写了 2 Msps 的采样率):

pkg load signal;
x = csvread('nonlinear_freq_fit.csv');
y = hilbert(x);
z = y - mean(real(y));
dphi_dt = diff(unwrap(arg(z)));
Fs = 2e6;
f_inst = (Fs/2)/pi * dphi_dt;
k = [0:length(f_inst)-1];
t = k/Fs;
plot(k, f_inst);
axis([5000 5800 -2e5 2e5]);
title('Instantaneous Frequency');
xlabel('Sample index');
ylabel('Frequency (Hz)');
grid on;

在此处输入图像描述