domdealm

Untitled

Dec 15th, 2020
646
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <TimerOne.h>
  2. #define M 15
  3. //Coeficientes do filtro obtidos por MATLAB
  4. float coef[15] {0,   0.0053,  -0.0000,  -0.0000,  -0.0000,  -0.2584,   0.0000,   0.5000, 0.0000,  -0.2584,  -0.0000,  -0.0000,  -0.0000,   0.0053,  0};
  5. float y[M];
  6. float val = 0;//variáveis auxiliares da amostragem
  7. int count = 0;
  8. int mic = A1; //pino do microfone
  9.  
  10. //Definindo o struct da fila:
  11. typedef struct fila{
  12.   float sample[M];
  13.   int fim;
  14. }fila;
  15.  
  16. //Função que inicializa a fila:
  17. void fbegin(fila *f){
  18.   for(int i = 0; i<M; i++){
  19.     f->sample[i] = 0;
  20.   }
  21.   f->fim=0;
  22. }
  23.  
  24. //Função que adiciona dados à fila:
  25. void fadd(float dado, fila *f){
  26.   if(f->fim == M){
  27.     Serial.println("FILA CHEIA\n");
  28.     return;
  29.   } else{
  30.     f->sample[f->fim] = dado;
  31.     f->fim++;
  32.   }
  33. }
  34.  
  35. //Função que limpa a fila:
  36. float fpurge(fila *f){
  37.   float dado;
  38.   int i;
  39.   if(f->fim == 0){
  40.     Serial.println("FILA VAZIA\n");
  41.     return;
  42.   } else{
  43.     dado = f->sample[0];
  44.     for(i = 0; i < f->fim; i++){
  45.       f->sample[i] = f->sample[i+1];
  46.     }
  47.     f->fim--;
  48.     return dado;
  49.   }
  50. }
  51.  
  52. //Função que realiza a convolução entre a amostra e o filtro
  53. void fdisp(fila *f){
  54.   float filtrado = 0;
  55.   for(int i = 0; i < f->fim; i++){
  56.     y[i] = coef[i]*f->sample[i];
  57.     filtrado += y[i];
  58.   }
  59.   Serial.println(filtrado);
  60. }
  61.  
  62. fila FIR; // criando a fila FIR
  63.  
  64. void amostragem(void){
  65.   val = analogRead(mic);
  66.   if(count >= M){
  67.     fpurge(&FIR);
  68.     fadd(val, &FIR);
  69.     fdisp(&FIR);
  70.   }else{
  71.     fadd(val, &FIR);
  72.     count++;
  73.   }
  74. }
  75.  
  76. void setup() {
  77.   fbegin(&FIR);
  78.   Timer1.initialize(167);
  79.   Timer1.attachInterrupt(amostragem);
  80.   Serial.begin(115200);
  81. }
  82.  
  83. void loop() {
  84.   // put your main code here, to run repeatedly:
  85.  
  86. }
RAW Paste Data