El software de edición y procesamiento de gráficos y audio a menudo contiene funciones llamadas "Filtro de paso alto" y "Filtro de paso bajo". Exactamente, ¿qué hacen estos y cuáles son los algoritmos para implementarlos?¿Qué son los filtros High-Pass y Low-Pass?
Respuesta
Wikipedia:
Estos "alto", "bajo", y los términos "banda" se refieren a frecuencias. En paso alto, intenta eliminar las bajas frecuencias. En paso bajo, intenta eliminar alto. En el paso de banda, solo permite que se mantenga un rango de frecuencia continuo.
La elección de la frecuencia de corte depende de su aplicación. La codificación de estos filtros se puede hacer simulando circuitos RC o jugando con las transformadas de Fourier de sus datos basados en el tiempo. Vea los artículos de wikipedia para ejemplos de código.
En general, son circuitos eléctricos que tienden a pasar partes de las señales analógicas. El pase alto tiende a transmitir más de las partes de alta frecuencia y el paso bajo tiende a pasar más partes de baja frecuencia.
Se pueden simular en el software. Un promedio de caminata puede actuar como un filtro de paso bajo, por ejemplo, y la diferencia entre un promedio de caminata y su entrada puede funcionar como un filtro de paso alto.
-Paso alto filtro permite alta -Frecuencia (información detallada/local) pase. De paso bajo
filtro permite baja -Frecuencia (grueso/información aproximada/global) pase.
Aquí es cómo se implementa un filtro de paso bajo mediante convolución:
double[] signal = (some 1d signal);
double[] filter = [0.25 0.25 0.25 0.25]; // box-car filter
double[] result = new double[signal.Length + filter.Length + 1];
// Set result to zero:
for (int i=0; i < result.Length; i++) result[i] = 0;
// Do convolution:
for (int i=0; i < signal.Length; i++)
for (int j=0; j < filter.Length; j++)
result[i+j] = result[i+j] + signal[i] * filter[j];
Tenga en cuenta que el ejemplo está muy simplificado. No hace controles de rango y no maneja los bordes correctamente. El filtro utilizado (box-car) es un filtro de paso bajo particularmente malo, ya que causará muchos artefactos (zumbidos). Lea sobre el diseño del filtro.
También puede implementar los filtros en el dominio de la frecuencia. Aquí es cómo se implementa un filtro de paso alto utilizando FFT:
double[] signal = (some 1d signal);
// Do FFT:
double[] real;
double[] imag;
[real, imag] = fft(signal)
// Set the first quarter of the real part to zero to attenuate the low frequencies
for (int i=0; i < real.Length/4; i++)
real[i] = 0;
// Do inverse FFT:
double[] highfrequencysignal = inversefft(real, imag);
De nuevo, esto se simplifica, pero se entiende la idea. El código no parece tan complicado como el matemático.
El filtrado describe el acto de procesar datos de una manera que aplica diferentes niveles de atenuación a diferentes frecuencias dentro de los datos.
Un filtro de paso alto aplicará atenuación mínima (es decir, niveles de ausencia sin cambios) para altas frecuencias, pero aplica atenuación máxima a bajas frecuencias.
Un filtro de paso bajo es inverso: no aplicará atenuación a las bajas frecuencias aplicando atenuación a las frecuencias altas.
Hay una serie de algoritmos de filtrado diferentes que se utilizan. Los dos más simples son probablemente el filtro Finite Impulse Response (también conocido como filtro FIR) y el filtro Infinite Impulse Response (también conocido como filtro IIR).
El filtro FIR funciona manteniendo una serie de muestras y multiplicando cada una de esas muestras por un coeficiente fijo (que se basa en la posición de la serie). Los resultados de cada una de estas multiplicaciones se acumulan y es el resultado de esa muestra. Esto se conoce como Multiplicación-Acumulación, y en el hardware DSP dedicado hay una instrucción MAC específica para hacer esto.
Cuando se toma la siguiente muestra, se agrega al inicio de la serie y se elimina la muestra más antigua de la serie, y el proceso se repite.
El comportamiento del filtro se fija mediante la selección de los coeficientes del filtro.
Uno de los filtros más simples que suele proporcionar el software de procesamiento de imágenes es el filtro de promediado. Esto puede implementarse mediante un filtro FIR al establecer todos los coeficientes de filtro en el mismo valor.
Aquí es un súper simple ejemplo de un filtro de paso bajo en C++ que procesa la muestra de la señal a la vez:
float lopass(float input, float cutoff) {
lo_pass_output= outputs[0]+ (cutoff*(input-outputs[0]));
outputs[0]= lo_pass_output;
return(lo_pass_output);
}
Aquí es más o menos lo mismo, excepto que es de paso alto:
float hipass(float input, float cutoff) {
hi_pass_output=input-(outputs[0] + cutoff*(input-outputs[0]));
outputs[0]=hi_pass_output;
return(hi_pass_output);
}
Estoy probando que eres el código, pero no entiendo qué simboliza el "corte". No es la frecuencia de corte en Hertz ¿verdad? –
La respuesta tiene casi una década, sin embargo, sigo creyendo que no es el "resultado [0]" que debe tenerse en cuenta en los cálculos, sino el valor de muestra filtrado anterior. – Mike
Relacionados: https://dsp.stackexchange.com/questions/39063/simple-software-low-pass-filter –
- 1. ¿Qué son los filtros de intención exactamente?
- 2. ¿Qué son los filtros de intención en Android?
- 3. ¿Son posibles los filtros personalizados en NUnit?
- 4. ¿Cómo implementar un filtro LowPass?
- 5. ¿Qué son los archivos .sln y .vcproj, y qué contienen?
- 6. ¿Qué son los modificadores transitorios y volátiles? -
- 7. ¿Qué son los sombreadores Vertex y Pixel?
- 8. ¿Qué son los archivos .a y .so?
- 9. ¿Qué son los RFC?
- 10. Filtros de GlobalFilterCollection ejecutados antes de los filtros de ControllerInstanceFilterProvider
- 11. ¿Qué son los conceptos?
- 12. ¿Qué son los futuros?
- 13. ¿Qué son aserciones? y por qué los usarías?
- 14. ¿Qué son los Proxies WCF y para qué sirven?
- 15. ¿Por qué los EJB son seguros y los servlets no?
- 16. ¿Qué son los bytecodes y cómo los maneja JVM?
- 17. ¿Qué son los objetos anclados?
- 18. ¿Qué son los objetos diferidos?
- 19. ¿Qué son los operadores levantados?
- 20. ¿Qué son los archivos NDF?
- 21. ¿Qué son los zócalos Async?
- 22. ¿Qué son los archivos .S?
- 23. ¿Qué son los objetos inmutables?
- 24. Colección Backbone.js y filtros Tastypie
- 25. ¿Qué son los métodos virtuales?
- 26. ¿Qué son los índices hipotéticos?
- 27. ¿Qué son los idiomas ISO?
- 28. Cómo usar multifieldquery y filtros en Lucene.net
- 29. ¿Qué son los árboles de expresión, cómo los usa y por qué los usaría?
- 30. ¿Qué son los corchetes angulares para los valores de los argumentos y para qué se utilizan?
Muy bueno tener ejemplos de código. ¿Por qué convolución en un caso y FFT en el otro? – dfrankow
@dfrankow Ninguna razón en particular. Solo para mostrar cómo se ve en los diferentes dominios. Actualizado el texto para reflejar esto. Gracias. – Hallgrim
¿Estás seguro de que la primera parte de tu respuesta es correcta, donde aplicar convolución en el dominio del tiempo usando una función de rectángulo? Pensé que un filtro de paso bajo en el dominio del tiempo requería la convolución de una función sinc? – stackoverflowuser2010