Realce de Áudio de Voz via Filtro de Wiener em Ambiente MATLAB

Princípios Teóricos do Filtro de Wiener

1.1 Fundamentos Matemáticos

O filtro de Wiener constitui um sistema linear ótimo projetado para minimizar o erro quadrático médio na recuperação de sinais. Sua formulação para realce de voz assume a forma:

\[ G(f) = \frac{S_s(f)}{S_s(f) + S_n(f)} \]

onde:

  • \( G(f) \): Ganho do filtro no domínio da frequência
  • \( S_s(f) \): Espectro de potência do sinal de voz desejado
  • \( S_n(f) \): Espectro de potência do ruído contaminante

1.2 Pipeline de Processamento

A cadeia operacional típica compreende as seguintes fases:

  1. Recepção do sinal de voz ruidoso
  2. Divisão em segmentos temporais com janelamento
  3. Estimativa espectral do ruído de fundo
  4. Cálculo dos coeficientes do filtro adaptativo
  5. Filtração espectral seletiva
  6. Síntese temporal do sinal aprimorado

Desenvolvimento do Sistema em MATLAB

2.1 Estrutura do Programa Principal

function sistema_realce_voz()
    % Sistema completo para melhoria de qualidade de voz
    
    % Inicialização de parâmetros
    parametros = configurar_parametros();
    
    % Carregamento do áudio de referência
    [voz_ref, freq_amostragem] = audioread(parametros.arquivo_voz);
    parametros.freq_amostragem = freq_amostragem;
    
    % Injeção controlada de ruído
    sinal_misto = adicionar_perturbacao(voz_ref, parametros);
    
    % Modelagem estatística do ruído
    modelo_ruido = caracterizar_ruido(sinal_misto, parametros);
    
    % Síntese do filtro ótimo
    [filtro_sintetizado, estimativa_voz] = sintetizar_filtro(sinal_misto, modelo_ruido, parametros);
    
    % Processamento do sinal
    voz_filtrada = processar_sinal(sinal_misto, filtro_sintetizado, parametros);
    
    % Análise comparativa
    avaliar_resultados(voz_ref, sinal_misto, voz_filtrada, parametros);
    
    % Visualização gráfica
    gerar_graficos(voz_ref, sinal_misto, voz_filtrada, filtro_sintetizado, parametros);
    
    % Áudio comparativo
    executar_reproducao(voz_ref, sinal_misto, voz_filtrada, freq_amostragem);
end

2.2 Parâmetros Configuráveis

function parametros = configurar_parametros()
    % Definição completa dos parâmetros do sistema
    parametros = struct();
    
    % Caminhos de arquivos
    parametros.arquivo_voz = 'gravacao_original.wav';
    parametros.diretorio_saida = 'output_processado/';
    
    % Configurações de áudio
    parametros.freq_amostragem = 16000;
    parametros.tempo_processamento = 5;
    parametros.tamanho_segmento = 256;
    parametros.passo_segmento = 128;
    parametros.tipo_janela = hamming(256);
    
    % Configurações de perturbação
    parametros.tipo_perturbacao = 'termico';
    parametros.intensidade_ruido_db = 5;
    
    % Configurações adaptativas
    parametros.usar_estimativa_adaptativa = true;
    parametros.coeficiente_suavizacao = 0.98;
    parametros.limiar_snr_inferior = -10;
    parametros.limiar_snr_superior = 20;
end

2.3 Geração de Perturbações

function sinal_completo = adicionar_perturbacao(sinal_limpo, parametros)
    % Introdução de ruído controlado
    max_amostras = min(length(sinal_limpo), parametros.tempo_processamento * parametros.freq_amostragem);
    sinal_base = sinal_limpo(1:max_amostras);
    
    % Síntese do sinal de perturbação
    switch lower(parametros.tipo_perturbacao)
        case 'termico'
            perturbacao = randn(size(sinal_base));
        case 'colorido'
            perturbacao = sintetizar_ruido_colorido(length(sinal_base));
        case 'ambiente'
            perturbacao = modelar_ambiente_sonoro(length(sinal_base), parametros.freq_amostragem);
        otherwise
            error('Modelo de perturbação não implementado: %s', parametros.tipo_perturbacao);
    end
    
    % Ajuste de energia relativa
    energia_sinal = mean(sinal_base.^2);
    energia_ruido = mean(perturbacao.^2);
    nivel_desejado = energia_sinal / (10^(parametros.intensidade_ruido_db/10));
    perturbacao = perturbacao * sqrt(nivel_desejado / energia_ruido);
    
    % Composição do sinal final
    sinal_completo = sinal_base + perturbacao;
    
    % Normalização dinâmica
    pico_maximo = max(abs(sinal_completo));
    sinal_completo = sinal_completo / pico_maximo;
end

function ruido_sintetico = sintetizar_ruido_colorido(num_amostras)
    % Geração de ruído com características espectrais específicas
    base_ruido = randn(num_amostras, 1);
    coeficientes_filtragem = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
    denominador = [1, -2.494956002, 2.017265875, -0.522189400];
    ruido_sintetico = filter(coeficientes_filtragem, denominador, base_ruido);
end

function ruido_ambiental = modelar_ambiente_sonoro(num_amostras, taxa_amostragem)
    % Simulação de ambiente sonoro complexo
    ruido_ambiental = zeros(num_amostras, 1);
    fontes_sonoras = 5;
    
    for idx = 1:fontes_sonoras
        tempo_total = num_amostras / taxa_amostragem;
        frequencia_base = 80 + 300 * rand();
        eixo_tempo = (0:num_amostras-1)/taxa_amostragem;
        sinal_fonte = sin(2*pi*frequencia_base*eixo_tempo);
        
        % Adição de componentes harmônicas
        for ordem = 2:5
            sinal_fonte = sinal_fonte + 0.5/ordem * sin(2*pi*ordem*frequencia_base*eixo_tempo);
        end
        
        % Modulação de envelope
        frequencia_moduladora = 2 + 3*rand();
        sinal_fonte = sinal_fonte .* (0.5 + 0.5*sin(2*pi*frequencia_moduladora*eixo_tempo));
        
        % Controle de amplitude aleatório
        fator_escala = 0.3 + 0.7*rand();
        sinal_fonte = sinal_fonte * fator_escala;
        
        ruido_ambiental = ruido_ambiental + sinal_fonte;
    end
end

Tags: filtro-wiener processamento-voz MATLAB analise-espectral estimativa-ruido

Publicado em 6-13 02:55 por Thomas