语音处理中的Gammatone滤波器

2025-12-18

语音处理中的Gammatone滤波器,这是一种模拟人耳听觉特性的重要工具。

Gammatone滤波器原理

Gammatone滤波器是一种基于人耳基底膜振动特性的滤波器,其名称来源于"Gamma"函数和"tone"刺激。

数学表达式

Gammatone滤波器的冲激响应为:

其中:

  • :幅度增益
  • :滤波器阶数(通常为4)
  • :带宽参数
  • :中心频率
  • :相位
  • :时间

MATLAB实现

基础Gammatone滤波器实现

function [gt, t] = gammatone_impulse_response(fc, n, bw, fs, duration)
% 生成Gammatone滤波器冲激响应
% fc: 中心频率(Hz)
% n: 滤波器阶数
% bw: 带宽(Hz)
% fs: 采样率
% duration: 持续时间(秒)

    if nargin < 2, n = 4; end
    if nargin < 3, bw = erb(fc); end
    if nargin < 4, fs = 16000; end
    if nargin < 5, duration = 0.1; end
    
    t = 0:1/fs:duration;
    t = t(1:end-1);
    
    % Gammatone冲激响应
    gt = (t.^(n-1)) .* exp(-2*pi*bw*t) .* cos(2*pi*fc*t);
    
    % 归一化
    gt = gt / max(abs(gt));
end

function bw = erb(fc)
% 计算等效矩形带宽(Equivalent Rectangular Bandwidth)
% fc: 中心频率(Hz)
    bw = 24.7 * (4.37 * fc/1000 + 1);
end

Gammatone滤波器组实现

function [filters, center_freqs] = gammatone_filterbank(low_freq, high_freq, num_filters, fs, n)
% 创建Gammatone滤波器组
% low_freq: 最低中心频率
% high_freq: 最高中心频率
% num_filters: 滤波器数量
% fs: 采样率
% n: 滤波器阶数

    if nargin < 5, n = 4; end
    if nargin < 4, fs = 16000; end
    
    % 在ERB尺度上均匀分布中心频率
    erb_low = freq2erb(low_freq);
    erb_high = freq2erb(high_freq);
    center_freqs_erb = linspace(erb_low, erb_high, num_filters);
    center_freqs = erb2freq(center_freqs_erb);
    
    filters = cell(num_filters, 1);
    
    for i = 1:num_filters
        fc = center_freqs(i);
        bw = erb(fc);
        [gt, ~] = gammatone_impulse_response(fc, n, bw, fs);
        filters{i} = gt;
    end
end

function erb_rate = freq2erb(freq)
% 频率转换为ERB率
    erb_rate = 21.4 * log10(0.00437 * freq + 1);
end

function freq = erb2freq(erb_rate)
% ERB率转换为频率
    freq = (10.^(erb_rate/21.4) - 1) / 0.00437;
end

完整的语音处理示例

function gammatone_feature_extraction(audio_file)
% 基于Gammatone滤波器的语音特征提取
    
    % 读取音频文件
    [x, fs] = audioread(audio_file);
    if size(x, 2) > 1
        x = mean(x, 2); % 转为单声道
    end
    
    % 参数设置
    low_freq = 80;      % 最低频率
    high_freq = 8000;   % 最高频率
    num_filters = 40;   % 滤波器数量
    frame_length = 0.025; % 帧长(秒)
    frame_shift = 0.01;   % 帧移(秒)
    
    % 创建Gammatone滤波器组
    [filters, center_freqs] = gammatone_filterbank(low_freq, high_freq, num_filters, fs);
    
    % 计算滤波器响应
    gammatone_spectrogram = apply_gammatone_filterbank(x, filters, fs, frame_length, frame_shift);
    
    % 可视化结果
    visualize_gammatone_features(x, fs, gammatone_spectrogram, center_freqs);
    
    % 提取GFCC特征
    gfcc_features = extract_gfcc(gammatone_spectrogram);
    
    disp('Gammatone特征提取完成');
end

function spectrogram = apply_gammatone_filterbank(x, filters, fs, frame_length, frame_shift)
% 应用Gammatone滤波器组并生成谱图
    
    frame_samples = round(frame_length * fs);
    shift_samples = round(frame_shift * fs);
    
    num_frames = floor((length(x) - frame_samples) / shift_samples) + 1;
    num_filters = length(filters);
    
    spectrogram = zeros(num_filters, num_frames);
    
    for i = 1:num_filters
        % 滤波
        filtered_signal = filter(filters{i}, 1, x);
        
        % 分帧计算能量
        for j = 1:num_frames
            start_idx = (j-1) * shift_samples + 1;
            end_idx = start_idx + frame_samples - 1;
            frame = filtered_signal(start_idx:end_idx);
            spectrogram(i, j) = log(sum(frame.^2) + eps);
        end
    end
end

function gfcc = extract_gfcc(gammatone_spectrogram)
% 提取Gammatone频率倒谱系数(GFCC)
    
    [num_filters, num_frames] = size(gammatone_spectrogram);
    
    % 应用DCT得到GFCC
    num_ceps = 13; % 取前13个系数
    gfcc = zeros(num_ceps, num_frames);
    
    for i = 1:num_frames
        dct_coeffs = dct(gammatone_spectrogram(:, i));
        gfcc(:, i) = dct_coeffs(1:num_ceps);
    end
    
    % 倒谱提升
    gfcc = cepstral_lifter(gfcc);
end

function lifted_cepstrum = cepstral_lifter(cepstrum, lifter_param)
% 倒谱提升
    if nargin < 2
        lifter_param = 22;
    end
    
    [num_ceps, num_frames] = size(cepstrum);
    n = 1:num_ceps;
    lift = 1 + (lifter_param/2) * sin(pi * n / lifter_param);
    lifted_cepstrum = cepstrum .* lift';
end

function visualize_gammatone_features(x, fs, spectrogram, center_freqs)
% 可视化Gammatone特征
    
    figure('Position', [100, 100, 1200, 800]);
    
    % 原始语音信号
    subplot(3,1,1);
    t = (0:length(x)-1) / fs;
    plot(t, x);
    xlabel('时间 (s)');
    ylabel('幅度');
    title('原始语音信号');
    grid on;
    
    % Gammatone谱图
    subplot(3,1,2);
    imagesc(1:size(spectrogram,2), center_freqs, spectrogram);
    set(gca, 'YDir', 'normal');
    xlabel('帧索引');
    ylabel('频率 (Hz)');
    title('Gammatone谱图');
    colorbar;
    
    % 滤波器组响应
    subplot(3,1,3);
    [filters, ~] = gammatone_filterbank(80, 8000, 40, fs);
    freq_response = zeros(40, 512);
    for i = 1:40
        freq_response(i,:) = 20*log10(abs(fft(filters{i}, 512)));
    end
    imagesc(1:512, 1:40, freq_response);
    xlabel('频率点');
    ylabel('滤波器索引');
    title('Gammatone滤波器组频率响应');
    colorbar;
    
    colormap(jet);
end

实际应用示例

% 使用示例
function demo_gammatone()
    
    % 生成测试信号
    fs = 16000;
    t = 0:1/fs:1;
    f1 = 500; f2 = 2000; f3 = 4000;
    test_signal = sin(2*pi*f1*t) + 0.5*sin(2*pi*f2*t) + 0.2*sin(2*pi*f3*t);
    
    % 单个Gammatone滤波器测试
    fc = 1000; % 中心频率1kHz
    [gt, t_impulse] = gammatone_impulse_response(fc);
    
    figure;
    subplot(2,1,1);
    plot(t_impulse, gt);
    title(['Gammatone滤波器冲激响应 (fc=' num2str(fc) 'Hz)']);
    xlabel('时间 (s)');
    ylabel('幅度');
    grid on;
    
    % 滤波器组测试
    [filters, center_freqs] = gammatone_filterbank(200, 4000, 20, fs);
    
    subplot(2,1,2);
    hold on;
    for i = 1:length(filters)
        plot(filters{i} + i*0.1);
    end
    title('Gammatone滤波器组冲激响应');
    xlabel('采样点');
    ylabel('幅度');
    hold off;
    
    % 语音文件处理示例
    % gammatone_feature_extraction('speech.wav');
end

% 运行演示
demo_gammatone();

参考代码 语音处理gammatone滤波器 www.3dddown.com/cna/82065.html

Gammatone滤波器的优势

  1. 生理合理性:模拟人耳基底膜的频率分析机制

  2. 良好的频率选择性:在低频区域有更好的分辨率

  3. 广泛应用于

    • 语音识别
    • 听觉场景分析
    • 助听器算法
    • 语音增强
    • 音乐信息检索

与其他滤波器的比较

滤波器类型 优点 缺点
Gammatone 生理合理,频率选择性好 计算复杂度较高
Mel滤波器 计算简单,广泛应用 生理合理性较差
Bark滤波器 基于临界带宽 实现相对复杂

Gammatone滤波器在语音处理中特别适合需要模拟人类听觉特性的应用场景,是语音识别前端处理的重要工具之一。