Filtrado de mediana + simulación Matlab + análisis de respuesta en el dominio de la frecuencia

filtro mediano


El filtrado mediano es un algoritmo de filtrado cuyo propósito es eliminar el ruido de la señal sin causar demasiado impacto en la señal misma. Su principio es muy simple: para un tamaño de ventana dado, ordene los valores en la ventana y luego use el valor intermedio como salida.

La fórmula matemática del filtrado de la mediana es la siguiente:

y [ norte ] = mediana ⁡ ( x [ norte - k ] , ... , x [ norte ] , ... , x [ norte + k ] ) y[n]=\operatorname{mediana}(x[nk],\puntos, x[n],\puntos,x[n+k])y[n]=mediana ( x [ nk ] ,,x [ norte ] ,,x [ norte+k ])

donde xxx es la señal original,yyy es la señal filtrada,nnn es la posición actual,kkk es el tamaño de la ventana.

Comprender el proceso de filtrado de la mediana

Para comprender mejor el proceso de filtrado de la mediana, podemos usar una matriz simple. Supongamos que tenemos una matriz xx de longitud 7x , de la siguiente manera:

x = [1, 3, 2, 4, 6, 5, 7]

Ahora, queremos realizar un filtro mediano en esta matriz con un tamaño de ventana de 3. Primero, necesitamos mover la ventana al primer elemento de la matriz:

x = [1, 3, 2, 4, 6, 5, 7]
         ^  ^  ^
         |  |  |
         |  |  窗口最后一个元素
         |  窗口中间的元素
         窗口第一个元素

Luego, necesitamos ordenar los elementos en la ventana:

x = [1, 3, 2, 4, 6, 5, 7]
         ^  ^  ^
         |  |  |
         |  |  排序后的窗口最后一个元素
         |  排序后的窗口中间的元素
         排序后的窗口第一个元素

Después de ordenar, podemos usar la mediana de la ventana ordenada como salida. En este ejemplo, el valor medio es 3, por lo que la salida es 3.

A continuación, movemos la ventana un elemento a la derecha y repetimos el proceso hasta que se haya procesado toda la matriz.

x = [1, 3, 2, 4, 6, 5, 7]
         ^  ^  ^
         |  |  |
         |  |  2
         |  3,2,4
         1,2,3

Después de filtrar la mediana, el resultado es:

y = [1, 2, 3, 4, 5, 5, 7]

implementación de matlab

Aquí hay una implementación simple de Matlab usando medfilt1la función:

% 生成一个随机信号
x = [1, 3, 2, 4, 6, 5, 7];

% 中值滤波
y = medfilt1(x, 3);

En este ejemplo, generamos una matriz de longitud 7 y usamos medfilt1la función para filtrar la mediana de la matriz con un tamaño de ventana de 3.

La salida de y es [1, 2, 3, 4, 5, 5, 7].

aplicación práctica

El filtrado de mediana es ampliamente utilizado en el campo del procesamiento de señales, especialmente en el procesamiento de sonido e imagen. En el procesamiento de sonido, el filtrado mediano puede eliminar el ruido y los crujidos en las grabaciones. En el procesamiento de imágenes, el filtrado mediano puede eliminar el ruido de sal y pimienta y el ruido moteado en la imagen.

Ok, aquí hay un ejemplo de código de Matlab basado en una señal de audio virtual, que demuestra el efecto del filtrado mediano para eliminar el ruido y dibuja imágenes antes y después del procesamiento para comparar:

% 生成一个包含噪声的虚拟音频信号
Fs = 44100; % 采样频率
t = 0:1/Fs:5; % 时间范围
f1 = 1000; % 基频
f2 = 4000; % 频率偏移量
x = sin(2*pi*f1*t) + sin(2*pi*(f1+f2*t).*t) + 0.1*randn(size(t));

% 绘制原始音频信号的时域图和频谱图
subplot(2,2,1)
plot(t,x)
title('原始信号的时域图')
xlabel('时间 (s)')
ylabel('幅值')
subplot(2,2,2)
f = linspace(0,Fs,length(x));
X = fft(x);
plot(f,abs(X))
title('原始信号的频谱图')
xlabel('频率 (Hz)')
ylabel('幅值')

% 对音频信号进行中值滤波处理
win_size = 101;
y = medfilt1(x, win_size);

% 绘制处理后的音频信号的时域图和频谱图
subplot(2,2,3)
plot(t,y)
title('处理后的信号的时域图')
xlabel('时间 (s)')
ylabel('幅值')
subplot(2,2,4)
Y = fft(y);
plot(f,abs(Y))
title('处理后的信号的频谱图')
xlabel('频率 (Hz)')
ylabel('幅值')

imagen-20230311182139258

En este ejemplo, primero generamos una señal de audio virtual que contiene ruido y luego medfilt1le aplicamos un filtro mediano usando la función. A continuación, dibujamos el diagrama de dominio del tiempo y el espectrograma de la señal de audio original y la señal de audio procesada. Se puede ver que el ruido de la señal de audio procesada se reduce significativamente y la amplitud es más suave.

Análisis de dominio de frecuencia

Desde la perspectiva de las ecuaciones diferenciales, el filtro mediano se puede considerar como una ecuación diferencial y luego se puede analizar su respuesta de amplitud-frecuencia. Para un filtro mediano con un tamaño de ventana de 3, la ecuación de diferencia es:

y [ norte ] = mediana ⁡ ( x [ norte - 1 ] , x [ norte ] , x [ norte + 1 ] ) y[n] = \operatorname{mediana}(x[n-1],x[n], x[n+1])y[n]=mediana ( x [ n1 ] ,x [ norte ] ,x [ norte+1 ])

Esto se puede transformar en una ecuación en diferencias:

y [ norte ] = 1 2 x [ norte ] + 1 4 ( x [ norte - 1 ] + x [ norte + 1 ] ) y[n] = \frac{1}{2} x[n] + \frac{ 1}{4} (x[n-1] + x[n+1])y[n]=21x [ norte ]+41( x [ norte1 ]+x [ norte+1 ])

donde x [ n ] x[n]x [ n ] es la señal original,y [ n ] y[n]y [ n ] es la señal filtrada,nnn es la posición actual.

Al discretizar la ecuación en diferencias, se puede obtener su respuesta en el dominio de la frecuencia:

H ( ej ω ) = 1 2 + 1 4 ( mi − j ω + ej ω ) H(e^{j\omega}) = \frac{1}{2} + \frac{1}{4} (e ^{-j\omega} + e^{j\omega})H ( mi )=21+41( mi- +mi )

H (p. ej., ω) = 1 2 + 1 2 porque ⁡ ( ω ) H(e^{j\omega}) = \frac{1}{2} + \frac{1}{2}\cos(\omega)H ( mi )=21+21porque ( ω )

Por lo tanto, la respuesta magnitud-frecuencia del filtro mediano es:

∣ H ( ej ω ) ∣ = ( 1 2 + 1 2 porque ⁡ ( ω ) ) 2 |H(e^{j\omega})| = \sqrt{\left(\frac{1}{2} + \frac{1}{2} \cos(\omega)\right)^2}H ( mi )_=(21+21porque ( ω ) )2

∣ H ( ej ω ) ∣ = 1 2 + 1 2 porque ⁡ ( ω ) |H(e^{j\omega})| = \frac{1}{2} + \frac{1}{2}\cos(\omega)H ( mi )_=21+21porque ( ω )

A continuación, se muestra una implementación simple de Matlab que traza la curva de respuesta de magnitud-frecuencia para un filtro mediano con un tamaño de ventana de 3:

% 绘制窗口大小为 3 的中值滤波的幅频响应曲线
freq = linspace(0, pi, 1000);
H = 0.5 + 0.5*cos(freq);
plot(freq, H)
title('中值滤波的幅频响应')
xlabel('角频率 (rad)')
ylabel('幅值')

imagen-20230311182906248

En este ejemplo, usamos la función linspace para generar un vector de frecuencia que contiene 1000 puntos, luego usamos la fórmula de respuesta de frecuencia de magnitud del filtro mediano para calcular la magnitud de cada punto y usamos la función de gráfico para dibujar la respuesta de frecuencia de magnitud curva.

Supongo que te gusta

Origin blog.csdn.net/qq_34022877/article/details/129466984
Recomendado
Clasificación