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

时间:2015-04-16 21:01:34

标签: matlab fft linear convolution

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

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,:))

1 个答案:

答案 0 :(得分:2)

初始瞬态将出现在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

会相应地显示以下回复:

enter image description here

显示初始瞬态,最终显示稳态。您可能会注意到该图与您的备用实现类似,直到比例因子。

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

在考虑这两个因素后,您应该得到以下答案:

enter image description here

其中蓝色曲线表示基于FFT的实现(与上面的曲线相同,但按dt=0.01缩小),红色曲线表示您的备用实现(functionForce除以{{1 }})。