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

迈克·詹姆斯·约翰逊(Mike James Johnson)

这是一个具有脉冲响应h和任意强制功能的质量弹簧阻尼器系统fcos(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),红色曲线代表您的替代实现(functionForce除以m)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中使用fft2进行“有效”和“完全”卷积

来自分类Dev

在Python中使用fft2进行“有效”和“完全”卷积

来自分类Dev

使用Matlab Kalman进行非线性系统估计

来自分类Dev

使用 FFT 的卷积速度有多快

来自分类Dev

torch.rfft-基于fft的卷积创建的输出与空间卷积不同

来自分类Dev

使用VHDL对信号进行卷积

来自分类Dev

使用 Keras 进行特征卷积

来自分类Dev

使用offlineAudioContext进行FFT

来自分类Dev

使用offlineAudioContext进行FFT

来自分类Dev

为什么使用FFT时卷积结果会发生偏移

来自分类Dev

为什么在使用FFT时我的卷积结果会移位

来自分类Dev

尝试使用 FFT 卷积时不支持 cuDNN 状态

来自分类Dev

使用keras python输出卷积层

来自分类Dev

用Java进行系统输出

来自分类Dev

使用1D FFT与2D FFT的可分卷积

来自分类Dev

使用带有分类变量的r输出中的lm()进行多元线性回归是不完整的?

来自分类Dev

使用偶数大小的内核进行图像卷积

来自分类Dev

使用keras以零均值进行卷积

来自分类Dev

使用for循环opencv python对图像进行卷积

来自分类Dev

使用numpy进行简单卷积的意外结果

来自分类Dev

如何使用傅立叶级数进行卷积

来自分类Dev

使用FFT进行高斯模糊

来自分类Dev

FFT卷积不比规范卷积计算快

来自分类Dev

通过对FFT结果进行共轭来使用FFT进行IFFT

来自分类Dev

使用postgres进行线性回归

来自分类Dev

使用python进行线性编程

来自分类Dev

如何在python中逐列对两个矩阵进行线性卷积

来自分类Dev

非线性动力学系统产生的时间序列的FFT

来自分类Dev

Matlab进行非线性灰箱系统识别