⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simulation_v2.m

📁 Ultrasonor captor with Microchip dsPIC33F
💻 M
字号:
clc;
clear all;
close all;
tic;

disp('*****************************************');
disp('***     MATLAB - SIMULATION V0.2      ***');
disp('*****************************************');

%% Constantes
largeur = 210;
Longueur = 300;
vitesse_son = 340;
f_ech = 123.077e3;
longueur_sbpa = 2047;
%load donnee.mat
%% Coordonn閑s des balises
B1 = [0 largeur/2];
B2 = [Longueur 0];
B3 = [Longueur largeur];
        
%% Param鑤res
x_robot = 1.70;  %max 300    milieu de terrain : 150
y_robot = 1.05;  %max 210    milieu de terrain : 105
k=0;

bar = waitbar(0,'Simulation en cours...');

for x_robot = [0:1:Longueur-1]
    for y_robot = [0:1:largeur-1]
        k=k+1;
        waitbar(((x_robot)*largeur+(y_robot))/(Longueur*largeur));
        
        %% Calcul des distances
        dist(1) = sqrt((x_robot)^2 + (y_robot - largeur/2)^2);
        dist(2) = sqrt((x_robot-Longueur)^2 + (y_robot)^2);
        dist(3) = sqrt((x_robot-Longueur)^2 + (y_robot - largeur)^2);

        %% Calcul d閜hasage sur les balises en 閏hantillons -> pour la cr閍tion des
        %% signaux
        deph_ech = round(dist*1e-2/vitesse_son*f_ech);
        if max(deph_ech) > 2*longueur_sbpa
            deph_ech = deph_ech - min(deph_ech);
        end
        deph_ech(find(deph_ech > 2*longueur_sbpa - 1)) = 1022;

        %% Calcul des d閏alages temporels -> pour comparaison apr鑣 corr閘ation
        dec_temps(1,((x_robot+1)*largeur+(y_robot+1))) = (dist(1)*1e-2/vitesse_son) - (dist(2)*1e-2/vitesse_son);    % 1-2
        dec_temps(2,((x_robot+1)*largeur+(y_robot+1))) = (dist(2)*1e-2/vitesse_son) - (dist(3)*1e-2/vitesse_son);    % 2-3
        dec_temps(3,((x_robot+1)*largeur+(y_robot+1))) = (dist(3)*1e-2/vitesse_son) - (dist(1)*1e-2/vitesse_son);    % 3-1

        %% Calcul des d閏alages en nombre d'閏hantillons -> pour comparaison apr鑣
        %% corr閘ation
        dec_ech = round(dec_temps*f_ech);

        %% Calcul des diff閞ences de distances
        dist_cal = dec_temps*vitesse_son;

%         %% Affichage
%         s = sprintf('Donn閑s : ');
%         disp(s);
%         s = sprintf('Coordonn閑s du robot : %g ; %g', x_robot,y_robot);
%         disp(s);
%         s = sprintf('Diff閞ences de distances : \n\t d1-d2 : %g m ; \n\t d2-d3 : %g m ; \n\t d3-d1 : %g m ;', dist_cal(1), dist_cal(2), dist_cal(3));
%         disp(s);
%         s = sprintf('Diff閞ences temporelles : \n\t t1-t2 = %g ms ; \n\t t2-t3 = %g ms ; \n\t t3-t1 = %g ms ;', dec_temps(1)*1e3,dec_temps(2)*1e3,dec_temps(3)*1e3);
%         disp(s);
%         s = sprintf('Diff閞ences d''閏hantillons : \n\t B1-B2 : %g 閏hantillons ; \n\t B2-B3 : %g 閏hantillons ; \n\t B3-B1 : %g 閏hantillons ;', dec_ech(1), dec_ech(2), dec_ech(3));
%         disp(s);
%         disp('.');
%         disp('*****************************************');
%         disp('SIMULATION');
%         disp('*****************************************');

        %% Cr閍tion des signaux ultrasons
        %sim ech 1023 points entre 0 et 1023 d'amplitude
        ech=randn([longueur_sbpa 1])*1023;
        ech = ech -mean(ech);

        %ech = ech - 512;
        modele = ech(1:longueur_sbpa)';
        size_modele = length(modele);

        signal(1,1:deph_ech(1)+1) = modele(size_modele-deph_ech(1):size_modele);
        signal(1,deph_ech(1)+2:size_modele) = modele(1:size_modele-deph_ech(1)-1);

        signal(2,1:deph_ech(2)+1) = modele(size_modele-deph_ech(2):size_modele);
        signal(2,deph_ech(2)+2:size_modele) = modele(1:size_modele-deph_ech(2)-1);

        signal(3,1:deph_ech(3)+1) = modele(size_modele-deph_ech(3):size_modele);
        signal(3,deph_ech(3)+2:size_modele) = modele(1:size_modele-deph_ech(3)-1);

        %% Affichage des signaux re鐄s par les balises :
%         figure('Name', 'Signaux ultrasons re鐄s par les balises', 'NumberTitle','off');
%         subplot(4,1,1);
%         plot(modele);
%         title('Signal 閙it par le robot');
%         subplot(4,1,2);
%         plot(signal(1,:));
%         title('Balise 1');
%         subplot(4,1,3);
%         plot(signal(2,:));
%         title('Balise 2');
%         subplot(4,1,4);
%         plot(signal(3,:));
%         title('Balise 3');

        %% Corr閘ation des signaux
        correlation(1,:)=xcorr(signal(1,:), signal(2,:));     %1 - 2
        correlation(2,:)=xcorr(signal(2,:), signal(3,:));     %2 - 3
        correlation(3,:)=xcorr(signal(3,:), signal(1,:));     %3 - 1

        %% Affichage des corr閘ations
%         x_corr = [-size_modele+1:size_modele-1];
%         figure('Name', 'Convolutions', 'NumberTitle','off');
%         subplot(3,1,1);
%         plot(x_corr,correlation(1,:));
%         title('Corr閘ation de B1 et B2');
%         subplot(3,1,2);
%         plot(x_corr,correlation(2,:));
%         title('Corr閘ation de B2 et B3');
%         subplot(3,1,3);
%         plot(x_corr,correlation(3,:));
%         title('Corr閘ation de B3 et B1');

        %% Recherche du maximum de corr閘ation
        [m idx] = max(correlation(1,:));
        dec_ech_corr(1) = idx - size_modele;
        [m idx] = max(correlation(2,:));
        dec_ech_corr(2) = idx - size_modele;
        [m idx] = max(correlation(3,:));
        dec_ech_corr(3) = idx - size_modele;

        %% Calcul des diff閞ences de temps
        temps_corr = dec_ech_corr/f_ech;

        %% Calcul d'erreur
%        err_temps = abs((temps_corr-dec_temps)./dec_temps);

        %% Calcul des diff閞ences de distances
        dist_corr = temps_corr*vitesse_son;

        %% Calcul d'erreur
        err_dist(x_robot+1,y_robot+1) = max(abs((dist_corr-dist_cal(:,k)')./dist_cal(:,k)'));

        %% Affichage r閟ultat
%         disp('.');
%         s = sprintf('Calcul : ');
%         disp(s);
%         s = sprintf('Diff閞ences d''閏hantillons : \n\t B1-B2 : %g 閏hantillons ; \n\t B2-B3 : %g 閏hantillons ; \n\t B3-B1 : %g 閏hantillons ;', dec_ech_corr(1), dec_ech_corr(2), dec_ech_corr(3));
%         disp(s);
%         s = sprintf('Diff閞ences temporelles : \n\t t1-t2 = %g ms ; \n\t t2-t3 = %g ms ; \n\t t3-t1 = %g ms ;', temps_corr(1)*1e3,temps_corr(2)*1e3,temps_corr(3)*1e3);
%         disp(s);
%         s = sprintf('\t Erreur temporelle max : %g %% ; %g ms', max(err_temps)*100, max(err_temps)*1000);
%         disp(s);
%         s = sprintf('Diff閞ences de distances : \n\t d1-d2 : %g m ; \n\t d2-d3 : %g m ; \n\t d3-d1 : %g m ;', temps_corr(1)*vitesse_son, temps_corr(2)*vitesse_son, temps_corr(3)*vitesse_son);
%         disp(s);
%         s = sprintf('\t Erreur de distance max : %g %% ; %g mm', max(err_dist)*100, max(err_dist)*1000);
%         disp(s);
%         s = sprintf('Coordonn閑s du robot : ?? ; ??');
%         disp(s);

    end
end

close(bar);

figure;
mesh(err_dist);
figure;
hold on;
plot( dec_temps(1,:), 'color',[1 0 0]);
plot( dec_temps(2,:), 'color',[0 1 0]);
plot( dec_temps(3,:), 'color',[0 0 1]);

t = toc;
s = sprintf('Temps de calcul Matlab : %g s, soit %g min',t, t/60);
disp(s);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -