
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í.
Lo estoy implementado en este circuito

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

Valora esta pregunta


0