Reducción de Ruido en Series Temporales Unidimensionales Mediante la Combinación SVD-VMD en MATLAB

La eliminación de ruido de series temporales es una tarea crítica en diversas disciplinas, desde la ingeniería biomédica hasta el análisis de vibraciones. A menudo, la distinción entre señal y ruido puede ser ambigua, lo que dificulta la aplicación de métodos tradicionales. Este artículo presenta una metodología híbrida que combina la Descomposición en Valores Singulares (SVD) con la Descomposición Modal Variacional (VMD) para un filtrado de ruido robusto en señales unidimensionales, implementada en el entorno de MATLAB.

Fase 1: Filtrado Grueso con SVD

La SVD es una herramienta poderosa para descomponer una matriz en componentes ortogonales, permitiendo identificar y separar las estructuras de mayor energía (señal) de las de menor energía (ruido). Para aplicar SVD a una serie temporal unidimensional, primero es necesario transformarla en una matriz, generalmente una matriz de Hankel.

Inicialmente, se carga la señal ruidosa de interés. Consideremos un ejemplo con una señal similar a un electrocardiograma.


% Carga de datos de una señal ruidosa (ej. ECG)
datosSenal = load('senal_ecg_ruidosa.mat'); % Asumiendo que el archivo contiene 'data_signal_noisy'
senalRuidosa = datosSenal.data_signal_noisy; 
frecMuestreo = 250; % Frecuencia de muestreo en Hz
vectorTiempo = (0:length(senalRuidosa)-1) / frecMuestreo; 

El siguiente paso es construir la matriz de Hankel, que esencialmente "incrusta" la señal unidimensional en un espacio de mayor dimensión, revelando dependencias temporales y estructuras repetitivas que son clave para la SVD.


% Construcción de la matriz de Hankel
longVentana = floor(length(senalRuidosa) / 2); % Define la dimensión de la ventana
matrizHankel = hankel(senalRuidosa(1 : end - longVentana + 1), senalRuidosa(end - longVentana + 1 : end));

% Aplicación de la Descomposición en Valores Singulares (SVD)
[matrizU, matrizSigma, matrizV] = svd(matrizHankel, 'econ'); % SVD de tipo "económico"

Con la matriz de Hankel descompuesta, se procede a la fase de truncamiento. Los valores singulares más grandes corresponden a las componentes principales de la señal, mientras que los más pequeños suelen estar asociados con el ruido. Se utiliza un umbral basado en la energía acumulada para retener solo los componentes significativos.


% Selección de componentes principales basada en el umbral de energía
valoresSingulares = diag(matrizSigma);
energiaAcumulada = cumsum(valoresSingulares) / sum(valoresSingulares);
numComponentesPreservar = find(energiaAcumulada >= 0.95, 1); % Retener el 95% de la energía

% Reconstrucción de la matriz Hankel filtrada
matrizHankelFiltrada = matrizU(:, 1:numComponentesPreservar) * matrizSigma(1:numComponentesPreservar, 1:numComponentesPreservar) * matrizV(:, 1:numComponentesPreservar)';

Finalmente, la señal unidimensional se reconstruye a partir de la matriz de Hankel filtrada. Un método común es promediar los elementos a lo largo de las antidiagonales de la matriz reconstruida, lo que ayuda a suavizar los posibles artfeactos de la reconstrucción.


% Reconstrucción de la señal unidimensional a partir de la matriz de Hankel filtrada
senalSVD_denoised = zeros(size(senalRuidosa));
for k_idx = 1:length(senalRuidosa)
    % Calcular los índices para la reconstrucción por promedio de antidiagonales
    idxInicioColumna = max(1, k_idx - longVentana + 1);
    idxFinFila = min(k_idx, size(matrizHankelFiltrada, 1));
    
    % Extraer y promediar los elementos de la antidiagonal correspondiente
    elementosAntidiagonal = diag(matrizHankelFiltrada(idxInicioColumna:idxFinFila, :), k_idx - longVentana + 1);
    senalSVD_denoised(k_idx) = mean(elementosAntidiagonal);
end

Fase 2: Refinamiento con VMD

Después de la etapa de SVD, la señal debería estar significativamente más limpia, pero aún podría contener ruido residual o artefactos de alta frecuencia. La Descomposición Modal Variacional (VMD) es ideal para esta etapa, ya que descompone adaptativamente una señal en un conjunto de Modos Intrínsecos (IMFs), cada uno con un ancho de banda y frecuencia central específicos.

Se aplican parámetros VMD a la señal pre-filtrada por SVD. Es importante seleccionar un número apropiado de modos (numModosVMD) y ajustar los parámetros alfa_param (restricción de ancho de banda) y tau_param (tolerancia al ruido) según las características de la señal.


% Parámetros para la Descomposición Modal Variacional (VMD)
alfa_param = 2000; % Parámetro de restricción de ancho de banda (ej., para señales biológicas)
tau_param = 0.01;   % Tolerancia al ruido (ej., 0.01-0.1)
numModosVMD = 5;    % Número de Modos Intrínsecos a extraer

% Aplicación de VMD sobre la señal pre-filtrada por SVD
% Asegúrate de tener la toolbox de procesamiento de señales para 'vmd'
[modosIMFs, ~] = vmd(senalSVD_denoised, 'NumIMFs', numModosVMD, 'Alpha', alfa_param, 'Tau', tau_param, 'Fs', frecMuestreo);

Cada IMF resultante representa una componente con características de frecuencia específicas. Para la reconstruccción final de la señal denoised, se seleccionan los IMFs que corresponden a las componentes de la señal y se descartan aquellos que principalmente contienen ruido de alta frecuencia.


% Análisis espectral y selección de IMFs relevantes
imfsSeleccionadas = [];
frecCorteRuido = 45; % Frecuencia umbral para filtrar IMFs de ruido (ej., 45 Hz para ECG)

for i = 1:size(modosIMFs, 1)
    % Cálculo del espectro de potencia de cada IMF
    [psd_imf, freqs_imf] = pwelch(modosIMFs(i, :), [], [], [], frecMuestreo);
    
    % Identificar la frecuencia dominante del IMF
    [~, idxMaxPSD] = max(psd_imf);
    frecDominante = freqs_imf(idxMaxPSD);

    % Si la frecuencia dominante está por debajo del umbral, se considera una componente de señal
    if frecDominante < frecCorteRuido
        imfsSeleccionadas = [imfsSeleccionadas; modosIMFs(i, :)]; %#ok<agrow>
    end
end

% Reconstrucción final de la señal denoised sumando las IMFs seleccionadas
senalDenoisedFinal = sum(imfsSeleccionadas, 1);
</agrow>

Visualización de Resultados

Para evaluar la efectividad del método, es fundamental comparar visualmente la señal original, la señal filtrada por SVD y la señal final después de aplicar VMD.


% Visualización comparativa de las señales
figure;
subplot(3,1,1);
plot(vectorTiempo, senalRuidosa);
title('Señal Original con Ruido');
ylabel('Amplitud');
grid on;

subplot(3,1,2);
plot(vectorTiempo, senalSVD_denoised);
title('Señal Filtrada por SVD');
ylabel('Amplitud');
grid on;

subplot(3,1,3);
plot(vectorTiempo, senalDenoisedFinal);
title('Señal Denoiseada Final (SVD + VMD)');
xlabel('Tiempo (s)');
ylabel('Amplitud');
grid on;

Consideraicones Prácticas

  • El umbral de energía para la SVD (ej., 95%) puede ajustarse entre 0.9 y 0.97 para optimizar el balance entre reducción de ruido y preservación de la señal.
  • El parámetro alfa_param en VMD es crucial; valores más altos imponen una mayor restricción de ancho de banda, lo que puede ser útil para señales con componentes de frecuencia bien separadas.
  • La frecuencia de corte para la selección de IMFs en la VMD debe basarse en el conocimiento previo del contenido espectral de la señal y el ruido esperado.

Esta combinación SVD-VMD ofrece una metodología robusta para la reducción de ruido, aprovechando la capacidad de la SVD para manejar ruido impulsivo o de banda ancha y la habilidad de VMD para separar componentes de frecuencia adyacentes de manera adaptativa. Esto resulta en una mejora significativa en la relación señal-ruido.

Etiquetas: matlab SVD VMD filtrado de ruido Series Temporales

Publicado el 7-2 00:26