以下文章來源于FPGA開源工作室,作者Leee
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 - 濾波器頻率響應 ifnargin<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
functionplot_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實現

modulepre_emphasis( input wire clk, input wire rst_n, input wiresigned[15:0]data_in, output regsigned[15:0]data_out ); // 預加重系數 α = 0.97,Q1.15格式 parameter ALPHA=16'd31782;// 0.97 * 2^15 // 寄存器聲明 regsigned[15:0]x_delay;// 延遲寄存器 regsigned[31:0]product_reg;// 乘法結果寄存器 regsigned[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
-
FPGA
+關注
關注
1660文章
22408瀏覽量
636193 -
濾波器
+關注
關注
162文章
8411瀏覽量
185677 -
音頻
+關注
關注
31文章
3188瀏覽量
85545
原文標題:fpga實現音頻預加重(pre-emphasis)濾波器
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
怎么設計基于FPGA的高階音頻均衡濾波器?
基于FPGA的程控濾波器設計與實現
高效FIR濾波器的設計與仿真-基于FPGA
FIR帶通濾波器的FPGA實現
FPGA的Kalman濾波器的設計
高階音頻均衡濾波器的FPGA實現
在FPGA內設計的高階音頻數字均衡濾波器整體設計方案詳解
基于FPGA的音頻預加重濾波器設計
評論