Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 系统输出的fft线性卷积_Matlab_Fft_Linear Algebra_Convolution - Fatal编程技术网

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)的力,并且只关注稳态,那么循环卷积不是优于线性卷积吗?主要问题是脉冲响应不是周期性的,因此在这种情况下,循环卷积没有意义。我将考虑用周期性边界条件重新表述方程的可能性,以避免使用脉冲响应。好的,非常感谢您的响应!我会努力的。如果我遇到麻烦,我可能会在另一个问题上发帖。