系统输出使用 fft 的线性卷积

Linear convolution using fft for system output

这是一个质量-spring-阻尼器系统,具有脉冲响应 h 和任意力函数 f(在本例中为 cos(t))。我正在尝试使用 Matlab 的 FFT 函数在频域中执行卷积。我期望输出 (ifft(conv)) 是具有指定强制的质量-spring-阻尼器系统的解决方案,但是我的情节看起来完全错误!所以,我一定是在实施错误的东西。请帮助我在下面的代码中找到我的错误!谢谢

clear
%system parameters
m=4;               
k=256;                 
c=1;

wn=sqrt(k/m);
z=c/2/sqrt(m*k);
wd=wn*sqrt(1-z^2);
w=sqrt(4*k*m-c^2)/(2*m);

x0=0;   %initial conditions
v0=0;
%%%%%%%%%%%%%%%%%%%%%%%%%
t=0:.01:2*pi  ;%time vector

f=[cos(t),zeros(1,length(t)-1)];   %force f
F=fft(f);

h=[1/m/wd*exp(-z*wn*t).*sin(wd*t),zeros(1,length(t)-1)];  %impulse response
H=fft(h);

conv=H.*F;   %convolution is multiplication in freq domain

plot(0:.01:4*pi,ifft(conv))

查看此代码的预期内容 运行。输入 cos(t); 4; 1;输入为 256。您可以看到它以与上述 FFT 代码生成的图大不相同的幅度达到稳定状态。

%%%FOR UNDERDAMPED SYSTEMS

func=input('enter function of t--->   ','s');
m=input('mass    ');
c=input('c    ');
k=input('k    ');

z=c/2/sqrt(k*m);
wn=sqrt(k/m);
wd=wn*sqrt(1-z^2);

dt=.001;
tMax=20;

x0=0;
v0=0;
t0=0;

t=0:dt:tMax;

X(:,1)=[x0;v0;t0];

functionForce=inline(func);

tic
for i=1:length(t)-1
    a=([0, 1, 0; -wn^2, -2*z*wn, 0; 0,0,0]*[X(1,i);X(2,i);X(3,i)]+[0;functionForce(X(3,i));0]);
    Xtemp=X(:,i)+[0;0;dt/2] + a*dt/2;
    b=([0, 1, 0; -wn^2, -2*z*wn, 0; 0,0,0]*[Xtemp(1);Xtemp(2);Xtemp(3)]+[0;functionForce(X(3,i));0]);
    Xtemp=Xtemp+[0;0;dt/2] + b*dt/2;
    c=([0, 1, 0; -wn^2, -2*z*wn, 0; 0,0,0]*[Xtemp(1);Xtemp(2);Xtemp(3)]+[0;functionForce(X(3,i));0]);
    Xtemp=Xtemp + [0;0;dt] +c*dt;
    d=([0, 1, 0; -wn^2, -2*z*wn, 0; 0,0,0]*[Xtemp(1);Xtemp(2);Xtemp(3)]+[0;functionForce(X(3,i));0]);
    X(:,i+1)=X(:,i)+(a+2*b+2*c+d)*dt/6+[0;0;dt];

end
toc
figure(1)
axis([0 tMax min(X(1,:)) max(X(1,:))])
plot(t,X(1,:))

FFT 方法中会出现初始瞬态,因此您需要增加时间跨度(例如t=0:0.01:15*pi)以确保结果包括稳态。顺便说一下,由于您在相同的持续时间后截断 h,因此增加时间跨度也会使您的脉冲响应 h 更接近实际的无限长度脉冲响应。

因此,将您的代码更新为:

T=15*pi;
N=floor(T/.01);
t=[0:N-1]*0.01;  ;%time vector

...

plot([0:2*N-2]*0.01, real(ifft(conv)));
axis([0 T]); % only show the duration where the driving force is active

会相应地显示以下响应:

显示初始瞬态,最终稳定状态。您可能会注意到该图与您的替代实施方案相似,但比例因子不同。

这种缩放差异来自两个因素。第一个仅仅是因为基于 FFT 的实现中的卷积计算的总和不是时间步长的权重(与第二个实现中使用的 dt 缩放相比)。第二个来自于这样一个事实,即第二个实现没有考虑质量 m 对驱动力的影响。

考虑到这两个因素后,您应该得到以下回复:

其中蓝色曲线表示基于 FFT 的实现(与上述曲线相同,但按比例缩小 dt=0.01),红色曲线表示您的替代实现(functionForce 除以 m).