积分器脉冲响应的意外 FFT 输出 - MATLAB

Unexpected FFT output of the impulse response of an integrator - MATLAB

我正在尝试使用系统脉冲响应的傅立叶变换来获得任何传递函数的频率响应。对于大多数测试案例,它工作得很好,但我仍然对有积分器的传递函数有问题(例如 1/s ; (4s+2)/(3s^2+s) 等)。

让我们以 H(s) = 1/s 的纯积分器为例。获得的脉冲响应是预期的阶跃函数,但是脉冲响应的傅里叶变换没有给出预期的理论结果。相反,它给出的结果非常小,并且在处理后不会导致积分器的经典特征(-20dB/decade 幅度和 -90deg 相位)。

如果我不够清楚,也许几行代码会有所帮助:

h = tf(1,[1 0]);
t_step = .1;
t = [0 : t_step : 100000]';
[y,t1] = impulse(h,t);
y_fft = fft(y);

你知道这个问题可能来自哪里吗?如果您需要更多信息,请告诉我。我正在研究 MATLAB R2013b。

如我的评论所述,问题与:

  1. fft 假定一个周期信号,即提供的离散信号的无限重复
  2. 您还应该包括负时间的响应,即在脉冲发生之前。

h = tf(1,[1 0]);
t_step = 1;
t = [0 : t_step : 999]';
[y,t1] = impulse(h,t);

y = [y; zeros(1000, 1)];
y_fft = fft(y);

figure
semilogx(db(y_fft(1:end/2)), 'r.');

figure
semilogx(180/pi*angle(y_fft(y_fft(1:end/2)~=0)), 'r');

进一步说明

  • 请注意,由于 fft(和 y)的周期性,一半的值是负无穷大,我没有绘制以获得更好的结果。

  • 注意fft和连续傅里叶变换的区别效果取决于脉冲响应的实傅里叶变换。特别是 aliasing 可能是个问题。