#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;
}