Objectifs du projet électronique
- Etude et simulation numérique du filtre Moyenneur avec Matlab [1/3]
- Etude et simulation numérique du filtre Médiane avec Matlab [1/3]
- Etudes et simulation numérique des techniques de la détection de seuil [2/3]
- Etude comparatives et qualitative des méthodes [2/3]
- Implémentation sur microcontrôleur en utilisant le kit Arduino et FPGA [3/3]
Générateur des signaux avec FPGA
- Voir le projet pour plus des détails : Projet électronique FPGA #5 : Générateur des signaux #V1
Le seuil de basculement
On va utiliser un potentiomètre variable comme étant le seuil de déclenchement. Le potentiomètre est alimenté par une tension de 3.3V (ou 5V) fixe. Le pin 2 (voir la figure) sera branché avec le pin 2 de la carte Arduino.
Schéma de câblage avec Arduino
Codes Arduino et autres fonctions
// SigProc.ino
#define Taille 64
// Sortie numériue
const int OutCompare = 2;
// Entrées Analogiques signal & seuil
const int InSignal = 1;
const int InSeuil = 2;
//Paramètres des signaux
float ValuSig[Taille];
float ValueSeuil[Taille];
float SeuilFixe =0.0;
float InputSignal=0.0;
int i=0;
void setup() {
pinMode(OutCompare, OUTPUT);
pinMode(InSignal, INPUT);
pinMode(InSeuil, INPUT);
// Calcul initial du seuil moyenne sur Taille échantillons
// Accumulation des échantillons
for( i=0;i<Taille ; i++)
{
ValueSeuil[i]=5.0*analogRead(InSeuil)/1023;
}
// Calcul de la moyenne des échantillons
SeuilFixe = Moyenne(Taille, ValueSeuil);
// Initialisation de la sortie TOR
digitalWrite(OutCompare, LOW);
delay(3000);
}
void loop()
{
// Détection du seuil avec la méthode basée sur la comparaison
InputSignal = 5.0*analogRead(InSignal)/1023;
digitalWrite (OutCompare, CopareValue(SeuilFixe, InputSignal));
// Détection du seuil avec la méthode de la Moyenne - Solution 1
/*for( i=0;i<Taille ; i++)
{
ValuSig[i]=5.0*analogRead(InSignal)/1023.0;
}
InputSignal =Moyenne(Taille, ValuSig);
digitalWrite (OutCompare, CopareValue(SeuilFixe, InputSignal));*/
/* // Détection du seuil avec la méthode de la Moyenne - Solution 2
ValuSig[i]=5.0*analogRead(InSeuil)/1023;
//InputSignal =Moyenne(Taille, &ValuSig[0]);
InputSignal=(ValuSig[0]+ValuSig[1]+ValuSig[2]+ValuSig[3])/Taille;
digitalWrite (OutCompare, CopareValue(SeuilFixe, InputSignal));
i=(i++) % Taille; */
/* // Détection du seuil avec la méthode de la Médiane
ValuSig[i]=5.0*analogRead(InSeuil)/1023;
TableSort(Taille , ValuSig);
InputSignal =Mediane(Taille, ValuSig);
i=(i++) % Taille;
digitalWrite (OutCompare, CopareValue(SeuilFixe, InputSignal)); */
}
// Fonction qui calcul la moyenne d'un tableau
float Moyenne(unsigned char taille, float *DataIn)
{
unsigned char i=0;
float somme =0.0;
for(i=0;i<taille; i++)
somme+=DataIn[i];
return somme/taille;
}
// Fonction qui calcul la valeur médiane d'un tableau
float Mediane(unsigned char taille, float *DataSort)
{
float MedValue = 0.0;
MedValue = DataSort[round((taille-1.0)/2.0)];
return MedValue;
}
// Fonction de tri d’un tableau
void TableSort(unsigned char taille, float *DataIn)
{
unsigned char i, j ;
float temp;
for (i = 0; i < (taille - 1); ++i)
{
for (j = 0; j < taille - 1 - i; ++j )
{
if (DataIn[j] > DataIn[j+1])
{
temp = DataIn[j+1];
DataIn[j+1] = DataIn[j];
DataIn[j] = temp;
}
}
}
}
// Fonction comparateur basique
unsigned char CopareValue(float Seuil, float Value)
{
unsigned char Sortie =0;
if (Value >=Seuil)
Sortie =1;
else
Sortie=0;
return Sortie ;
}
// Conversion d'une valeur entière en tableau binaire
void int2BitArray(unsigned char dataIn,unsigned char taille, unsigned char *dataArray)
{
int i=0;
for(i=0;i<taille;i++)
dataArray[taille-i-1]= (dataIn>>i)&0x01;
}
// Fonction de décalage des échantillons d'un tableau
void DataShiftArray(unsigned char NumShift,unsigned char taille, unsigned char *DataIn, unsigned char *DataOutShift)
{
int i=0;
for(i=0;i<taille;i++)
DataOutShift[i]= (DataIn[i]>>NumShift);
}
// SigProcArduino.c
#include <SigProcArduino.h>
#include "math.h"
float Moyenne(unsigned char NumMean,unsigned char taille, unsigned char *DataIn)
{
unsigned char i=0;
float somme =0.0;
for(i=0;i<NumMean; i++)
somme+=DataIn[i];
return somme/NumMean;
}
float Mediane(unsigned char taille, unsigned char *DataSort)
{
unsigned char MedValue = 0;
//MedValue = DataSort[round((taille-1.0)/2.0)];
return MedValue;
}
void TableSort(unsigned char taille, unsigned char *DataIn)
{
unsigned char i, j, temp;
for (i = 0; i < (taille - 1); ++i)
{
for (j = 0; j < taille - 1 - i; ++j )
{
if (DataIn[j] > DataIn[j+1])
{
temp = DataIn[j+1];
DataIn[j+1] = DataIn[j];
DataIn[j] = temp;
}
}
}
}
unsigned char CopareValue(unsigned char Seuil, unsigned char Value)
{
unsigned char Sortie =0;
if (Value >=Seuil)
Sortie =1;
else
Sortie=0;
return Sortie ;
}
void int2BitArray(unsigned char dataIn,unsigned char taille, unsigned char *dataArray)
{
int i=0;
for(i=0;i<taille;i++)
dataArray[taille-i-1]= (dataIn>>i)&0x01;
}
void DataShiftArray(unsigned char NumShift,unsigned char taille, unsigned char *DataIn, unsigned char *DataOutShift)
{
int i=0;
for(i=0;i<taille;i++)
DataOutShift[i]= (DataIn[i]>>NumShift);
}
// SigProcArduino.h
float Moyenne(unsigned char NumMean,unsigned char taille, unsigned char *DataIn);
float Mediane(unsigned char taille, unsigned char *DataSort);
void TableSort(unsigned char taille, unsigned char *DataIn);
unsigned char CopareValue(unsigned char Seuil, unsigned char Value);
void int2BitArray(unsigned char dataIn,unsigned char taille, unsigned char *dataArray);
void DataShiftArray(unsigned char NumShift,unsigned char taille, unsigned char *DataIn, unsigned char *DataOutShift);
Photos du projet
- Signal sin + seuil
- Résultat pour Signal sin + bruit non filtré
- Résultat pour Signal sin + bruit filtré
************
Un petit commentaire de vous, un Grand encouragement pour nous
************
Téléchargement du projet
************
Une réponse sur « Projet électronique : Traitement du signal avec Arduino # Lissage & Seuillage d’un signal 3/3 »
salut