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

Voir aussi