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. |