具有有限带宽输入信号和感兴趣区域的系统识别

信息处理 线性系统 系统识别 最小二乘 svd 信道估计
2022-01-30 18:54:04

给定一个 FIR 滤波器h[n]. 它的作用可以描述为:

y=Hxy=Xh

在哪里HX是一个 Toeplitz 矩阵。如果h未知,具有白色高斯输入信号的最小二乘x[n]可用于查找未知系数:

h^=(XTX)1XTy

警告:x[n]必须是白色的;否则回归矩阵XTX条件很差。

频域信息被编码在系数中h. 然而,从上面可以看出,LS算法用零先验知识估计系数;估计仅取决于输入信号x. 要识别的系统是全通滤波器还是在π/2.

现在我的问题是:如果我只关心一个小的频率范围,我该怎么办?h因此我的输入信号x[n]不需要是白色的吗?

示例:我的奈奎斯特速率是 10kHz。我未知的系统是 300 Hz 时 -3dB 的低通系统。我想估计它在 300 Hz 左右有一些“奇怪”的频率行为。我不关心超过 500 Hz 的任何东西。此外,我的测量设置阻止我使用白色输入信号。我的带宽限制为 500 Hz。我无法更改奈奎斯特率。

使用最小二乘我无法识别系统,因为x不是白色的(持续令人兴奋)。正则化/SVD 对我没有帮助:它提供了一个有偏见的解决方案,但仍然给了我h试图估计整个频率范围的值。但我真的想说“给我h描述未知系统的最佳状态,最高可达 500 Hz,输入信号为 500 Hz”

2个回答

x[n] 必须为白色的原因是因为该解决方案将根据每个频谱频率位置中存在的能量量有效地对信道响应进行频谱加权。白噪声源为所有频率提供相同的权重。如果在任何特定频率仓中不存在能量,则无法为该频率找到合适的解决方案。

如果您只关心一小部分信号,那么我认为您仍然可以使用最小二乘法。这样做的原因是考虑提供带通滤波的系统:对于这样的系统,我可以用白噪声源激发输入,并使用最小二乘法(Wiener-Hopf 方程)比较输入和输出信号,这将准确地提供信道的最小二乘估计。因此,如果您有一个频带受限的信号,只要该信号在您感兴趣的频带上是白色的,它仍然会在该频带上提供准确的解决方案(并且您忽略其他所有内容)。

你不能只使用伪逆吗?这将意味着而不是:

h^=(XTX)1XTy

你用

h^pseudo=(XTX)XTy

或者

h^pseudo2=Xy

下图显示了当我在 python 中做一个简短的例子时会发生什么(下面的代码)。x在这种情况下只是一个正弦曲线。虽然长度可能太短,但它仍然给出了一个不错的答案,而inv(通常的逆)由于奇异性而有问题XTX.

示例输出


下面的代码

from numpy import random, zeros, arange, cos
from scipy import pi
from scipy.linalg import toeplitz, inv, pinv
from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show, subplot

N = 5
h = [0.2,1,-1,0.6,1]

# x = random.normal(0, 0.01, N)
x = cos(2*pi*0.01234*arange(N) + 2*pi*random.uniform(-1,1))
X = toeplitz(x, zeros(N)) # Need to in fill with zeros.

H = toeplitz(h, zeros(N)) # Need to in fill with zeros.
y = H @ x
y2 = X @ h

h_hat = pinv(X.transpose() @ X) @ X.transpose() @ y
h_hat2 = pinv(X.transpose() @ X) @ X.transpose() @ y2
h_hat3 = pinv(X) @ y

figure(1,  figsize=(20, 6))
subplot(1, 3, 1)
plot(h)
title("True FIR filter")

subplot(1, 3, 2)
plot(y)
plot(y2,'r.')
title("$\mathbf{Xh}$ (red) and $\mathbf{Hx}$ (blue) of filter")

subplot(1, 3, 3)

plot(h)
plot(h_hat,'ro')
plot(h_hat2,'g.')
plot(h_hat3,'k+',markersize=10)
title("True (blue) and estimated (red) filter just pseudo +")