IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Controle Automatique de Gain (AVC) algorithme avec hystèresis et configuration manuel


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut Controle Automatique de Gain (AVC) algorithme avec hystèresis et configuration manuel
    Bonjour,

    J'ai un système embarqué (microcontrolleur AT89C51sndc1 avec un convertisseur ADC 10 bits)avec lequel je fais une gestion de volume en sortie des Haut Parleurs et ce en fonction d'un microphone d'environnement. Donc si le signal en provenance du microphone augmente je dois egalement augmenter le niveau de volume sonore dans les Haut-Parleurs, si il n'y a pas de bruit environnant je dois diminuer le niveau de volume sonore.

    donc la conversion du signal en provenance du micro vari de 0 à 1023 (car 10bits) et je peux voir ça avec un printf sur l'ecran.

    Actuellement si par exemple le niveau du microphone d'environnement se trouve entre 2 valeurs alors je met le volume de sortie à une valeur donnée. Comme le code existant ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
             if (( micro_env >= 0)&&(micro_env < 7))
     {
        TEA6320_write_byte(0x00,0x20);    // Volume/Loudness
      printf("Volumecag= 20\n");
     
     }
     if (( micro_env >= 7)&&(micro_env <11))
     {
      TEA6320_write_byte(0x00,0x22);    // Volume/Loudness
      printf("Volumecag= 22\n");
     
     }
     if (( micro_env >= 11)&&(micro_env < 45))
     {
      TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
      printf("Volumecag= 25\n");
     
     }
     if (( micro_env >= 45)&&(micro_env < 101))
     {
      TEA6320_write_byte(0x00,0x27);    // Volume/Loudness
      printf("Volumecag= 27\n");
     
     }
     if (( micro_env >= 101)&&(micro_env < 246))
     {
      TEA6320_write_byte(0x00,0x29);    // Volume/Loudness
      printf("Volumecag= 29\n");
     
     }
     if (( micro_env >=246)&&(micro_env < 445))
     {
      TEA6320_write_byte(0x00,0x2B);    // Volume/Loudness
      printf("Volumecag= 2B\n");
     
     }
     if (( micro_env >= 445)&&(micro_env < 596))
     {
      TEA6320_write_byte(0x00,0x2E);    // Volume/Loudness
      printf("Volumecag= 2E\n");
     
     }
     if (( micro_env >= 596)&&(micro_env < 770))
     {
      TEA6320_write_byte(0x00,0x30);    // Volume/Loudness
      printf("Volumecag= 30\n");
     
     }
     if ( micro_env >= 770)
     {
      TEA6320_write_byte(0x00,0x33);    // Volume/Loudness
      printf("Volumecag= 33\n");
     
     }
    Etant nouveau en programmation et en C je ne sais pas comment proceder mais ce que je voudrais faire c'est 2 choses:

    D'une part, faire une hystèrese donc je passe a un volume de sortie superieur d'un niveau si le niv de micro d'environnement atteint une valeur x donnée et je redescend au niveau precedent si le niv de micro d'environnement atteint une valeur y donnée mais qui serait inferieur à x. et ce semblable aux niveaux pour le code ci-dessus.

    D'une autre part, avoir la possibilité de defenir via le clavier 3 niveau sonores que l'on pourrat placer en EEPROM (milieu calme , milieur normal, milieu bruyant) et donc pour ces 3 niveaux on devra pouvoir aussi delimiter les seuils. Exemple de 70 à 110 c'est un niveau calme, de 110 à 250 c'est un niveau normal ainsi de suite.
    Mais comme il faut une hystèresis il faudrat pouvoir pour chacun des trois niveaux definir ou configurer via le clavier des points de basculments c'est à dire les x et y.

    Pouvez vou m'aider à faire cette fonction?

    Merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Plutôt que cette série de if qui n'offre pas de souplesse et qui est très lourde, tu pourrais mettre les seuils et les volumesCAG dans un tableau. On peut créer deux tableaux pour les seuils, seuils hauts et bas, pour implementer l'hystérésis. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int Seuils[2][10] =     { {   0,   7,  11,  45, 101, 246, 445, 596, 770,1024},
                              {   0,   6,  10,  43,  95, 230, 420, 570, 740,1024} };
    unsigned char Loudness[]= {0x20,0x22,0x25,0x27,0x29,0x2B,0x2E,0x30,0x33       };
    Si index est la position actuelle dans le tableau et si micro est la nouvelle donnée du micro d'environnement, il ne reste plus qu'à parcourir le tableau pour trouver le nouvel index avec qq chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       i=0;
       while(micro >=  MicroSeuil[i==index-1] [i+1]) i++;
       index = i;
       TEA6320_write_byte(0x00,Loudness[index]);
       printf(" Volume= %x\n",Loudness[index]);

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Aliveli
    Mais comme il faut une hystèresis il faudrat pouvoir pour chacun des trois niveaux definir ou configurer via le clavier des points de basculments c'est à dire les x et y.
    La gestion d'un hystérésis passe par la gestion d'un état. Selon l'état, on utilise tel ou tel seuil.

    Exemple simple : thermostat à hystérésis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    /* tache... */
    void thermostat (void)
    {
       int seul_bas = 19;
       int seuil_haut = 21;
       int chaud = get_temp() > seuil_haut;
     
      if (!chaud)
      {
          resistance (ON);
      }
     
      for (;;)
      {
          sleep (1); /* une mesure par seconde */
          temp = get_temp();
     
          if (!chaud)
          {
             if (temp > seuil_haut)
             {
                chaud = 1;
                resistance (OFF);
             }
          }
          else
          {
             if (temp < seuil_bas)
             {
                chaud = 0;
                resistance (ON);
             }
          }
      }
    }

  4. #4
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Cet exemple du cag avec hysteresis du thermostat est tres bien
    mais je ne sais pas comment dans mon cas par quoi je pourrais remplacer la
    variable chaud ?

    Est ce que cette variable est definie une fois pour toute ou bien elle est sans cesse reinitialisée avec temp ou get_temp() ??


    if (!chaud)
    {
    if (temp > seuil_haut)

    ....

    }

    else

    {



    Merci

  5. #5
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Bonjour,

    voila j'ai fait un code pour le CAG qui compile mais je ne suis pas sur si la structure est bonne et si c'est ça pourrait bien fonctionner ?

    Rem : actuellement ne pas tenir compte de la conversion en dB avec les float et double ça ne fonctionne pas, j'ai mis ça en commentaire.

    code de configuration manuel du cag:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    // D : Change environnement's mode
    	if (STR_IN[31]==0x44)
    	{
          int varrepeat =0; 	  
            printf("*Environnement's mode*\n\r");
            printf("0: LOW LEVEL\n\r");
    		printf("1: HIGH LEVEL\n\r");
            printf("2: NORMAL LEVEL\n\r");
    		printf("3: DEFAULT AGC CONTROL LEVEL\n\r");
     
    	  printf(" Please select first your environnement's mode\n :");
     
             do {
    	      	env_choice=getchar();  
     
    	       	switch(env_choice) { 
    		case '0': 
    		  //TEA6320_write_byte(0x00,0x20); // volume faible
    	        type_volume=0; 
    			varrepeat =1;
    		  break; 
    		case '1': 
    		  //TEA6320_write_byte(0x00,0x33); // volume faible 
    	        type_volume=1;
    			varrepeat =1;
    		  break; 
    		case '2': 
    	        type_volume=2;
    			varrepeat =1;
    		  break; 
    	   case '3': 
    	       type_volume=3;
    	       varrepeat =1;
    		 break; 
            default :
             printf("\n Please enter a correct number:");
     
        		}
    		}while (varrepeat==0);
     
    	if(env_choice!=3)
    	{
    	printf("\n The environnement's sound range is between 0 to 770 !\n :");  //2805
    	printf("Please now select your Hysteresis range\n :");
    	if(env_choice==0)
    	printf("\n For this level the default low limit is 80, the high limit is 200\n :");
    	else if(env_choice==1)
       	printf("\n For this level the default low limit is 300, the high limit is 500\n :");
    	if(env_choice==2)
    	printf("\n For this level the default low limit 600, the high limit 770\n");
     
        printf("Enter a low limit value : \n");
    	scanf("%i",&seuil_bas);
        printf("Enter a high limit value : \n");
        scanf("%i",&seuil_haut);
     
    }
    		printf("\n-> Please press any key to exit\n");
     
    			for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
    		STR_IN[31]=getchar0();
    #ifdef DEBUG_ME   //testali0304
    	  	printf("%c\n",STR_IN[31]);
    #endif            //testali0304
     
    	}

    Et ce ceci c'est le code qui permet de verifier la config actuelle (plus tard je devrai faire en sorte d'enregistrer ça sur EEPROM ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    //C : Check environnement's mode
       if (STR_IN[31]==0x43)
       {
     
    	switch(type_volume) { 
    	case 0: 
    	  printf("\n The type of volume is LOW LEVEL\n");
    	  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
     
    	  //TEA6320_write_byte(0x00,0x20); // volume faible 
    	  break; 
    	case 1: 
    	  printf("\n The type of volume is HIGH LEVEL\n");
    	  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
    	  //TEA6320_write_byte(0x00,0x33); // volume faible 
    	  break; 
    	case 2: 
    	  printf("\n The type of volume is NORMAL LEVEL\n");
    	  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
     
    	case 3: 
    	  printf("\n The default's type of volume is AGC LEVEL\n");
     
    	}
    		printf("\n-> Please press any key to exit\n");
     
    			for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
    		STR_IN[31]=getchar0();
     
    	  	printf("%c\n",STR_IN[31]);
     
     
       }

    Et enfin la fonction CAG()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
     
     
    void CAG (void)
    {  
     
     
    	init_ADC();
    	Watch_Dog();
     
    	for (j=max_samples; j>0; j--)
    	{
    		samples[j] = samples[j-1];
    	}
     
    	ADCON = ADCON | 0x08;	//start A to D conversion
    	byte1 = ADDH<<2;
    	byte2 = ADDL;
    	samples[0] = byte1 + byte2;
        printf("samples[0] = %X\n", samples[0]) ; //1105 
    	moyenne = 0;
    	for (j=max_samples; j>0; j--)
    	{
    		moyenne = moyenne + samples[j];
            printf("samples[j] = %X\n", samples[j]) ; //1105   //2105 dis
         //   printf("moyenne = %i\n", moyenne) ; //1105         //2105 dis
    	}
    	moyenne = moyenne / max_samples; // ICI NO PROBLEM 
    	//moyenne = (int)((double)moyenne / (double)max_samples) ;  //2805
        printf("VRAI moyenne sur echantillons de 10: %i\n", moyenne) ; //1105
     
     
        //   moyenne2 = a * log10(moyenne/b)+c; //2405
    //	result = a * log10((moyenne/(double)b)) + c ; //2805
        //   printf("Moyenne en dB: %li\n", moyenne2) ; //1105  //2805 dis
    //	result = (double)a * log10(((double)moyenne/(double)b))+ (double)c ;
         printf("Moyenne en dB: %lf\n", result) ; //1105  //2805 
     
    	if ((moyenne==0)&&(P1_5 == 1)) 			// If AUTOMATIC MODE & ADC Average=0
    	{
    		CPT_NoMic++;
    	}
     
    	if ((CPT_NoMic==60)&&(NoMic_Bit==0)) 	// If ADC Average=0 during 60 seconds
    	{
     
            #ifdef DEBUG_ME   //testali0304
    		printf("No ambiance microphone\n");	// No Ambiance microphone => Volume = maximum
            #endif            //testali0304
    		CPT_NoMic=0;
    		NoMic_Bit=1;
     
    	}
     
    	if ((moyenne>0)&&(P1_5 == 1)) // If ADC Average<>0 => Ambiance microphone (re-)connected
    	{
    		NoMic_Bit=0;
    	}
     
    switch(type_volume) { 
    case 0: 
     
               if (moyenne > seuil_haut)
             {	
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 25\n");
             }
     
    		  if (moyenne < seuil_bas)
             {	
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 20\n");
             }
     
      break; 
    case 1: 
     
               if (moyenne > seuil_haut)
             {	
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 29\n");
             }
     
    		  if (moyenne < seuil_bas)
             {	
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 26\n");
             }
     
      break; 
     
    case 2: 
     
               if (moyenne > seuil_haut)
             {	
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 33\n");
             }
     
    		  if (moyenne < seuil_bas)
             {	
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 30\n");
             }
     
      break; 
    case 3: 
      //copier coller le code existant ici // volume adapté au volume ambiant 
     
     
        if (( moyenne >= 0)&&(moyenne < 7))
    	{
    	  	TEA6320_write_byte(0x00,0x20);    // Volume/Loudness
     
    	}
    	if (( moyenne >= 7)&&(moyenne <11))
    	{
    		TEA6320_write_byte(0x00,0x22);    // Volume/Loudness
    		printf("Volumecag= 22\n");
     
    	}
    	if (( moyenne >= 11)&&(moyenne < 45))
    	{
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 25\n");
     
    	}
    	if (( moyenne >= 45)&&(moyenne < 101))
    	{
    		TEA6320_write_byte(0x00,0x27);    // Volume/Loudness
     
    	}
    	if (( moyenne >= 101)&&(moyenne < 246))
    	{
    		TEA6320_write_byte(0x00,0x29);    // Volume/Loudness
    		printf("Volumecag= 29\n");
     
    	}
    	if (( moyenne >=246)&&(moyenne < 445))
    	{
    		TEA6320_write_byte(0x00,0x2B);    // Volume/Loudness
    		printf("Volumecag= 2B\n");
     
    	}
    	if (( moyenne >= 445)&&(moyenne < 596))
    	{
    		TEA6320_write_byte(0x00,0x2E);    // Volume/Loudness
    		printf("Volumecag= 2E\n");
     
    	}
    	if (( moyenne >= 596)&&(moyenne < 770))
    	{
    		TEA6320_write_byte(0x00,0x30);    // Volume/Loudness
    		printf("Volumecag= 30\n");
     
    	}
    	if ( moyenne >= 770)
    	{
    		TEA6320_write_byte(0x00,0x33);    // Volume/Loudness
    		printf("Volumecag= 33\n");
     
    	}
      break; 
     default: printf("Une erreur dans le switchcase \n");
     
    } 
     
     
    	if ((P1_5 == 0)&& (cond3 == 0))		// SW2 -> MANUAL MODE: first way
    	{
     
    //#ifdef DEBUG_ME   //testali0304  //0505
    		printf("MANUAL MODE\n");
    		printf("Menu: press ?\n");
    //#endif            //testali0304  //0505
     
    		cond3 = 1;
    	}
    	if ((P1_5 == 0) && (RI==0))			// SW2 -> MANUAL MODE: normal program cycle  
    	{
    //#ifdef DEBUG_ME   //testali0304   //0505
    		printf("MANUAL MODE...");
    		printf(" ADC value = %d",moyenne);
    		printf(" volume = %Xh\n",volume);         //0605
     
     
    //#endif            //testali0304  //0505
    	}
     
    	if ((P1_5 == 0) && (Menu_Flag==0) && (RI==1)) // SW2 -> MANUAL MODE if key detected
    	{
    	   if (typeutil==1)
    	   volume_PA();
    	   else
    	   volume_PAbis();
    	}
    	if (P1_5 == 1)		// SW2 -> AUTOMATIC MODE
    	{
     
    		printf("AUTO MODE: ");
    		printf("ADC value= %d ",moyenne);
    		printf(" ||  Volume= %X\n",VOL_TEA6320);
     
    	}
     
    }
    Dans cette fonction CAG, je ne sais pas si l'algorithme d'hysteresis que j'ai fait est bonne ?

    Pouvez voir si mon code est bon et me corriger? Merci

  6. #6
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Apres bonne analyse,
    j'ai fait le code de l'hysteresis du CAG et ça fonctionne bien mais je pense que le code doit etre ameliorer encore mais comment ?

    Deplus j'ai enfin la valeur pour la moyenne en dB mais c'est des resultats que je n'attendais pas comment dois je caster ou changer ma formule pour qu'il presente ça en dB réel ?

    mais variables sont donc :

    unsigned long moyenne2; //2405 CAG moyenne2 = a * log10(moyenne/b)+c;
    int a = 25;
    float b = 0.001;
    int c =-77;
    double result; //2805


    char env_choice; //0805
    char range_choice; //2805
    int seuil_bas; //2805
    int seuil_haut; //2805

    int ss; //2805
    unsigned char Val_lue; //2805
    extern void CF_operations7 (void); //2205 pour eliminer warning C206: missing function prototype



    J'ai de plus une capture d'ecran pour que vous voyez mieux ce qui se passe.



    code de configuration du CAG :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    // D : Change environnement's mode
    	if (STR_IN[31]==0x44)
    	{
          int varrepeat =0; 	  
            printf("*Environnement's mode*\n\r");
            printf("0: LOW LEVEL\n\r");
    		printf("1: HIGH LEVEL\n\r");
            printf("2: NORMAL LEVEL\n\r");
    		printf("3: DEFAULT AGC CONTROL LEVEL\n\r");
     
    	  printf(" Please select first your environnement's mode\n :");
     
             do {
    	      	env_choice=getchar();  
     
    	       	switch(env_choice) { 
    		case '0': 
    	        type_volume=0; 
    			varrepeat =1;
    		  break; 
    		case '1': 
    	        type_volume=1;
    			varrepeat =1;
    		  break; 
    		case '2': 
    	        type_volume=2;
    			varrepeat =1;
    		  break; 
    	   case '3': 
    	       type_volume=3;
    	       varrepeat =1;
    		 break; 
            default :
             printf("\n Please enter a correct number:");
     
        		}
    		}while (varrepeat==0);
     
     
    	if(env_choice!=3)
    	{
    	printf("\n The environnement's sound range is between 0 to 770 !\n :");  //2805
    	printf("Please now select your Hysteresis range\n :");
     
    	if(env_choice==0)
    	printf("\n For this level the default low limit is 80, the high limit is 200\n :");
     
    	else if(env_choice==1)
       	printf("\n For this level the default low limit 600, the high limit 770\n :");
     
    	if(env_choice==2)
    	printf("\n For this level the default low limit is 300, the high limit is 500\n");
     
        printf("Enter a low limit value : \n");
    	scanf("%i",&seuil_bas);
        printf("Enter a high limit value : \n");
        scanf("%i",&seuil_haut);
     
       }  
     	printf("\n-> Please press any key to exit\n");
     
    			for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
    		STR_IN[31]=getchar0();
     
    	  	printf("%c\n",STR_IN[31]);
     
    	}

    Code de contrôle du CAG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    //C : Check environnement's mode
       if (STR_IN[31]==0x43)
       {
     
    	switch(type_volume) { 
    	case 0: 
    	  printf("\n The type of volume is LOW LEVEL\n");
    	  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
    	  break; 
    	case 1: 
    	  printf("\n The type of volume is HIGH LEVEL\n");
    	  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
    	  break; 
    	case 2: 
    	  printf("\n The type of volume is NORMAL LEVEL\n");
    	  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
     
    	case 3: 
    	  printf("\n The default's type of volume is AGC LEVEL\n");
     
    	}
    		printf("\n-> Please press any key to exit\n");
     
    			for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
    		STR_IN[31]=getchar0();
    	  	printf("%c\n",STR_IN[31]);
     
     
       }

    Et enfin mon code CAG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
     
     
    void CAG (void)
    {   
        int valcag;  //2905
    	init_ADC();
    	Watch_Dog();
     
    	for (j=max_samples; j>0; j--)
    	{
    		samples[j] = samples[j-1];
       	}
     
    	ADCON = ADCON | 0x08;	//start A to D conversion
    	byte1 = ADDH<<2;
    	byte2 = ADDL;
    	samples[0] = byte1 + byte2;
        printf("samples[0] = %X\n", samples[0]) ; //1105 
    	moyenne = 0;
    	for (j=max_samples; j>0; j--)
    	{
    		moyenne = moyenne + samples[j];
            printf("samples[j] = %X\n", samples[j]) ; //1105   //2105 dis
     
    	}
    	moyenne = moyenne / max_samples;  //BON
     
        printf("VRAI moyenne sur echantillons de 10: %i\n", moyenne) ; //1105
     
        //printf("Math log:  %i\n", moyenne) ; //1105
        //   moyenne2 = a * log10(moyenne/b)+c; //2405
        //   printf("Moyenne en dB: %li\n", moyenne2) ; //1105  //2805 dis
     
         result = (double)a * log10(((double)moyenne/(double)b))+ (double)c ;
         printf("Moyenne en dB: %lf\n", result) ; //1105  //2805 
     
    	if ((moyenne==0)&&(P1_5 == 1)) 			// If AUTOMATIC MODE & ADC Average=0
    	{
    		CPT_NoMic++;
    	}
     
    	if ((CPT_NoMic==60)&&(NoMic_Bit==0)) 	// If ADC Average=0 during 60 seconds
    	{
     
            #ifdef DEBUG_ME   //testali0304
    		printf("No ambiance microphone\n");	// No Ambiance microphone => Volume = maximum
            #endif            //testali0304
    		CPT_NoMic=0;
    		NoMic_Bit=1;
     
    	}
     
    	if ((moyenne>0)&&(P1_5 == 1)) // If ADC Average<>0 => Ambiance microphone (re-)connected
    	{
    		NoMic_Bit=0;
    	}
     
    switch(type_volume) { 
    case 0: 
     
               if (moyenne > seuil_haut)
             {	
    		TEA6320_write_byte(0x00,0x26);    // Volume/Loudness
            valcag=0x26;
    		printf("Volumecag= %X\n",valcag);
             }
     
    		  if (moyenne < seuil_bas)
             {	
    		TEA6320_write_byte(0x00,0x20);    // Volume/Loudness
    		valcag=0x20;
    		printf("Volumecag= %X\n",valcag);
             }
     
    		  if (moyenne < seuil_haut && moyenne > seuil_bas)
             {	
     
    		printf("Volumecag= %X\n",valcag);
             }
     
     
      break; 
    case 1: 
     
               if (moyenne > seuil_haut)
             {	
    		TEA6320_write_byte(0x00,0x2C);    // Volume/Loudness
            valcag=0x2C;
    		printf("Volumecag= %X\n",valcag);
             }
     
    		  if (moyenne < seuil_bas)
             {	
    		TEA6320_write_byte(0x00,0x26);    // Volume/Loudness
            valcag=0x26;
    		printf("Volumecag= %X\n",valcag);
             }
     
     
    		  if (moyenne < seuil_haut && moyenne > seuil_bas)
             {	
     
    		printf("Volumecag= %X\n",valcag);
             }
     
      break; 
     
    case 2: 
     
               if (moyenne > seuil_haut)
             {	
    		TEA6320_write_byte(0x00,0x33);    // Volume/Loudness
            valcag=0x33;
    		printf("Volumecag= %X\n",valcag);
             }
     
    		  if (moyenne < seuil_bas)
             {	
    		TEA6320_write_byte(0x00,0x2C);    // Volume/Loudness
            valcag=0x2C;
    		printf("Volumecag= %X\n",valcag);
             }
     
     
    		  if (moyenne < seuil_haut && moyenne > seuil_bas)
             {	
     
    		printf("Volumecag= %X\n",valcag);
             }
     
      break; 
    case 3: 
      //copier coller le code existant ici // volume adapté au volume ambiant 
     
     
        if (( moyenne >= 0)&&(moyenne < 7))
    	{
    	  	TEA6320_write_byte(0x00,0x20);    // Volume/Loudness
    		printf("Volumecag= 20\n");
     
    	}
    	if (( moyenne >= 7)&&(moyenne <11))
    	{
    		TEA6320_write_byte(0x00,0x22);    // Volume/Loudness
    		printf("Volumecag= 22\n");
     
    	}
    	if (( moyenne >= 11)&&(moyenne < 45))
    	{
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 25\n");
     
    	}
    	if (( moyenne >= 45)&&(moyenne < 101))
    	{
    		TEA6320_write_byte(0x00,0x27);    // Volume/Loudness
    		printf("Volumecag= 27\n");
     
    	}
    	if (( moyenne >= 101)&&(moyenne < 246))
    	{
    		TEA6320_write_byte(0x00,0x29);    // Volume/Loudness
    		printf("Volumecag= 29\n");
     
    	}
    	if (( moyenne >=246)&&(moyenne < 445))
    	{
    		TEA6320_write_byte(0x00,0x2B);    // Volume/Loudness
    		printf("Volumecag= 2B\n");
     
    	}
    	if (( moyenne >= 445)&&(moyenne < 596))
    	{
    		TEA6320_write_byte(0x00,0x2E);    // Volume/Loudness
    		printf("Volumecag= 2E\n");
     
    	}
    	if (( moyenne >= 596)&&(moyenne < 770))
    	{
    		TEA6320_write_byte(0x00,0x30);    // Volume/Loudness
    		printf("Volumecag= 30\n");
     
    	}
    	if ( moyenne >= 770)
    	{
    		TEA6320_write_byte(0x00,0x33);    // Volume/Loudness
    		printf("Volumecag= 33\n");
     
    	}
      break; 
     default: printf("Une erreur dans le switchcase \n");
     
    } 
     
     
    	if ((P1_5 == 0)&& (cond3 == 0))		// SW2 -> MANUAL MODE: first way
    	{
     
    		printf("MANUAL MODE\n");
    		printf("Menu: press ?\n");
     
     
    		cond3 = 1;
     
    	}
    	if ((P1_5 == 0) && (RI==0))			// SW2 -> MANUAL MODE: normal program cycle  
    	{
     
    		printf("MANUAL MODE...");
    		printf(" ADC value = %d",moyenne);
    		printf(" volume = %Xh\n",volume);         //0605
     
    	}
     
    	if ((P1_5 == 0) && (Menu_Flag==0) && (RI==1)) // SW2 -> MANUAL MODE if key detected
    	{
     
    	   if (typeutil==1)
    	   volume_PA();
    	   else
    	   volume_PAbis();
    	}
    	if (P1_5 == 1)		// SW2 -> AUTOMATIC MODE
    	{
     
    		printf("AUTO MODE: ");
    		printf("ADC value= %d ",moyenne);
    		printf(" ||  Volume= %X\n",VOL_TEA6320);
     
    	}
     
     
     
     
    }

    Enfin la capture


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
     
    samples[j] = 63
    VRAI moyenne sur echantillons de 10: 295
    Moyenne en dB: 59745550
    Volumecag= 2C
    MANUAL MODE... ADC value = 295 volume = 23h
    samples[0] = 3FF
    samples[j] = FF
    samples[j] = 23F
    samples[j] = 10
    samples[j] = 0
    samples[j] = 303
    samples[j] = 10
    samples[j] = 0
    samples[j] = 300
    samples[j] = 63
    samples[j] = 3FF
    VRAI moyenne sur echantillons de 10: 352
    Moyenne en dB: 61663560
    Volumecag= 2C
    MANUAL MODE... ADC value = 352 volume = 23h
    samples[0] = 32
    samples[j] = 23F
    samples[j] = 10
    samples[j] = 0
    samples[j] = 303
    samples[j] = 10
    samples[j] = 0
    samples[j] = 300
    samples[j] = 63
    samples[j] = 3FF
    samples[j] = 3FF
    VRAI moyenne sur echantillons de 10: 429
    Moyenne en dB: 63811450
    Volumecag= 2C
    MANUAL MODE... ADC value = 429 volume = 23h
    samples[0] = 1
    samples[j] = 10
    samples[j] = 0
    samples[j] = 303
    samples[j] = 10
    samples[j] = 0
    samples[j] = 300
    samples[j] = 63
    samples[j] = 3FF
    samples[j] = 3FF
    samples[j] = 32
    VRAI moyenne sur echantillons de 10: 376
    Moyenne en dB: 62379700
    Volumecag= 2C
    MANUAL MODE... ADC value = 376 volume = 23h
    samples[0] = 38F
    samples[j] = 0
    samples[j] = 303
    samples[j] = 10
    samples[j] = 0
    samples[j] = 300
    samples[j] = 63
    samples[j] = 3FF
    samples[j] = 3FF
    samples[j] = 32
    samples[j] = 1
    VRAI moyenne sur echantillons de 10: 375
    Moyenne en dB: 62350780
    Volumecag= 2C
    MANUAL MODE... ADC value = 375 volume = 23h
    samples[0] = 7F
    samples[j] = 303
    samples[j] = 10
    samples[j] = 0
    samples[j] = 300
    samples[j] = 63
    samples[j] = 3FF
    samples[j] = 3FF
    samples[j] = 32
    samples[j] = 1
    samples[j] = 38F
    VRAI moyenne sur echantillons de 10: 466
    Moyenne en dB: 64709650
    Volumecag= 2C
    MANUAL MODE... ADC value = 466 volume = 23h
    samples[0] = 3FD
    samples[j] = 10
    samples[j] = 0
    samples[j] = 300
    samples[j] = 63
    samples[j] = 3FF
    samples[j] = 3FF
    samples[j] = 32
    samples[j] = 1
    samples[j] = 38F
    samples[j] = 7F
    VRAI moyenne sur echantillons de 10: 401
    Moyenne en dB: 63078600
    Volumecag= 2C
    MANUAL MODE... ADC value = 401 volume = 23h
    samples[0] = 1F
    samples[j] = 0
    samples[j] = 300
    samples[j] = 63
    samples[j] = 3FF
    samples[j] = 3FF
    samples[j] = 32
    samples[j] = 1
    samples[j] = 38F
    samples[j] = 7F
    samples[j] = 3FD
    VRAI moyenne sur echantillons de 10: 502
    Moyenne en dB: 65517610
    Volumecag= 33
    MANUAL MODE... ADC value = 502 volume = 23h
    samples[0] = 3FF
    samples[j] = 300
    samples[j] = 63
    samples[j] = 3FF
    samples[j] = 3FF
    samples[j] = 32
    samples[j] = 1
    samples[j] = 38F
    samples[j] = 7F
    samples[j] = 3FD
    samples[j] = 1F
    VRAI moyenne sur echantillons de 10: 505
    Moyenne en dB: 65582290
    Volumecag= 33
    MANUAL MODE... ADC value = 505 volume = 23h
    samples[0] = 4
    samples[j] = 63
    samples[j] = 3FF
    samples[j] = 3FF
    samples[j] = 32
    samples[j] = 1
    samples[j] = 38F
    samples[j] = 7F
    samples[j] = 3FD
    samples[j] = 1F
    samples[j] = 3FF
    VRAI moyenne sur echantillons de 10: 530
    Moyenne en dB: 66106900
    Volumecag= 33
    MANUAL MODE... ADC value = 530 volume = 23h
    samples[0] = 3
    samples[j] = 3FF
    samples[j] = 3FF
    samples[j] = 32
    samples[j] = 1
    samples[j] = 38F
    samples[j] = 7F
    samples[j] = 3FD
    samples[j] = 1F
    samples[j] = 3FF
    samples[j] = 4
    VRAI moyenne sur echantillons de 10: 521
    Moyenne en dB: 65920940
    Volumecag= 33
    MANUAL MODE... ADC value = 521 volume = 23h
    samples[0] = 21D
    samples[j] = 3FF
    samples[j] = 32
    samples[j] = 1
    samples[j] = 38F
    samples[j] = 7F
    samples[j] = 3FD
    samples[j] = 1F
    samples[j] = 3FF
    samples[j] = 4
    samples[j] = 3
    VRAI moyenne sur echantillons de 10: 419
    Moyenne en dB: 63555360
    Volumecag= 33
    MANUAL MODE... ADC value = 419 volume = 23h
    samples[0] = 39
    samples[j] = 32
    samples[j] = 1
    samples[j] = 38F
    samples[j] = 7F
    samples[j] = 3FD
    samples[j] = 1F
    samples[j] = 3FF
    samples[j] = 4
    samples[j] = 3
    samples[j] = 21D
    VRAI moyenne sur echantillons de 10: 371
    Moyenne en dB: 62234360
    Volumecag= 33
    MANUAL MODE... ADC value = 371 volume = 23h
    samples[0] = 3
    samples[j] = 1
    samples[j] = 38F
    samples[j] = 7F
    samples[j] = 3FD
    samples[j] = 1F
    samples[j] = 3FF
    samples[j] = 4
    samples[j] = 3
    samples[j] = 21D
    samples[j] = 39
    VRAI moyenne sur echantillons de 10: 371
    Moyenne en dB: 62234360
    Volumecag= 33
    MANUAL MODE... ADC value = 371 volume = 23h
    samples[0] = 0
    samples[j] = 38F
    samples[j] = 7F
    samples[j] = 3FD
    samples[j] = 1F
    samples[j] = 3FF
    samples[j] = 4
    samples[j] = 3
    samples[j] = 21D
    samples[j] = 39
    samples[j] = 3
    VRAI moyenne sur echantillons de 10: 372
    Moyenne en dB: 62263570
    Volumecag= 33
    MANUAL MODE... ADC value = 372 volume = 23h
    samples[0] = 0
    samples[j] = 7F
    samples[j] = 3FD
    samples[j] = 1F
    samples[j] = 3FF
    samples[j] = 4
    samples[j] = 3
    samples[j] = 21D
    samples[j] = 39
    samples[j] = 3
    samples[j] = 0
    VRAI moyenne sur echantillons de 10: 281
    Moyenne en dB: 59217670
    Volumecag= 2C
    MANUAL MODE... ADC value = 281 volume = 23h
    samples[0] = 0
    samples[j] = 3FD
    samples[j] = 1F
    samples[j] = 3FF
    samples[j] = 4
    samples[j] = 3
    samples[j] = 21D
    samples[j] = 39
    samples[j] = 3
    samples[j] = 0
    samples[j] = 0
    VRAI moyenne sur echantillons de 10: 268
    Moyenne en dB: 58703370
    Volumecag= 2C
    MANUAL MODE... ADC value = 268 volume = 23h
    samples[0] = 0
    samples[j] = 1F
    samples[j] = 3FF
    samples[j] = 4
    samples[j] = 3
    samples[j] = 21D
    samples[j] = 39
    samples[j] = 3
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    VRAI moyenne sur echantillons de 10: 166
    Moyenne en dB: 53502720
    Volumecag= 2C
    Le resultat de la formule pour l'expression en dB a partir de la formule logarithmique est ce qui s'affiche a droite de Moyenne en dB:
    Je ne vois pas comment resoudre ce probleme?


    Merci

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    primo ta boucle est fausse pour le calcul de la moyenne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	for (j=max_samples; j>0; j--)
    	{
    		samples[j] = samples[j-1];
       	}
    ..... 
    	for (j=max_samples; j>0; j--)
    	{
    		moyenne = moyenne + samples[j];
           printf("samples[j] = %X\n", samples[j]) ; //1105   //2105 dis
     
    	}
    	moyenne = moyenne / max_samples;  //BON
    la tu ne prends pas l'indice 0 (que tu as rempli) mais par contre tu prends l'indice max_samples, qui n'existe pas....

    donc ce devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	for (j=(max_samples-1); j>0; j--)
    	{
    		samples[j] = samples[j-1];
       	}
    .... 
    
    
    	for (j=(max_samples-1); j>=0; j--)	
            {
    		moyenne = moyenne + samples[j];
                    printf("samples[j] = %X\n", samples[j]) ; //1105   //2105 dis
    	}
    	moyenne = moyenne / max_samples;  //BON
    D'autre part tu fais toujours une division entière dans le calcul de la moyenne...

    Si tu veux la valeur arrondie à l'entier de la division, tu devrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	moyenne = (int) ( (double)moyenne / (double)max_samples) ;  //BON
    Enfin ton print devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        printf("Moyenne en dB: %f\n", result) ; //1105  //2805
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        printf("Moyenne en dB: %g\n", result) ; //1105  //2805

  8. #8
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Voila en fait max_samples est un define qui vaut 10.

    Ce code permet simplement d'avoir des samples en continu, c'est une sorte d'initialisation, ça met la derniere valeur d'echantillon dans le tableau samples et la moyenne se calculera avec l'ensembles des valeurs deja stockées dans samples et ça toutes les secondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	for (j=max_samples; j>0; j--)
    	{
    		samples[j] = samples[j-1];
       	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	for (j=max_samples; j>0; j--)
    	{
    		moyenne = moyenne + samples[j];
           printf("samples[j] = %X\n", samples[j]) ; //1105   //2105 dis
     
    	}
    	moyenne = moyenne / max_samples;  //BON
    Ok j'ai mis comme tu m'as dit
    printf("Moyenne en dB: %f\n", result) ; //1105 //2805

    Et ça fonctionne bien et ce que je remplace ou pas ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    moyenne = moyenne / max_samples;  //BON
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     
     moyenne = (int) ( (double)moyenne / (double)max_samples) ;  //BON

    Ma capture donne :

    [/CODE]
    VRAI moyenne sur echantillons de 10: 89
    Valeur de a (en prcent i): 25
    Valeur de b (en prcent f): 0.001000
    Valeur de c (en prcent i): -77
    Valeur de moyenne (en prcent ui): 89i
    Valeur de result (en prcent lf): 46734760
    Valeur de temp (en prcent lf): 32259590
    Moyenne en dB: 46.7348
    Valeur de moyenne (apres moyenne =moyenne/b: 23463i
    Valeur de temp (apres temp = log10(moyenne): 4370384
    Valeur de temp (apres temp = a*temp+c: 32259590
    Volumecag= 2C
    MANUAL MODE... ADC value = 23463 volume = 23h
    samples[0] = 7C
    samples[j] = 33
    samples[j] = 7E
    samples[j] = 7F
    samples[j] = 7F
    samples[j] = 7
    samples[j] = 7
    samples[j] = 50
    samples[j] = 60
    samples[j] = C3
    samples[j] = 7F
    VRAI moyenne sur echantillons de 10: 94
    Valeur de a (en prcent i): 25
    Valeur de b (en prcent f): 0.001000
    Valeur de c (en prcent i): -77
    Valeur de moyenne (en prcent ui): 94i
    Valeur de result (en prcent lf): 46734760
    Valeur de temp (en prcent lf): 32259590
    Moyenne en dB: 47.3282
    Valeur de moyenne (apres moyenne =moyenne/b: 28463i
    Valeur de temp (apres temp = log10(moyenne): 4454281
    Valeur de temp (apres temp = a*temp+c: 34357030
    Volumecag= 2C
    MANUAL MODE... ADC value = 28463 volume = 23h
    samples[0] = 63
    samples[j] = 7E
    samples[j] = 7F
    samples[j] = 7F
    samples[j] = 7
    samples[j] = 7
    samples[j] = 50
    samples[j] = 60
    samples[j] = C3
    samples[j] = 7F
    samples[j] = 7C
    VRAI moyenne sur echantillons de 10: 101
    Valeur de a (en prcent i): 25
    Valeur de b (en prcent f): 0.001000
    Valeur de c (en prcent i): -77
    Valeur de moyenne (en prcent ui): 101i
    Valeur de result (en prcent lf): 47328200
    Valeur de temp (en prcent lf): 34357030
    Moyenne en dB: 48.108
    Valeur de moyenne (apres moyenne =moyenne/b: 35463i
    Valeur de temp (apres temp = log10(moyenne): 4549776
    Valeur de temp (apres temp = a*temp+c: 36744400
    Volumecag= 2C
    MANUAL MODE... ADC value = -30073 volume = 23h
    samples[0] = 3C
    samples[j] = 7F
    samples[j] = 7F
    samples[j] = 7
    samples[j] = 7
    samples[j] = 50
    samples[j] = 60
    samples[j] = C3
    samples[j] = 7F
    samples[j] = 7C
    samples[j] = 63

    [/CODE]

    Je pense que là c'est ok ?

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Aliveli
    Voila en fait max_samples est un define qui vaut 10.

    Ce code permet simplement d'avoir des samples en continu, c'est une sorte d'initialisation, ça met la derniere valeur d'echantillon dans le tableau samples et la moyenne se calculera avec l'ensembles des valeurs deja stockées dans samples et ça toutes les secondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	for (j=max_samples; j>0; j--)
    	{
    		samples[j] = samples[j-1];
       	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	for (j=max_samples; j>0; j--)
    	{
    		moyenne = moyenne + samples[j];
           printf("samples[j] = %X\n", samples[j]) ; //1105   //2105 dis
     
    	}
    	moyenne = moyenne / max_samples;  //BON

    ET ???????

    Est-ce que tu as remplacé ce que je t'ai dit dans les boucles ci-dessus (car là c'est pas remplacé...) ???????


    A moins que tu aies dimensionné samples à (max_samples+1), mais si comme je le pense ton tableau samples est dimensionné à max_samples, alors l'indice j= max_sample N'EXISTE PAS.......

    Donc tes boucles doivent commencer à (max_samples-1)..........

    En C les tableaux (et donc les boucles) commencent à zéro et finnissent à (nombre-1)... (contrairement au Fortran où c'est de 1 à N).

    Donc, en admettant (ce que je trouve un peu osé pour une moyenne temporelle) que tu ne veuilles pas prendre en compte la dernière valeur mesurée (que tu mets à l'indice 0), tes boucles doivent être ce que j'ai mis dans mon post précédent.... (éventuellement dans le calcul de la moyenne que tu t'arrêtes à 1 (>0), mais je pense que ce que tu veux c'est comme j'avais marqué >= 0, en tenant compte de la dernière mesure que tu mets à l'indice 0....)

Discussions similaires

  1. prob de controle par VB6 de données Excel avec lien internet
    Par chris_kil dans le forum VB 6 et antérieur
    Réponses: 25
    Dernier message: 17/08/2007, 13h34
  2. Réponses: 1
    Dernier message: 13/12/2006, 09h04
  3. control d'un champ de text avec java
    Par dalio2579 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 27/04/2006, 12h02
  4. Supprimer un controle automatique
    Par karimfl dans le forum MFC
    Réponses: 1
    Dernier message: 18/04/2006, 21h36
  5. Un edit control en lecture seule mais pas avec un fond gris?
    Par Magus (Dave) dans le forum Windows
    Réponses: 2
    Dernier message: 04/12/2005, 21h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo