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.
- 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.
- 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);
- 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.
- 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
surfem vez deimagescpara 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.