Definiciones iniciales
p = cos ɸ
q = sin ɸ
ck = cos(k · ɸ)
sk = sin(k · ɸ)
r = coeficiente de filtrado
fo = frecuencia de corte
fs = frecuencia de muestreo
Filtro pasa banda
ck+1 = r · (p · ck - q · sk) + ul
sk+1 = r · (q · ck + p · sk)
Estas ecuaciones describen un filtro pasa banda recursivo. Los términos ck y sk representan las componentes coseno y seno de la señal filtrada, respectivamente. El coeficiente r controla el ancho de banda del filtro.
float p, q, ck, sk, r;
float ul;
void setup() {
p = cos(0.5);
q = sin(0.5);
ck = 0.0;
sk = 0.0;
r = 0.9;
ul = 0.0;
}
void loop() {
float ck_nuevo = r * (p * ck - q * sk) + ul;
float sk_nuevo = r * (q * ck + p * sk);
ck = ck_nuevo;
sk = sk_nuevo;
}
b1=-r^2 b2=2·r·cos(2·π·fo/fs)
#include <Arduino.h>
float r = 0.9;
float fo = 1000.0;
float fs = 10000.0;
float b1, b2;
void setup() {
float pi = 3.14159265358979323846;
float omega = 2.0 * pi * fo / fs;
b1 = -r * r;
b2 = 2.0 * r * cos(omega);
}
void loop() {
float muestraEntrada = analogRead(A0) * 5.0 / 1023.0;
float muestraFiltrada = b1 * muestraEntrada + b2 * muestraEntrada;
}
Filtro pasa banda senoidal cosenoidal
ck2 = b1 · ck1 + b2 · ck + uk
Donde:
b1 = -r^2
b2 = 2 · r · cos(2 · π · fo / fs)
Esta es una implementación específica de un filtro pasa banda, donde fo es la frecuencia central del filtro y fs es la frecuencia de muestreo. El término uk representa la entrada del filtro.
#include <Arduino.h>
float b1, b2;
float ck1, ck, uk;
void setup() {
b1 = -0.81;
b2 = 0.9;
ck1 = 0.0;
ck = 0.0;
uk = 0.0;
}
void loop() {
float ck2 = b1 * ck1 + b2 * ck + uk;
ck1 = ck;
ck = ck2;
}
Eco simple
yk = sk + a · skm
Donde sk es el sonido original y skm es la señal retardada atenuada por el factor a. Esta ecuación simula un eco simple.#include <Arduino.h>
float a = 0.5;
float skm = 0.0;
void setup() {
}
void loop() {
float sk = analogRead(A0) * 5.0 / 1023.0;
float yk = sk + a * skm;
skm = yk;
}
Eco múltiple
yk = sk + a · skL + b · skm
Esta es una extensión del eco simple, añadiendo un segundo término de eco con diferente retardo (L) y atenuación (b).#include <Arduino.h>
float a = 0.5;
float b = 0.3;
float kL = 0.0;
float skm = 0.0;
void setup() {
}
void loop() {
float sk = analogRead(A0) * 5.0 / 1023.0;
float yk = sk + a * kL + b * skm;
kL = yk;
skm = sk;
}
Filtro FIR (Respuesta Impulsiva Finita)
yk = a0 · xk + a1 · xk-1 + a2 · xk-2 + ...
O en notación de suma:
y(n) = Σ a(k) · x(n - k)
Estas ecuaciones describen un filtro FIR, donde la salida y(n) es una combinación lineal de las entradas actuales y pasadas x(n-k), ponderadas por los coeficientes a(k).#include <Arduino.h>
float a0, a1, a2;
float xk1, xk2;
void setup() {
}
void loop() {
float xk = analogRead(A0) * 5.0 / 1023.0;
float yk = a0 * xk + a1 * xk1 + a2 * xk2;
xk2 = xk1;
xk1 = xk;
}
#include <Arduino.h>
const int LEN = 10;
float a[LEN] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
float x[LEN];
float y = 0.0;
void setup() {
for (int i = 0; i < LEN; i++) {
x[i] = analogRead(A0) * 5.0 / 1023.0;
}
}
void loop() {
y = 0.0;
for (int i = 0; i < LEN; i++) {
y += a[i] * x[i];
}
for (int i = LEN - 1; i > 0; i--) {
x[i] = x[i - 1];
}
x[0] = analogRead(A0) * 5.0 / 1023.0;
}
Filtro IIR (Respuesta Impulsiva Infinita)
y(n) = Σ a(k) · x(n - k) + Σ b(k) · y(n - k)
Esta ecuación describe un filtro IIR, que incluye tanto las entradas pasadas x(n-k) como las salidas pasadas y(n-k) en el cálculo de la salida actual. Los coeficientes a(k) y b(k) determinan las características del filtro.
Estas fórmulas representan diferentes tipos de filtros y efectos comúnmente utilizados en DSP. Cada una tiene sus propias características y aplicaciones específicas en el procesamiento de señales de audio y otros tipos de señales digitales.#include <Arduino.h>
const int LEN = 10;
float a[LEN] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
float b[LEN] = {0.5, 0.4, 0.3, 0.2, 0.1, 0.0, -0.1, -0.2, -0.3, -0.4};
float y[LEN];
void setup() {
for (int i = 0; i < LEN; i++) {
y[i] = 0.0;
}
}
void loop() {
float x = analogRead(A0) * 5.0 / 1023.0;
float yn = 0.0;
for (int k = 0; k < LEN; k++) {
yn += a[k] * x * pow(0.5, k) + b[k] * y[k];
}
for (int i = LEN - 1; i > 0; i--) {
y[i] = y[i - 1];
}
y[0] = yn;
}