Simulation en Matlab de la diffraction d'onde par deux objets - Echo Radar
Programme Matlab et génération de l'animation vidéo
Tout d'abord le résultat: la vidéo présentée à la figure 2. de l'introduction à la furtivité radar des objets.
Les calculs de la simulation reposent sur la méthode des différences finies, voir à cette page par exemple, et la page d'initiation et de TP Matlab, plus spécifiquement le TP 8, simulation de la propagation monodimensionnelle d'onde, le TP 9, simulation de la propagation bidimensionnelle d'onde, et le TP 10, simulation de la propagation d'ondes dans un milieu.
Pour la simulation qui nous intéresse ici, générant l'animation ci-dessus, le code Matlab:
clear all;close all
clc;
c=8;
Lx=100;Ly=Lx;
Nx=150;Ny=150;
dx=Lx/Nx;dy=Ly/Ny;
x=linspace(0,Lx,Nx);
y=linspace(0,Ly,Ny);
dt=sqrt(dx^2+dy^2)/(2*c);
nu=1; % frqce de la source
Temis=4; % duree d'émission de la source
T=32;
t=[0:dt:T];Nt=length(t);
gax=c^2*dt^2/dx^2;
gay=c^2*dt^2/dy^2;
% Position de la source
sx=round(Lx/10);
sy=round(Ly/10);
u=zeros(Nx,Ny,Nt);
% Obstacle 1
Ox=round(3*Nx/4);Oy=round(Ny/2);%centre
% Obstacle 2
Px=round(Nx/4);Py=round(4*Ny/5);%centre
for k=2:Nt-1
for i=2:Nx-1
for j=2:Ny-1
tmp1=u(i-1,j,k)+u(i+1,j,k)-2*u(i,j,k);
tmp2=u(i,j-1,k)+u(i,j+1,k)-2*u(i,j,k);
u(i,j,k+1)=2*u(i,j,k)-u(i,j,k-1)+gax*tmp1+gay*tmp2;
end
end
if (k*dt<Temis)
u(sx,sy,k+1)=2*sin(2*pi*nu*k*dt);
else
u(sx,sy,k+1)=0;
end
%
% Obstacle(s) :
for l=-2:4
u(Ox-l-4:Ox+l^2+2,Oy+l:Oy+l+2,k+1)=0;
u(Px+l:Px+l^2,Py+l:Py+l^2,:)=0;
end
%
% Reflections parasites:
u(1,:,k+1)=u(2,:,k);
u(Nx,:,k+1)=u(Nx-1,:,k);
u(:,1,k+1)=u(:,2,k);
u(:,Ny,k+1)=u(:,Ny-1,k);
end
% On dessine la source
u(sx,sy,:)=10;
% On dessine l'obstacle 1
for l=-2:4
u(Ox-l-4:Ox+l^2+2,Oy+l:Oy+l+2,:)=10;
end
% On dessine l'obstacle 2
for l=-2:4
u(Px+l:Px+l^2,Py+l:Py+l^2,:)=10;
end
fig=figure(1);clf;whitebg('w')
colormap(jet)
MM=[];
for k=1:2:Nt
subplot(211);
%imagesc(squeeze(u(:,:,k)));
pcolor(squeeze(u(:,:,k)));
axis off
shading interp
caxis([-0.5 2]);%colorbar
subplot(212),hold on
pp=plot([1:k]*dt,squeeze(u(sx+3,sy+3,1:k)));
set(pp,'linewidth',3')
pp=plot(t,zeros(size(t)),'--k');
set(pp,'linewidth',0.5')
axis([0 T -0.6 0.6])
xlabel('Temps [ms]','fontsize',16)
ylabel('Amplitude','fontsize',16)
grid on
%pause(0.01)
MM=[MM getframe(fig)];
end
%break
movie2avi(MM,'Onde_Obstacles_Radar.avi')
La vidéo générée avec
movie2avi
est, par défaut,
non compressée et donc volumineuse.
On peut utiliser directement certains codecs pour l'encoder avec
Matlab, voir les paramètres de movie2avi
via l'aide
help movie2avi
ou encore, comme alternative à
movie2avi
, voir aussi
VideoWriter
qui s'utilise à peu près similairement et est
un peu plus complet face à l'encodage et aux codecs; voir par exemple
la liste des "profiles" disponibles
VideoWriter.getProfiles()
Enfin, un autre alternative, extérieure et indépendante de Matlab, est de convertir/encoder a posteriori la vidéo générée par Matlab, avec par exemple
ffmpeg
ffmpeg -i Onde_Obstacles_Radar.avi Onde_Obstacles_Radar.mp4
ce qui permet par exemple son insertion directe dans une balise <video> de html5 comme en haut de cette page, ou en gif animé, via l'utilitaire convert, par exemple:
convert -loop 2 Onde_Obstacles_Radar.avi Onde_Obstacles_Radar.gif
A cette fin, on peut obtenir les informations prinxipales sur la vidéo
avec par exemple ffprobe
:
ffprobe -v quiet -show_streams -show_format Onde_Obstacles_Radar.mp4