Visualização Espectral para Avaliação da Efetividade do FRCRN em Matlab

A técnica de melhoria de voz, no seu cerne, busca isolar a fala em um sinal de áudio, removendo componentes indesejados de ruído. Modelos avançados baseados em aprendizado profundo, como o FRCRN, demonstram um desempenho notável nessa tarefa. Contudo, para compreender e validar tal eficácia, uma análise visual e quantitativa do resultado é indispensável. Este guia prático utiliza o Matlab para comparar espectralmente sinais antes e após o processamento pelo FRCRN, empregando a Transformada de Fourier de Tempo Curto (STFT) como ferramenta de análise.

  1. Conceitos Fundamentais: STFT e o Espectrograma

A STFT é uma extensão da Transformada de Fourier que preserva a informação temporal. Ela segmenta o sinal de áudio em pequenas janelas (trechos) e aplica a FFT a cada uma. O resultado é uma representação tridimensional: tempo, frequência e magnitude (energia). Visualizar essa informação gera um espectrograma, um mapa que revela como a composição espectral do som evolui no tempo.

No contexto da melhoria de voz, o espectrograma atua como um diagnóstico preciso. A fala humana, especialmente vogais, exibe padrões harmônicos característicos em bandas de frequência relativamente baixas. Muitos ruídos, como interferências de fundo ou sons mecânicos, manifestam-se como padrões energéticos contínuos ou esparsos em faixas de frequência específicas. A comparação dos espectrogramas antes e depois do processamento permite uma avaliação imediata da supressão de ruído e da preservação do sinal de voz.

  1. Implementação Prática em Matlab

Considerando dois arquivos de áudio no formato WAV: audio_ruidoso.wav e audio_melhorado.wav. O objetivo é gerar seus espectrogramas, apresentá-los lado a lado e calcular a redução de energia em uma faixa de frequência específica.

2.1 Carregamento de Dados e Configuração da STFT

O primeiro passo envolve ler os arquivos de áudio e definir os parâmetros que controlam a resolução temporal e de frequência da STFT.

% Carrega os sinais de áudio
[signal_noisy, sample_rate] = audioread('audio_ruidoso.wav');
signal_clean = audioread('audio_melhorado.wav');

% Garante comprimento igual para os sinais
min_samples = min(length(signal_noisy), length(signal_clean));
signal_noisy = signal_noisy(1:min_samples);
signal_clean = signal_clean(1:min_samples);

% Parâmetros para a STFT
win_duration = 0.030; % Duração da janela em segundos (30 ms)
win_samples = round(win_duration * sample_rate);
overlap_samples = round(win_samples * 0.75); % Sobreposição de 75%
fft_points = 2^nextpow2(win_samples);

% Cria a janela de análise (Hanning)
analysis_window = hann(win_samples, 'periodic');

2.2 Cálculo e Visualização dos Espectrogramas

Com os parâmetros definidos, calculamos a STFT de ambos os sinais e plotaoms os espectrogramas. É crucial usar a mesma escala de cores e de eixos para uma comparação justa.

% Calcula o espectrograma do sinal ruidoso
[stft_noisy, freq_axis, time_axis] = spectrogram(signal_noisy, analysis_window, overlap_samples, fft_points, sample_rate, 'yaxis');
mag_spec_noisy = 20*log10(abs(stft_noisy) + eps); % Magnitude em decibéis (dB)

% Calcula o espectrograma do sinal melhorado
stft_clean = spectrogram(signal_clean, analysis_window, overlap_samples, fft_points, sample_rate, 'yaxis');
mag_spec_clean = 20*log10(abs(stft_clean) + eps);

% Cria a figura para comparação
fig_handle = figure('Position', [50, 50, 1000, 450], 'Color', 'w');

% Espectrograma do sinal ruidoso
subplot(1,2,1);
imagesc(time_axis, freq_axis/1000, mag_spec_noisy);
axis xy;
title('Espectrograma do Sinal Ruidoso');
xlabel('Tempo (s)');
ylabel('Frequência (kHz)');
colorbar;
colormap('parula');
caxis([-100 -10]); % Limites da escala de cores em dB

% Espectrograma do sinal melhorado
subplot(1,2,2);
imagesc(time_axis, freq_axis/1000, mag_spec_clean);
axis xy;
title('Espectrograma após FRCRN');
xlabel('Tempo (s)');
ylabel('Frequência (kHz)');
colorbar;
colormap('parula');
caxis([-100 -10]); % Mesma escala de cores do subplot anterior

2.3 Análise Quantitativa da Supresão de Energia

Além da análise visual, é possível quantificar a eficiência do filtro. Vamos calcular a energia total em uma faixa de frequência de interesse (ex: 2500 Hz a 4500 Hz) para ambos os sinais e determinar a razão de supressão.

% Define a faixa de frequência para análise (em Hz)
f_low = 2500;
f_high = 4500;

% Encontra os índices correspondentes a essa faixa no eixo de frequência
freq_indices = find(freq_axis >= f_low & freq_axis <= f_high);

% Calcula a energia linear na faixa para cada sinal
energy_noisy_band = sum(abs(stft_noisy(freq_indices, :)).^2, 'all');
energy_clean_band = sum(abs(stft_clean(freq_indices, :)).^2, 'all');

% Calcula a atenuação em decibéis
suppression_db = 10*log10(energy_noisy_band / energy_clean_band);

% Exibe os resultados
fprintf('Análise da faixa de frequência: %.1f kHz - %.1f kHz\n', f_low/1000, f_high/1000);
fprintf('Energia total no sinal ruidoso: %.3e\n', energy_noisy_band);
fprintf('Energia total no sinal melhorado: %.3e\n', energy_clean_band);
fprintf('Razão de supressão: %.2f dB\n', suppression_db);
  1. Interpretação dos Resultados

A execução do script produz os espectrogramas comparativos e os valores numéricos. A tabela a seguir descreve os padrões típicos observados.

Aspecto Visual Sinal Ruidoso (Esquerda) Sinal Melhorado (Direita) Interpretação
Fundo Espectral Preenchido com tons mais quentes (verde/amarelo) mesmo durante pausas na fala, indicando ruído de fundo contínuo. Fundo predominantemente frio (azul/roxo) durante as pausas, com um "piso" de ruído visivelmente mais baixo. Eficácia na redução de ruído estacionário de fundo.
Estrutura da Fala As bandas harmônicas da voz (tipicamente abaixo de 4 kHz) podem estar ofuscadas ou ter contornos borrados devido ao ruído. As mesmas bandas harmônicas aparecem mais definidas, com maior contraste em relação ao fundo. Preservação e realce da inteligibilidade da fala.
Picos de Ruído Específico Presença de vetas verticais (ruídos impulsivos) ou blocos de energia horizontal em faixas de alta frequência. A atenuação ou desaparecimento desses artefatos específicos. Supressão de componentes de ruído transiente ou em banda estreita.

O valor da Razão de Supressão (suppression_db) fornece uma medida objetiva. Um resultado positivo, como 8.25 dB, indica que a energia total na faixa analisada foi reduzida para aproximadamente um sexto do valor original (10^(-8.25/10) ≈ 0.15), corroborando a melhoria observada visualmente.

  1. Direções para Análises Adicionais

A metodologia apresentada serve como base para investigações mais aprofundadas:

  • Variação de Parâmetros da STFT: Experimentar com diferentes durações de janela (ex: 20 ms vs. 40 ms) para observar o trade-off entre resolução temporal e de frequência.
  • Análise de Trilhas Específicas: Isolar um segmento de áudio de 1 segundo (ex: um fonema vocálico sustentado) e comparar as curvas de magnitude (FFT) naquele instante exato.
  • Visualização 3D: Utilizra a função surf em vez de imagesc para criar uma superfície tridimensional do espectrograma, oferecendo uma perspectiva diferente sobre a distribuição de energia.

Ao transformar sinais de áudio em representações visuais e numéricas precisas, é possível avaliar de forma rigorosa e reprodutível a performance de algoritmos de processamento de sinal como o FRCRN, identificando com clareza seus pontos fortes e potenciais limitações.

Tags: FRCRN MATLAB STFT Espectrograma Processamento de Sinal

Publicado em 6-9 04:21 por Thomas