Implementación y Análisis de Filtros Gammatone en el Procesamiento de Voz

Modelado del Sistema Auditivo con Filtros Gammatone

En el ámbito del procesamiento de señales de audio, los filtros Gammatone son fundamentales para emular la respuesta frecuencial de la membrana basilar en el oído humano interno. Su diseño combina la función Gamma con un tono puro, lo que permite una descomposición espectral que refleja con alta fidelidad la percepción auditiva humana.

Definición Matemática

La respuesta al impulso de este modelo se define mediante la siguiente ecuación en el dominio del tiempo:

\(g(t) = A \cdot t^{N-1} \cdot e^{-2\pi B t} \cdot \cos(2\pi f_c t + \theta)\)

Donde los parámetros representan:

  • \(A\): Factor de amplitud.
  • \(N\): Orden del filtro (convencionalmente fijado en 4).
  • \(B\): Ancho de banda efectivo.
  • \(f_c\): Frecuencia central del canal.
  • \(\theta\): Desplazamiento de fase.
  • \(t\): Variable temporal.

Desarrollo de Algoritmos en MATLAB

Generación de la Respuesta al Impulso

El sigiuente script calcula la respuesta temporal de un único canal, normalizando la salida y calculando el ancho de banda equivalente rectangular (ERB).

function [signal_out, time_vec] = compute_gammatone_ir(center_freq, filter_order, bandwidth, sample_rate, time_span)
    % Configuración de valores por defecto
    if nargin < 2, filter_order = 4; end
    if nargin < 3, bandwidth = calc_erb(center_freq); end
    if nargin < 4, sample_rate = 16000; end
    if nargin < 5, time_span = 0.1; end
    
    time_vec = 0 : 1/sample_rate : time_span;
    time_vec = time_vec(1:end-1);
    
    % Cálculo de la respuesta al impulso
    envelope = (time_vec .^ (filter_order - 1)) .* exp(-2 * pi * bandwidth * time_vec);
    carrier = cos(2 * pi * center_freq * time_vec);
    signal_out = envelope .* carrier;
    
    % Normalización de la señal
    signal_out = signal_out / max(abs(signal_out));
end

function erb_value = calc_erb(freq_hz)
    % Cálculo del Ancho de Banda Rectangular Equivalente
    erb_value = 24.7 * (4.37 * freq_hz / 1000 + 1);
end

Construcción del Banco de Filtros

Para analizar el espectro completo, se distribuyen múltiples canales a lo largo de la escala ERB, garantizando una resolución perceptual uniforme.

function [filter_bank, freq_centers] = build_gammatone_bank(min_freq, max_freq, bank_size, sample_rate, order)
    if nargin < 5, order = 4; end
    if nargin < 4, sample_rate = 16000; end
    
    % Mapeo de frecuencias a la escala ERB
    erb_min = hz_to_erb(min_freq);
    erb_max = hz_to_erb(max_freq);
    erb_centers = linspace(erb_min, erb_max, bank_size);
    freq_centers = erb_to_hz(erb_centers);
    
    filter_bank = cell(bank_size, 1);
    
    for k = 1:bank_size
        fc = freq_centers(k);
        bw = calc_erb(fc);
        [ir_signal, ~] = compute_gammatone_ir(fc, order, bw, sample_rate);
        filter_bank{k} = ir_signal;
    end
end

function erb_scale = hz_to_erb(hz_val)
    erb_scale = 21.4 * log10(0.00437 * hz_val + 1);
end

function hz_val = erb_to_hz(erb_scale)
    hz_val = (10 .^ (erb_scale / 21.4) - 1) / 0.00437;
end

Pipeline de Extracción de Características (GFCC)

La extracción de Coeficientes Cepstrales en la Escala Gammatone (GFCC) implica el filtrado de la señal, el cálculo de energía por tramas y la transformación coseno discreta (DCT).

function process_audio_pipeline(audio_path)
    [audio_data, fs] = audioread(audio_path);
    if size(audio_data, 2) > 1
        audio_data = mean(audio_data, 2);
    end
    
    % Configuración del banco
    f_min = 80; f_max = 8000; n_filters = 40;
    win_len = 0.025; win_step = 0.01;
    
    [bank, centers] = build_gammatone_bank(f_min, f_max, n_filters, fs);
    
    % Generación del espectrograma
    gammatone_gram = compute_filterbank_energy(audio_data, bank, fs, win_len, win_step);
    
    % Cálculo de descriptores GFCC
    gfcc_matrix = compute_gfcc(gammatone_gram);
    
    fprintf('Extracción de descriptores GFCC finalizada.\n');
end

function energy_gram = compute_filterbank_energy(signal_in, bank, fs, win_len, win_step)
    n_samples_win = round(win_len * fs);
    n_samples_step = round(win_step * fs);
    
    total_frames = floor((length(signal_in) - n_samples_win) / n_samples_step) + 1;
    n_channels = length(bank);
    
    energy_gram = zeros(n_channels, total_frames);
    
    for ch = 1:n_channels
        filtered_sig = filter(bank{ch}, 1, signal_in);
        
        for fr = 1:total_frames
            idx_start = (fr - 1) * n_samples_step + 1;
            idx_end = idx_start + n_samples_win - 1;
            frame_data = filtered_sig(idx_start:idx_end);
            energy_gram(ch, fr) = log(sum(frame_data .^ 2) + eps);
        end
    end
end

function gfcc_out = compute_gfcc(energy_gram)
    [n_ch, n_fr] = size(energy_gram);
    n_coeff = 13;
    gfcc_out = zeros(n_coeff, n_fr);
    
    for fr = 1:n_fr
        dct_vals = dct(energy_gram(:, fr));
        gfcc_out(:, fr) = dct_vals(1:n_coeff);
    end
    
    gfcc_out = apply_lifter(gfcc_out);
end

function lifted_out = apply_lifter(cep_data, L_param)
    if nargin < 2, L_param = 22; end
    [n_c, n_f] = size(cep_data);
    idx = 1:n_c;
    lift_weights = 1 + (L_param / 2) * sin(pi * idx / L_param);
    lifted_out = cep_data .* lift_weights';
end

Beneficios y Contrastación con Otros Modelos

La adopción de este enfoque en sistemas de reconocimiento automático de voz (ASR) y análisis de escenas auditivas se justifica por sus propiedades intrínsecas:

  • Validez Biológica: Replica con precisión la mecánica de la cóclea.
  • Resolución Espectral: Ofrece un detalle superior en las bandas de baja frecuencia, cruciales para la inteligibilidad del habla.
  • Versatilidad: Empleado en audífonos digitales, separación de fuentes y recuperación de información musical.

Análisis Comparativo de Bancos de Filtros

Arquitectura Puntos Fuertes Limitaciones
Gammatone Alta fidelidad biológica y excelente selectividad frecuencial. Requiere mayor carga computacional.
Mel Implementación ligera y estándar en la industria. Menor precisión en el modelado fisiológico.
Bark Basado en bandas críticas psicoacústicas. Complejidad matemática en su diseño digital.

Etiquetas: gammatone matlab digital-signal-processing speech-recognition gfcc

Publicado el 6-27 00:36