Retour |
La transformation
réversible d'un vecteur en un vecteur pseudo-aléatoire ou
chaotique permet de réaliser une opération d'interpolation approximative
mais rapide.
Le principe de l'interpolation
est simple:
Il suffit d'échantillonner
le signal avec un nombre de points différent de l'échantillonnage
de départ et de calculer la nouvelle amplitude de chaque point si ce
point ne correspond pas à un échantillon du signal d'origine.
De nombreuses méthodes sont disponibles qui approximent au mieux l'interpolation
théorique.
Notre approche ne vise pas une
efficacité algoritmique mais une démonstration de possibilité
de traitement du signal par des méthodes transposables aux circuits neuromimétiques.
Pour obtenir un nombre d'échantillons
inférieur à celui d'origine nous proposons de supprimer des échantillons
du signal d'origine et ce de façon aléatoire sur toute la durée
du signal. Le nombre de points à supprimer étant proportionnel
au rapport signal interpolé sur signal d'origine.
Nous obtenons ainsi un signal interpolé
approximatif en raison du décalage sur l'axe des x des échantillons.
Le problème est d'en améliorer la précision .
Nous répétons
donc l'opération avec un échantillonnage aléatoire différent
qui décale d'une façon différente les échantillons
et nous faisons la moyenne des signaux interpolés obtenus.
On voit qu'avec des itérations
successives les points échantillonnés vont osciller autour d'une
valeur moyenne qui sera proche de la valeur désirée.
Nous présentons ci-dessous
le modèle matlab qui réalise cette opération:
Nb_zeros=200; % Le vecteur d'origine comporte 1024 échantillons, le vecteur interpolé 1024-200= 824, rapport=0,80
Iter=200; % Nombre d'itérations
Sum_moy_red=zeros(1,size(Cyc_moy,2)-Nb_zeros); % Initialisation du vecteur somme
for i=1:Iter
Cyc_bom=bomb_alea(Cyc_moy,Nb_zeros);
Cyc_moy_red=[Cyc_moy(find(Cyc_bom)),zeros(1,size(Cyc_bom,2)-Nb_zeros-size(Sum_moy_red,2))]; % suppression des 0
% et ajustement vecteur si nécessaire
Sum_moy_red=Sum_moy_red+Cyc_moy_red; % Somme des vecteurs réduits
end
Cyc_moy_red=Sum_moy_red/Iter; % Moyenne
h=figure(1);
set(h,'name','Cycles Origine et Interpolé','resize','off');
axis([1,1024,-1,1]);
hold on;
plot(Cyc_moy);
plot(Cyc_moy_red,'color','r']);function x=bomb_alea(Cible,Nb_zeros)
% bombardement aléatoire d'un vecteur Cible
% par Nb_zeros
if nargin==0;
Cible=[1:1:200];Nb_zeros=20; % valeurs d'essai
end
fin=size(Cible,2);
vec_01=ones(1,fin);
position=1;
Nb_points=1;
while Nb_points <= Nb_zeros
position=floor(rand(1)*(fin-1)+1);
while vec_01(position)==0
position=floor(rand(1)*(fin-1)+1);
end
vec_01(position)=0;
Nb_points=Nb_points+1;
end
x=Cible.*vec_01;
Dans le programme suivant faisant appel à une transformation chaotique du vecteur, seule la fonction bomb_alea change. On y remarque qu'on "coupe" le vecteur chaotique à la longueur désirée, remplaçant la partie enlevée par des zéros qui seront supprimés par la fonction find( ) de matlabfunction x=bomb_alea2(Cible,Nb_zeros)
if nargin==0; % Valeurs d'essai
Cible=[1:1:200];
Nb_zeros=20;
end
fin=length(Cible);
pas_premier=primes(2000); % Liste de valeurs premières
n=length(pas_premier);
choix=ceil(rand(1)*n);
pas=pas_premier(choix); % On choisit un pas au hazard dans la liste des nb premiers
while rem(fin+1,pas)==0 % si le pas est un diviseur de fin+1 on tire un nouveau pas
choix=ceil(rand(1)*n); % ne se produit pas si fin est pair
pas=pas_premier(choix);
end
for i=1:fin
position(i)=modulo(i,pas,fin+1); % Vecteur d'adresses
Cible_crypt(position(i))=Cible(i); % Adressage indexé
end
x_c=[Cible_crypt(1:fin-Nb_zeros),zeros(1,Nb_zeros)]; % Section du vecteur chaotique
x=x_c(position); % Reconstruction du vecteur comprenant Nb_ zeros répartis au hazard
![]()
On remarque que le signal est moins "filtré" avec un échantillonnage chaotique, qui est plus régulier qu'un échantillonnage aléatoireNous pouvons appliquer le même principe pour l'agrandissement du signal.
Il s'agit cette fois d'ajouter des échantillons (Nb_zeros) au signal initial (Cible). Chaque échantillon est la moyenne des échantillons adjacents du signal d'origine.function Vect_augm=bomb_alea3(Cible,Nb_zeros)
% interpolation chaotique agrandissement
if nargin==0; % valeurs par défaut pour tester la fonction
Cible=[1:1:200];
Nb_zeros=50;
end
fin=size(Cible,2)+Nb_zeros;
vec_01_org=zeros(1,size(Cible,2)+Nb_zeros);
vec_01_org(1:size(Cible,2))=1;
vec_01=zeros(1,size(Cible,2)+Nb_zeros);
Vect_augm=ones(1,fin);
pas_premier=primes(2000);
n=length(pas_premier);
choix=ceil(rand(1)*n);
pas=pas_premier(choix);
% on choisit un pas au hazard dans la liste des nb premiers
while rem(fin+1,pas)==0 % si le pas est un diviseur de fin+1 on tire un nouveau pas
choix=ceil(rand(1)*n); % ne se produit pas si fin est pair
pas=pas_premier(choix);
end
for i=1:fin
position(i)=modulo(i,pas,fin+1);
vec_01(position(i))=vec_01_org(i);
end vec_01(1)=1;
vec_01(fin)=1;
curseur=1;
for index=1:fin
if vec_01(index)~=0
Vect_augm(index)=Cible(curseur);
if curseur <= size(Cible,2)-1
curseur=curseur+1;
end
end
if vec_01(index)==0
Vect_augm(index)=(Cible(curseur-1)+Cible(curseur))/2; % plateau tant que 0 consécutifs
end
end
% figure;
% plot(Vect_augm);Voici le résultat:
Nb_zeros=500; % Le vecteur d'origine comporte 1024 échantillons, le vecteur interpolé 1024+500=1524, rapport=1.48
Iter=100; % Nombre d'itérations
Le principe peut bien sûr s'appliquer au traitement d'une image et constituer ainsi un prétraitement complétant l'orthogonalisation nécessaire au stockage maximal sur une mémoire associative. En phase de reconnaissance d'image, la structure en boucle permet de plus le glissement de l'image en modifiant simplement le point de départ de lecture du signal sur la boucle.