2008-08-30 39 views

Respuesta

18

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.

5

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.

5

-Paso alto filtro permite alta -Frecuencia (información detallada/local) pase. De paso bajo
filtro permite baja -Frecuencia (grueso/información aproximada/global) pase.

27

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.

+2

Muy bueno tener ejemplos de código. ¿Por qué convolución en un caso y FFT en el otro? – dfrankow

+2

@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

+0

¿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

5

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.

5

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); 
} 
+4

Estoy probando que eres el código, pero no entiendo qué simboliza el "corte". No es la frecuencia de corte en Hertz ¿verdad? –

+1

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

+0

Relacionados: https://dsp.stackexchange.com/questions/39063/simple-software-low-pass-filter –