1預加重濾波器的作用
在語音信號中,聲門波激勵和口鼻輻射效應共同導致語音信號的高頻分量能量要比低頻分量弱。預加重(Pre-emphasis)的目的就是:
1 .提升高頻分量,平衡語音頻譜,使得高頻特征更加明顯,便于后續的特征提取(如MFCC)。
2.消除發聲過程中口唇輻射的影響。
3.在一定程度上抑制工頻干擾。
2 預加重濾波器的使用場景
- 語音識別前端處理
作用:這是預加重最經典和最重要的應用。
平衡頻譜:語音信號在產生過程中受到聲門脈沖和口唇輻射的影響,天然具有大約-6dB/倍頻程的高頻衰減。預加重通過+6dB/倍頻程的提升來補償這種衰減,使頻譜變得平坦。
提升高頻特征:清輔音(如/s/、/f/、/th/)包含重要的高頻信息但能量較弱,預加重能增強這些關鍵特征,提高識別準確率。
改善信噪比:在某種程度上抑制低頻噪聲干擾。 - 語音編碼
在CELP、ACELP等線性預測編碼中,預加重使信號頻譜平坦化,提高線性預測的準確性。
減少量化誤差,提高編碼效率。 - 語音增強與降噪
提升語音高頻分量,使其在背景噪聲中更加突出。
配合后續的頻譜減法等算法,獲得更好的降噪效果。 - 音頻錄制與重放系統
磁帶錄音系統(歷史經典應用):
錄制時預加重:提升高頻信號,克服磁帶本底噪聲(主要是高頻噪聲)。
播放時去加重:衰減高頻,恢復原始頻率響應,同時降低高頻噪聲。
標準預加重時間常數:50μs(FM廣播)、75μs(Audio磁帶) - FM調頻廣播
采用預加重(美國標準75μs)來改善廣播信號的抗噪聲性能。
接收機使用對應的去加重網絡。

3 預加重濾波器的原理與傳遞函數
預加重通常被建模為一個一階高通濾波器。它的作用是抑制低頻,通過高頻。
其數字濾波器的傳遞函數通常定義為:



4 matlab 實現
function[y, freq_response]= pre_emphasis_analysis(x, fs, alpha, plot_results)
% 完整的預加重分析與實現
% 輸入:
% x - 輸入語音信號
% fs - 采樣頻率
% alpha - 預加重系數
% plot_results - 是否繪制結果圖表
% 輸出:
% y - 預加重后的信號
% freq_response - 濾波器頻率響應
if nargin <3
alpha =0.97;
end
if nargin <4
plot_results =true;
end
% 預加重濾波
y = filter([1, -alpha], 1, x);
% 計算頻率響應
[h, w]= freqz([1, -alpha], 1, 1024, fs);
freq_response = abs(h);
frequencies = w;
% 繪制結果
if plot_results
plot_preemphasis_results(x, y, frequencies, freq_response, fs, alpha);
end
end
function plot_preemphasis_results(x, y, f, h, fs, alpha)
% 繪制預加重結果
figure('Position', [100, 100, 1200, 800]);
% 時域信號對比
subplot(3, 2, 1);
t =(0:length(x)-1) / fs;
plot(t, x, 'b', 'LineWidth', 1);
title('原始語音信號 (時域)');
xlabel('時間 (s)');
ylabel('幅度');
grid on;
subplot(3, 2, 2);
plot(t, y, 'r', 'LineWidth', 1);
title('預加重后信號 (時域)');
xlabel('時間 (s)');
ylabel('幅度');
grid on;
% 頻域對比
N = length(x);
f_axis =(0:N-1) * fs / N;
X = abs(fft(x));
Y = abs(fft(y));
subplot(3, 2, 3);
plot(f_axis(1:N/2), X(1:N/2), 'b', 'LineWidth', 1.5);
title('原始信號頻譜');
xlabel('頻率 (Hz)');
ylabel('幅度');
grid on;
subplot(3, 2, 4);
plot(f_axis(1:N/2), Y(1:N/2), 'r', 'LineWidth', 1.5);
title('預加重后頻譜');
xlabel('頻率 (Hz)');
ylabel('幅度');
grid on;
% 濾波器頻率響應
subplot(3, 2, 5);
plot(f, 20*log10(h), 'g', 'LineWidth', 2);
title('預加重濾波器頻率響應');
xlabel('頻率 (Hz)');
ylabel('增益 (dB)');
grid on;
% 頻譜對比(重疊)
subplot(3, 2, 6);
plot(f_axis(1:N/2), X(1:N/2)/max(X), 'b--', 'LineWidth', 1, 'DisplayName', '原始');
hold on;
plot(f_axis(1:N/2), Y(1:N/2)/max(Y), 'r-', 'LineWidth', 1.5, 'DisplayName', '預加重');
title('頻譜對比 (歸一化)');
xlabel('頻率 (Hz)');
ylabel('歸一化幅度');
legend('show');
grid on;
sgtitle(sprintf('語音預加重分析 (α = %.2f)', alpha));
end

5 預加重濾波器FPGA實現
module pre_emphasis(
input wire clk,
input wire rst_n,
input wire signed[15:0] data_in,
output reg signed[15:0] data_out
);
// 預加重系數 α = 0.97,Q1.15格式
parameter ALPHA =16'd31782;// 0.97 * 2^15
// 寄存器聲明
reg signed[15:0] x_delay;// 延遲寄存器
reg signed[31:0] product_reg;// 乘法結果寄存器
reg signed[15:0] input_reg;// 輸入寄存器
// 流水線處理
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
input_reg <=16'sd0;
x_delay <=16'sd0;
product_reg <=32'sd0;
data_out <=16'sd0;
end else begin
// 第一級: 輸入和延遲
input_reg <= data_in;
x_delay <= input_reg;// 注意: 這里使用input_reg而不是data_in
// 第二級: 乘法
product_reg <= ALPHA * x_delay;
// 第三級: 減法和輸出
data_out <= input_reg - product_reg[30:15];// Q格式調整
end
end
endmodule