Matlab - Implementación de filtros digitales

 
Vista:

Implementación de filtros digitales

Publicado por Felipe (1 intervención) el 10/10/2001 13:01:31
Hola amig@. Me encuentro realizando el proyecto fin de carrera y tengo la difificultad de implementar filtros digitales en C++ Builder. Tengo hecha la simulación en Matlab pero no se como traducir el código (la función butter(), por ejemplo)
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
Imágen de perfil de Alejandro

Implementación de filtros en C++ Builder

Publicado por Alejandro (145 intervenciones) el 05/10/2023 00:22:59
¡Hola, Felipe! Implementar filtros digitales en C++ Builder puede ser un paso desafiante, pero estoy aquí para ayudarte. Aunque la función `butter` en Matlab realiza un diseño de filtro Butterworth, en C++ Builder tendrás que realizar la implementación de filtros de manera más manual.

Primero, necesitas entender cómo funciona el filtro Butterworth y cómo se especifican sus parámetros (orden, frecuencia de corte, etc.). Luego, puedes utilizar técnicas de diseño de filtros digitales y aplicarlas en tu código C++ Builder.

Aquí tienes un ejemplo sencillo de cómo podrías implementar un filtro paso bajo Butterworth en C++:

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
#include <iostream>
#include <cmath>
 
class ButterworthFilter {
public:
    ButterworthFilter(int order, double cutoffFrequency, double samplingFrequency)
        : order(order), cutoffFrequency(cutoffFrequency), samplingFrequency(samplingFrequency) {
        // Calcular coeficientes del filtro Butterworth
        calculateCoefficients();
        // Inicializar estados del filtro
        reset();
    }
 
    double filter(double input) {
        // Actualizar estados
        for (int i = order - 1; i > 0; --i) {
            x[i] = x[i - 1];
            y[i] = y[i - 1];
        }
 
        // Calcular salida del filtro
        x[0] = input;
        y[0] = b[0] * x[0];
        for (int i = 1; i <= order; ++i) {
            y[0] += b[i] * x[i] - a[i] * y[i];
        }
 
        return y[0];
    }
 
    void reset() {
        // Inicializar estados a cero
        std::fill(std::begin(x), std::end(x), 0.0);
        std::fill(std::begin(y), std::end(y), 0.0);
    }
 
private:
    int order;
    double cutoffFrequency;
    double samplingFrequency;
    double b[3]; // Coeficientes de numerador
    double a[3]; // Coeficientes de denominador
    double x[3]; // Estados de la entrada
    double y[3]; // Estados de la salida
 
    void calculateCoefficients() {
        // Calcula los coeficientes del filtro Butterworth
        // (Este es un ejemplo, debes adaptarlo a tus necesidades específicas)
        double wc = 2 * M_PI * cutoffFrequency / samplingFrequency;
        double beta = 1.0 / (2.0 * std::tan(wc / 2.0));
 
        b[0] = beta * beta;
        b[1] = 2.0 * b[0];
        b[2] = b[0];
        a[0] = 1.0 + sqrt(2.0) * beta + beta * beta;
        a[1] = 2.0 * (beta * beta - 1.0);
        a[2] = 1.0 - sqrt(2.0) * beta + beta * beta;
 
        // Normaliza los coeficientes
        for (int i = 0; i <= order; ++i) {
            b[i] /= a[0];
            a[i] /= a[0];
        }
    }
};
 
int main() {
    // Ejemplo de uso del filtro Butterworth
    ButterworthFilter butterworthFilter(2, 100.0, 1000.0); // Filtro de segundo orden, frecuencia de corte de 100 Hz, frecuencia de muestreo de 1000 Hz
 
    // Simulación de señal de entrada
    for (double t = 0; t < 1.0; t += 0.01) {
        double inputSignal = sin(2 * M_PI * 50 * t); // Señal de entrada, por ejemplo, una onda sinusoidal de 50 Hz
        double filteredSignal = butterworthFilter.filter(inputSignal);
 
        // Aquí puedes hacer algo con la señal filtrada, como imprimir o almacenar en un archivo
        std::cout << t << "\t" << inputSignal << "\t" << filteredSignal << std::endl;
    }
 
    return 0;
}

Este es solo un ejemplo básico, y es posible que necesites ajustar los coeficientes del filtro y otros parámetros según tus especificaciones exactas. Recuerda que la implementación puede variar dependiendo de los detalles específicos de tu proyecto. ¡Espero que esto te ayude a empezar!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar