Arduino - Ayuda a corregir el código de un filtro tipo FIR que se busca implementar en un Arduino Uno

 
Vista:
sin imagen de perfil

Ayuda a corregir el código de un filtro tipo FIR que se busca implementar en un Arduino Uno

Publicado por Alexis (1 intervención) el 23/05/2022 09:32:18
Hola, estoy buscando implementar un filtro tipo FIR con el microcontrolador del Arduino, pero ya no se como corregir el código que escribí.
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
#ifndef FIR_FILTER_H
#define FIR_FILTER_H
#include <stdint.h>
 
#define FIR_FILTER_LENGTH  11
 
typedef struct {
  float buf[FIR_FILTER_LENGTH];
  uint8_t bufIndex;
  float salida;
} FIRFilter;
 
 
void FIRfilter_Init(FIRFilter *fir);
float FIRFilter_Update(FIRFilter *fir, float inp);
#endif
 
 
static float FIR_IMPULSE_RESPONSE[FIR_FILTER_LENGTH] = {
  0,
  0.0119867988261638,
  0.0517201277787741,
  0.116370287502242,
  0.191788781218620,
  0.256268009348400,
  0.191788781218620,
  0.116370287502242,
  0.0517201277787741,
  0.0119867988261638,
  0
};
 
void FIRFilter_Init(FIRFilter *fir) {
 
  for (uint8_t n = 0; n < FIR_FILTER_LENGTH; n++) {
    fir->buf[n] = 0.0f;
  }
 
  fir->bufIndex = 0;
 
  fir->salida = 0.0f;
}
 
 
float FIRFilter_Update(FIRFilter *fir, float inp) {
 
  fir->buf[fir->bufIndex] = inp;
 
  fir->bufIndex++;
 
  if (fir->bufIndex == FIR_FILTER_LENGTH) {
  fir->bufIndex = 0;
  }
  fir->salida = 0.0f;
 
  uint8_t sumIndex = fir->bufIndex;
 
  for (uint8_t n = 0; n < FIR_FILTER_LENGTH; n++) {
    if (sumIndex > 0) {
      sumIndex--;
    }
    else {
      sumIndex = FIR_FILTER_LENGTH - 1;
    }
    fir->salida += FIR_IMPULSE_RESPONSE[n] * fir->buf[sumIndex];
  }
  return fir->salida;
}
 
 
 
 
void setup() {
  cli();
  pinMode(12, OUTPUT); //pin para determinar la frecuencia de muestreo
  DDRD = 0b11111111; // Habilitación del puesto D para
  void FIRfilter_Init(FIRFilter *fir);
  float FIRFilter_Update(FIRFilter *fir, float inp);
  void ADC_init();
 
  sei();
}
 
void loop() {
  FIRFilter muestra;
  FIRFilter_Init(&muestra);
  int prueba[10]=0;
  while (1) {
 
    prueba[0]= ADC_getData(0);
    digitalWrite(12, HIGH); //Comienzo del pulso que ayuda a plantear la frecuencia en la que se trabaja
    FIRFilter_Update(muestra,prueba[0]);
    digitalWrite(12, LOW);//Finalización del pulso que ayuda a medir la frecuencia de trabajo del proceso ejecutado
    delayMicroseconds(383);//Planteamiento del retraso para ayudar a que la señal se recinstruya de manera óptima
    PORTD = salida & 255; // Se manda la salida al puerto D para que se reconstruya a 8 bits mediante el puerto D
  }
}
 
 
 
void ADC_init(int canal) {
  ADMUX |= (1 << ADLAR);
 
  ADMUX |= (1 << REFS0 | 0 << REFS1);
 
  ADCSRA |= (1 << ADPS2 | 1 << ADPS1 | 1 << ADPS0);
}
 
void ADC_getData(int canal) {
  ADMUX &= (0b11110000);
  ADMUX |= (canal << MUX0);
 
  ADCSRA |= (1 << ADEN);
  delayMicroseconds(10);
 
  ADCSRA |= (1 << ADSC);
 
  while (!(ADCSRA & (1 << ADIF)));
  ADCSRA |= (1 << ADIF);
 
  ADCSRA &= ~(1 << ADEN);
 
  return ADC<<8;
 
}

Lo estoy implementado en este circuito
Filtro
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder