Matlab 系统输出的fft线性卷积
这是一个质量弹簧减振器系统,具有脉冲响应,Matlab 系统输出的fft线性卷积,matlab,fft,linear-algebra,convolution,Matlab,Fft,Linear Algebra,Convolution,这是一个质量弹簧减振器系统,具有脉冲响应,h和任意强制功能,f(cos(t))。我正在尝试使用Matlab的FFT函数来执行频域卷积。我希望输出(ifft(conv))是具有指定作用力的质量弹簧减振器系统的解决方案,但是我的图看起来完全错误!所以,我一定是实施了一些错误的措施。请帮我在下面的代码中找到我的错误!谢谢 clear %system parameters m=4; k=256; c=1; wn=sqrt(k/m); z=
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,:))
初始瞬态将出现在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
缩小),红色曲线表示您的替代实现(使用函数force
除以m
)。您希望得到什么样的图?我得到了一个小振幅/高频正弦波偏移量和高振幅/低频正弦波偏移量,这对于您提供的强制函数来说似乎并不合理。但是我已经有一段时间没有研究振动了。你能告诉我们你期望的输出是什么样子吗?我也运行了代码,我似乎得到了一些合理的东西,比如Igenchris。我刚刚添加了一个程序,可以显示预期的内容(我无法发布图片)。这是系统的数值解。请注意,它太慢了。速度慢是我尝试使用FFT方法的原因。此外,由于输入的周期性假设,我不确定是否期望在FFT方法中看到初始瞬态解@eigenchris@rayryeng运行我添加的代码。啊,是的!谢谢你指出那个错误!!我想知道为什么在这两种情况下,我的振幅似乎都比预期的大。最后一个问题:如果我只对稳态响应感兴趣,而不想看到瞬态部分,我将如何修改代码?我需要去掉零填充吗?不,你需要零填充(否则你会得到一个循环卷积)。如果您想要稳态部分,请去掉卷积结果的初始样本(例如,convresult=real(ifft(conv));result=convresult(delay+1:end);
,去掉第一个延迟
样本);然而,我希望有一种方法不必计算信号的哪一部分要丢弃,而是通过FFT计算来处理。为了忽略瞬态部分,使用循环卷积可能有好处?如果存在一个具有规定周期(cos(t);2*pi)的力,并且只关注稳态,那么循环卷积不是优于线性卷积吗?主要问题是脉冲响应不是周期性的,因此在这种情况下,循环卷积没有意义。我将考虑用周期性边界条件重新表述方程的可能性,以避免使用脉冲响应。好的,非常感谢您的响应!我会努力的。如果我遇到麻烦,我可能会在另一个问题上发帖。