系统响应:时间与频率。为什么我得到不同的量级?

信息处理 matlab fft 时频
2022-02-06 21:19:09

我正在模拟由以下等式描述的线性系统

mx¨+cx˙+kx=Asin(ωt)

Fs = 1000;      % sampling frequency
tspan = 0:1/Fs:10;
m = 25;
c = 15;
k = 330000;
A = 100;           % forcing amplitude
omega = 114.89;    % forcing frequency

% State space function
odefun = @(t,u)[u(2); 1/m*(-k*u(1)-c*u(2)+A*sin(omega*t))];

[time,u] = ode45(odefun,tspan,[0 0]);

spost = u(:,1);    % displacement
vel = u(:,2);      % velocity

然后我计算位移的 FFT:

L = length(spost);
NFFT = 2^nextpow2(L);
SPOST = fft(spost,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

这就是我得到的:

如您所见,两种情况下位移的最大值不同,但这对我来说并不正确。事实上,如果我在时域或频域中进行结构分析,我希望获得相同的最大位移(因为激励频率等于共振频率)。

这怎么解释?

编辑

我忘了说我也尝试过增加模拟时间,但两个值仍然不匹配

2个回答

您要做的是将信号的幅度与 FFT 峰值的幅度进行比较,期望它是相同的。问题是你的信号幅度在变化,FFT 在整个持续时间内取“平均值”。

在这种情况下,您应该使用信号的时频表示,例如我们的频谱图。它将允许您观察特定频率的幅度如何随时间变化。由于您在 MATLAB 中工作,您可以尝试以下代码:

win = hamming(256)
noverlap = 0
nfft = 512
X = abs(spectrogram(spost, win, noverlap, nfft))
% Scale by window and multiply by 2 to restore energy from negative freqs
X = 2*X/sum(win)
surf(X)

它会产生类似的东西: 在此处输入图像描述

位移的最大值在左右。通过进一步调整和使用其他方法,可以进一步调整结果。0.053

只是为了补充 jojek 解释的内容,您的振幅不匹配有两个原因。首先是信号的包络/幅度。它从 0 开始,然后逐渐上升到 0.058。它似乎遵循一个1eαt行为。由于此函数本质上是在时域中乘以您的正弦曲线 - 这意味着在频域中进行卷积 - 此卷积将基本上散布您所期望的峰值响应,即一些能量将出现在相邻的频率区间中。您可以通过对较长的输出序列进行 FFT 来减少这种影响,和/或从时间开始 FFTt=10- 这基本上有助于减少瞬态启动的影响。

第二个影响可能是由于频谱泄漏。FFT 仅评估离散频率点的响应。如果时域信号的频率不完全位于这些 FFT 箱之一上,那么您将能量泄漏到附近的 FFT 箱中。再次帮助减轻这一因素的一种方法是采用较长序列的 FFT。较大的 FFT 意味着频率区间更紧密地间隔在一起。

正如您从频率图中看到的那样,您没有尖锐的峰值 - 存在旁瓣 - 这就是为什么您没有得到预期的幅度的原因。由于 FFT 频率仓的离散特性,其中一些能量正在泄漏到相邻的频率仓中。

帮助改进 FFT 幅度测量的一种替代方法是对数据使用平顶窗口,并采用更大的 FFT - 但使用更多实际数据(不仅仅是零填充)。Matlab 中有一个直接可用的平顶窗口,或者您应该能够在网上找到一些可用的公式。