我有一个带有测量输入 ( u) 和输出 ( y) 的系统。
我假设这是一个线性时不变 (LTI) 系统,我想找到它的脉冲响应 ( ir)。
这是我用来查找的 Matlab 代码ir:
ir = real(ifft(fft(y)./fft(u)));
这就是我重建系统输出的方式:
Y = conv(ir, u);
然而,如下所示,重构输出与真实输出有很大不同。我在这里想念什么?
包含数据的完整 matlab 代码可以在这里找到
我有一个带有测量输入 ( u) 和输出 ( y) 的系统。
我假设这是一个线性时不变 (LTI) 系统,我想找到它的脉冲响应 ( ir)。
这是我用来查找的 Matlab 代码ir:
ir = real(ifft(fft(y)./fft(u)));
这就是我重建系统输出的方式:
Y = conv(ir, u);
然而,如下所示,重构输出与真实输出有很大不同。我在这里想念什么?
包含数据的完整 matlab 代码可以在这里找到
问题在于公式其中是频率响应, ,是输入和输出,仅对频率有效,其中。
此外,如果,你会遇到数值错误,因为。
您的输入信号有很多为零或接近零的地方。我写了一个小函数来处理这些情况:
function h = impres(x,y)
X = fft(x);
Y = fft(y);
for i = 1:length(X)
if abs(X(i)) > 10
H(i) = Y(i)/X(i);
else
H(i) = 0;
end
end
h = ifft(H);
end
虽然不完美,并且可以调整,但我得到:
其中红线是估计的输出。
还有一点需要注意:IDFT 在时间上的等价物是循环卷积,而不是线性卷积。在这种情况下,没有太大的区别,但是您希望在代码中尽可能正确。