:MATLAB例程與參數(shù)調(diào)優(yōu)指南)
做語音信號處理的人遲早會碰到這樣的問題音是錄下來了背景里卻全是“沙沙”的底噪傳統(tǒng)的濾波器一上去要么削掉音色要么殘留刺耳的高頻毛刺。我剛開始搭語音前端的時候被這個問題卡了很久后來把常用的降噪手段過了一遍真正覺得“用順手”的還是小波分解法。與其說它是一種濾波不如說它是一次“分層審查”——把含噪語音按頻率尺度和時間位置同時切開找出那些主要是噪聲的小波系數(shù)做閾值處理后再重構(gòu)回去。這篇文章把我在 MATLAB 上完整跑通的小波分解語音降噪例程、參數(shù)選型邏輯和踩過的坑一次性寫清楚適合信號處理方向的學(xué)生、語音前端剛?cè)腴T的工程師以及任何需要在短代碼內(nèi)快速驗證降噪效果的開發(fā)者。之前我總覺得降噪嘛就是濾個波或者用譜減法把噪聲譜估出來減掉。后來做了一段帶強(qiáng)弱變化的語音才發(fā)現(xiàn)語音信號根本就不是平穩(wěn)的清音濁音交替變化局部頻譜特征差異很大。小波分解能在一個分解框架里同時保留“哪個時刻、哪個頻段”的信息而且實現(xiàn)起來不需要太多數(shù)據(jù)得到的結(jié)果也比普通帶通濾波器干凈得多。1. 為什么語音降噪繞不開小波分解1.1 傳統(tǒng)濾波器在語音降噪上的三個尷尬先說說我最早用過的幾種方法后面你就能理解為什么小波分解這條路值得走。第一種是低通或帶通濾波器。語音能量大部分集中在低頻區(qū)域噪聲如果在中高頻我們用低通把高頻切掉確實能去掉一部分底噪。但問題是寬帶噪聲遍布整個頻帶而語音里的清音、摩擦音比如“s”“sh”這類音恰恰也在高頻。一刀切的結(jié)果往往是噪聲少了齒音、舌尖音這些細(xì)節(jié)也沒了聽起來像隔著一層布在說話。第二種是頻譜減法。核心思路是先估計噪聲頻譜再從帶噪語音的頻譜中減掉它。這個方法在沒有參考信號的情況下非常依賴噪聲估計算法而且減完之后容易出現(xiàn)音樂噪聲——那些忽高忽低、斷斷續(xù)續(xù)的偽頻點聽著比原噪聲還難受。尤其是平穩(wěn)性較差的環(huán)境噪聲估計一更新整段低頻就跟著抖。第三種是自適應(yīng)濾波比如 LMS、NLMS 這類。效果好但多數(shù)場景需要一個額外的參考麥克風(fēng)去采噪聲通道很多實驗環(huán)境不具備這個條件測試數(shù)據(jù)往往只有一路含噪語音。而且自適應(yīng)濾波在語音段和非語音段之間切換時收斂速度、步長這些參數(shù)又夠折騰一陣。小波分解和上面幾種的底層邏輯不一樣。譜減法是從頻域“把噪聲幅度減掉”自適應(yīng)濾波是從時域“迭代逼近期望信號”而小波分解是把語音在時間和頻率兩個維度上切成不同的子帶然后針對每個子帶內(nèi)的系數(shù)做“保留”或“收縮”。這樣既不會一刀切掉高頻細(xì)節(jié)也不用額外參考信號天然適合非平穩(wěn)的語音場景。1.2 小波分解降噪的本質(zhì)把噪聲“挑”出來再扔掉小波分解的數(shù)學(xué)過程我盡量用大白話講。信號每次經(jīng)過一對濾波器一個低通、一個高通再下采樣得到兩個部分一個是“近似系數(shù)”相當(dāng)于信號的低頻輪廓一個是“細(xì)節(jié)系數(shù)”相當(dāng)于信號的高頻變化。對近似系數(shù)繼續(xù)重復(fù)這個操作一層一層拆下去就形成了多分辨率的分解結(jié)構(gòu)這也是 MALLAT 算法最經(jīng)典的形式。拿 5 層小波分解來說最后你會得到第 1 層細(xì)節(jié)系數(shù)對應(yīng)原始信號最高頻的一帶第 2 層細(xì)節(jié)系數(shù)次高頻第 3、4、5 層細(xì)節(jié)系數(shù)頻率逐層遞減第 5 層近似系數(shù)最低頻的主體輪廓。語音信號本身的能量高度集中在低頻部分所以大部分“有用的東西”都在近似系數(shù)里。而白噪聲、環(huán)境底噪這些能量相對平均地分布在各層的細(xì)節(jié)系數(shù)中。也就是說每一層細(xì)節(jié)系數(shù)里都混著真信號的高頻細(xì)節(jié)和噪聲但我們能夠通過統(tǒng)計噪聲的水平設(shè)定一個閾值絕對值小于閾值的系數(shù)很大程度上是噪聲置零或收縮絕對值大于閾值的系數(shù)基本是聲音的瞬態(tài)或特定高頻特征保留下來。整個過程就像摘菜葉上的蟲害點不是整棵菜不要而是把壞葉挑出來處理。這里的閾值處理不碰近似系數(shù)近似系數(shù)里是語音的主體能量動了它整段聲音就變悶變空了。這也是這個方法相對柔和的關(guān)鍵所在。1.3 小波降噪的適用場景與邊界它不是萬能的用之前先確認(rèn)場景是否合適。場景效果說明高斯白噪聲疊加語音很好噪聲在各層細(xì)節(jié)系數(shù)分布均勻閾值規(guī)律性強(qiáng)穩(wěn)態(tài)環(huán)境底噪好空調(diào)聲、風(fēng)扇聲、麥克風(fēng)底噪這類相對平穩(wěn)噪聲突發(fā)性強(qiáng)噪聲中等門聲、鑰匙聲、拍桌子聲小波對瞬態(tài)其實有天然優(yōu)勢但要配合端點檢測做分段閾值調(diào)整多說話人重疊語音一般閾值處理容易誤傷重疊部分的語音細(xì)節(jié)強(qiáng)混響環(huán)境一般混響本質(zhì)是語音自身的反射疊加不完全是噪聲小波降噪幫不上大忙實時性也要注意。小波分解本身復(fù)雜度不算高但多層分解加閾值計算、重構(gòu)再加上延遲處理真要在嵌入式設(shè)備上跑還是要做一些裁剪和緩沖優(yōu)化。離線分析、離線降噪、課堂實驗、后端后處理這種場景直接用現(xiàn)成代碼就非常舒服。2. 方案設(shè)計基函數(shù)、分解層數(shù)與閾值決策2.1 小波基函數(shù)怎么選3 個關(guān)鍵參數(shù)寫 MATLAB 例程之前第一個要拍板的是用哪一族小波基。很多人一開始不管三七二十一用db1其實就是 Haar跑出來降噪效果粗糙就以為小波降噪不行。實際上基函數(shù)的選擇直接決定了分解后的稀疏程度也就是“語音能量能否集中到少數(shù)大系數(shù)上”。選基函數(shù)主要看三點正交性、緊支撐性、消失矩。正交性正交小波可以保證分解與重構(gòu)的能量保持不易引入冗余。語音處理常用的是 Daubechiesdb 族和 Symletssym 族。緊支撐性支撐長度意味著小波基在時域上覆蓋多長的區(qū)間。支撐太短頻域分得不夠細(xì)噪聲和語音難以分離支撐過長瞬態(tài)定位又變差。消失矩它決定了小波對平滑信號的“敏感度”消失矩越高對平滑區(qū)域的響應(yīng)越弱意味著光滑語音信號會被壓成更小的系數(shù)噪聲和信號在系數(shù)分布上的區(qū)分度更高。我在實際項目中習(xí)慣從db6開始試然后再看sym6、sym8。這幾組在語音場景下的表現(xiàn)普遍不錯。再往高走比如db10、db20消失矩更高但支撐區(qū)間也變長某些瞬態(tài)細(xì)節(jié)反而會被抹得太平。基函數(shù)消失矩濾波器長度優(yōu)缺點db1Haar12最簡單頻域局部性差降噪粗糙db428計算快保留瞬態(tài)較好但分頻精度稍弱db6312語音降噪起點選擇平衡性好sym6312近似對稱相位畸變小聽感更自然sym8416更精細(xì)的分頻但計算量略增注意小波基不是越高級越好。你用db10跑出來的 SNR 可能比db6高零點幾個 dB但聽感上瞬態(tài)細(xì)節(jié)的損失往往更明顯。測指標(biāo)和聽效果要同時看。2.2 分解層數(shù)從采樣率反推頻帶分解層數(shù)決定你把語音分到多細(xì)的頻率刻度。層數(shù)太少噪聲和語音混在同一個子帶里閾值不好使層數(shù)太多計算量上去了同時最低頻的細(xì)節(jié)系數(shù)里也可能藏著不少語音的基頻諧波處理過度就會傷音質(zhì)。一個比較土但很有效的辦法直接按采樣率算每一層對應(yīng)的頻帶范圍。采樣率 fs第 k 層細(xì)節(jié)系數(shù)的頻帶范圍是下邊界fs / (2^(k1))上邊界fs / (2^k)以 fs 16000 Hz 為例分解層細(xì)節(jié)系數(shù)頻帶對應(yīng)語音內(nèi)容1 層cD14000 ~ 8000 Hz高頻齒音、部分摩擦音、寬帶噪聲殘留2 層cD22000 ~ 4000 Hz部分共振峰、清音過渡段3 層cD31000 ~ 2000 Hz中頻共振峰、輔音過渡4 層cD4500 ~ 1000 Hz低頻共振峰、濁音邊界5 層cD5250 ~ 500 Hz濁音基頻部分5 層近似cA50 ~ 250 Hz語音主體低頻能量從這個表就能看出為什么一般不推薦 3 層以內(nèi)cD1 和 cD2 還是會把大量語音細(xì)節(jié)和噪聲混在一起。我建議常規(guī)語音降噪至少選 4 到 5 層采樣率更高的錄音比如 48 kHz可以選 6 層。層數(shù)再往上提升有限但系數(shù)規(guī)模變大處理時間線性上升。2.3 閾值規(guī)則與軟硬閾值的選擇閾值處理是整個算法的心臟。MATLAB 里thselect提供四種常見閾值規(guī)則規(guī)則關(guān)鍵詞特點通用閾值sqtwolog固定公式噪聲抑制強(qiáng)但容易過度收縮無偏風(fēng)險估計rigrsure基于 Stein 無偏風(fēng)險估計自適應(yīng)強(qiáng)對弱信號更友好啟發(fā)式閾值heursure綜合 sqtwolog 和 rigrsure根據(jù)信噪比自動擇高極大極小準(zhǔn)則minimaxi保守處理最大均方誤差最小化保留細(xì)節(jié)多其中通用閾值的公式是thr sigma * sqrt(2 * log(N))這里 sigma 是噪聲標(biāo)準(zhǔn)差N 是信號長度。這個公式的出發(fā)點是在信號足夠長、噪聲滿足高斯分布時理論上能把噪聲系數(shù)幾乎清零。但語音信號長度通常不短這個閾值算出來往往偏大容易把語音高頻細(xì)節(jié)也壓掉。所以實際做語音時我更常用rigrsure或heursure它們在聽感上更“軟”。然后是軟閾值和硬閾值的選擇。硬閾值系數(shù)絕對值大于閾值則保留原值小于等于閾值則置零。優(yōu)點細(xì)節(jié)能量保留完整缺點在閾值點附近會產(chǎn)生不連續(xù)重構(gòu)后容易出現(xiàn)偽振鈴聽感上像帶了一點金屬感。軟閾值系數(shù)絕對值大于閾值時向零方向收縮一個閾值量。優(yōu)點連續(xù)性更好重構(gòu)后信號平滑缺點會讓系數(shù)的整體幅度略偏小聽感上高頻細(xì)節(jié)稍微變?nèi)?。我在語音降噪里絕大多數(shù)情況選軟閾值。尤其當(dāng)你后續(xù)還要再接一個均衡器或者編碼器時硬閾值帶來的不連續(xù)偽跡會被后續(xù)模塊放大。只有離線處理、對瞬態(tài)細(xì)節(jié)要求非常高的時候我才會考慮硬閾值。3. MATLAB 例程實現(xiàn)與關(guān)鍵細(xì)節(jié)拆解3.1 完整可運(yùn)行的降噪例程下面是我在 MATLAB 上直接跑通過的例程。輸入可以是一段你自己錄的帶噪 wav 文件也可以用程序合成一段模擬語音。為了方便你直接復(fù)現(xiàn)我在代碼里做了兼容如果當(dāng)前目錄下有speech.wav就讀文件否則自動生成一段仿真語音信號。clear; clc; close all; %% 1. 語音數(shù)據(jù)準(zhǔn)備 fs 16000; if exist(speech.wav, file) [x, fs] audioread(speech.wav); x x(:, 1); % 取單聲道 else t (0:2*fs-1) / fs; % 生成 2 秒仿真語音 x 0.6 * sin(2*pi*120*t) .* exp(-((t-0.6).^2)/0.05) ... 0.4 * sin(2*pi*180*(t-1.0)) .* exp(-((t-1.0).^2)/0.08) ... 0.3 * randn(size(t)) .* (t1.5); end x x / max(abs(x)); % 歸一化到 [-1, 1] N length(x); %% 2. 疊加高斯白噪聲模擬帶噪語音 rng(42); noise 0.08 * randn(N, 1); y x noise; %% 3. 小波分解 wname db6; level 5; [C, L] wavedec(y, level, wname); %% 4. 噪聲標(biāo)準(zhǔn)差估計與閾值計算 cD1 detcoef(C, L, 1); sigma median(abs(cD1)) / 0.6745; % MAD 估計噪聲標(biāo)準(zhǔn)差 thr sigma * sqrt(2 * log(N)); % 通用閾值 fprintf(估計噪聲標(biāo)準(zhǔn)差: %.4f\n, sigma); fprintf(閾值 thr: %.4f\n, thr); %% 5. 對前 level 層細(xì)節(jié)系數(shù)做軟閾值處理 [C_den, L_den] wthcoef(d, C, L, 1:level, s, thr); %% 6. 小波重構(gòu) x_den waverec(C_den, L_den, wname); x_den x_den / max(abs(x_den)); %% 7. 信噪比評估 SNR_in 10 * log10(sum(x.^2) / sum((y - x).^2)); SNR_out 10 * log10(sum(x.^2) / sum((x_den - x).^2)); fprintf(降噪前 SNR %.2f dB\n, SNR_in); fprintf(降噪后 SNR %.2f dB\n, SNR_out); %% 8. 畫圖對比 t_axis (0:N-1) / fs; figure(Color, w, Position, [100 100 900 700]); subplot(3, 1, 1); plot(t_axis, x); xlabel(時間/s); ylabel(幅值); title(原始語音); grid on; subplot(3, 1, 2); plot(t_axis, y); xlabel(時間/s); ylabel(幅值); title(帶噪語音); grid on; subplot(3, 1, 3); plot(t_axis, x_den); xlabel(時間/s); ylabel(幅值); title(小波降噪后語音); grid on; %% 9. 語譜圖對比可選 figure(Color, w, Position, [100 100 900 500]); subplot(1, 2, 1); spectrogram(y, 256, 128, 256, fs, yaxis); title(降噪前語譜圖); subplot(1, 2, 2); spectrogram(x_den, 256, 128, 256, fs, yaxis); title(降噪后語譜圖);代碼結(jié)構(gòu)就是四步分解、細(xì)節(jié)系數(shù)閾值處理、重構(gòu)、評估。wthcoef是這里最關(guān)鍵的接口它的d表示對細(xì)節(jié)系數(shù)操作1:level表示哪些層s表示軟閾值最后一個參數(shù)是閾值大小。重構(gòu)時waverec會自動把處理后的系數(shù)合成語音。跑完這個例程你會看到一個很直觀的現(xiàn)象帶噪語音波形里的那些細(xì)小毛刺在降噪后明顯平滑但整體的音包絡(luò)還在。3.2 核心函數(shù)參數(shù)拆解很多文章只甩代碼不講函數(shù)參數(shù)這里我把例程里幾個關(guān)鍵調(diào)用的含義和注意事項說清楚。wavedec(y, level, wname)的返回值是[C, L]。C是一個行向量里面按順序放著第level層的近似系數(shù)、第level層到第 1 層的細(xì)節(jié)系數(shù)。L則記錄了每個部分占多長。千萬不要自己手動去拆C除非你對系數(shù)排列已經(jīng)非常熟悉否則很容易索引錯位。正確做法是用detcoef、appcoef提取系數(shù)用wthcoef統(tǒng)一做閾值操作。detcoef(C, L, 1)提取第 1 層細(xì)節(jié)系數(shù)也就是分解后的最高頻部分。我們在用它估計噪聲標(biāo)準(zhǔn)差時假設(shè)這一層里噪聲占主導(dǎo)同時語音高頻信號只是少數(shù)“尖峰”。這個假設(shè)在多數(shù)非強(qiáng)噪場景下是成立的。wthcoef(d, C, L, 1:level, s, thr)的參數(shù)含義是d操作對象是細(xì)節(jié)系數(shù)1:level指定處理第 1 層到第 level 層的細(xì)節(jié)系數(shù)s使用軟閾值thr閾值。它返回一組新的[C_den, L_den]直接交給waverec。3.3 除了 SNR還有什么評估維度SNR 是衡量降噪效果最直接的指標(biāo)但它有個問題如果算法把語音細(xì)節(jié)也壓沒了SNR 指標(biāo)反而不差因為誤差小了但可懂度和聽感變差了。所以我的習(xí)慣是至少看三個東西SNR 提升幅度一般提升 5~10 dB 就算有效果。波形對比降噪后的波形背景是否更干凈語音段的快速變化是否保留。語譜圖對比高頻共振峰和清音亂區(qū)是否還在底噪?yún)^(qū)域是否變暗。如果條件允許建議加一個PESQ或者STOI指標(biāo)來分析。PESQ 分?jǐn)?shù)范圍在-0.5到4.5之間語音通信常用STOI 更偏向可懂度范圍在0到1之間。這兩個指標(biāo)比單一的 SNR 更接近人耳的主觀感受。3.4 我的運(yùn)行效果參考值用fs 16000、db6、level 5、軟閾值時我常用的那批測試音頻輸入 SNR 在 8~12 dB 左右時降噪后一般能到 17~20 dB。語譜圖上高頻噪點明顯變稀疏元音的共振峰橫條紋更清晰。聽感上底噪變小但摩擦音的舌尖感會弱一點點這在軟閾值下是正常現(xiàn)象如果想補(bǔ)救可以在降噪后做一個 4~8 kHz 頻段的輕微高頻補(bǔ)償。4. 常見問題與參數(shù)調(diào)優(yōu)實錄4.1 噪聲標(biāo)準(zhǔn)差估計的“sigma”陷阱我第一次自己寫閾值代碼的時候踩過一個很典型的坑直接用整段帶噪信號估計方差然后代入通用閾值公式結(jié)果閾值大得離譜降完的語音變成“悶罐”。后來才明白噪聲標(biāo)準(zhǔn)差的穩(wěn)健估計要用最細(xì)節(jié)的那層系數(shù)也就是cD1而且要用中位數(shù)絕對偏差MAD方式sigma median(abs(cD1)) / 0.6745分子是cD1絕對值的中位數(shù)。0.6745 是標(biāo)準(zhǔn)正態(tài)分布 75% 分位數(shù)對應(yīng)的常數(shù)這樣估計出的 sigma 的高斯白噪聲一致性非常好。用普通標(biāo)準(zhǔn)差函數(shù)std(cD1)替代是不行的因為cD1里其實還有語音的高頻細(xì)節(jié)這些大系數(shù)會讓std偏大進(jìn)而導(dǎo)致閾值偏大。如果你發(fā)現(xiàn)自己閾值算出來之后連清音的摩擦噪聲都被壓得沒了先檢查這一行。4.2 硬閾值帶出來的“類音樂噪聲”某次實驗里我換成了硬閾值SNR 看著更高但聽感奇差出現(xiàn)了類似頻譜減法的音樂噪聲。原因剛才講過硬閾值在閾值點附近不連續(xù)重構(gòu)時會在小波基支撐范圍內(nèi)產(chǎn)生振蕩性偽跡。如果你非要保留硬閾值的高細(xì)節(jié)度有一個折中方案把硬閾值判斷后保留下來的系數(shù)稍微做軟收縮或者乘一個 0.8~0.95 的縮放因子。這樣既保留了細(xì)節(jié)又緩和了不連續(xù)性。我在離線后處理里用過這個方式SNR 只低了大概 0.3 dB但聽感自然很多。4.3 分解層數(shù)過多導(dǎo)致語音發(fā)“悶”調(diào)參過程中最容易遇到的一個現(xiàn)象是降噪后的語音不吵了但音色明顯變悶。這大概率是分解層數(shù)過高或者對低頻細(xì)節(jié)系數(shù)也下了狠手。再看一遍分頻表第 5 層細(xì)節(jié)系數(shù)通常對應(yīng) 250~500 Hz這里頭有不少濁音的基頻能量。如果你對cD4、cD5也用了很大的閾值相當(dāng)于把語音的“骨架”跟著削了。我的做法對cD1到cD3用正常閾值對cD4、cD5把閾值乘上 0.5~0.7或者干脆不對cD5做處理。這樣降噪后的語音既有干凈的背景又不至于悶。你可以用wthcoef分別處理不同層給它不同的閾值[C_den, L_den] wthcoef(d, C, L, 1:3, s, thr); [C_den, L_den] wthcoef(d, C_den, L_den, 4, s, 0.6 * thr);4.4 邊界效應(yīng)與分段過渡小波分解的濾波器在信號端點處不可避免會引入邊界效應(yīng)。整段處理時端點只影響開頭和結(jié)尾幾十個采樣點不大起眼。但如果你把長語音切成很多短段分別降噪再拼回去段邊界處會出現(xiàn)明顯的“咔噠”或“鼓包”。處理方案有兩種一是用 MATLAB 內(nèi)部默認(rèn)的邊界延拓方式絕大多數(shù)情況夠用。二是做分段處理時加重疊和交叉淡化每段之間重疊 10%~20%降噪后先做淡入淡出再加和。我的實現(xiàn)習(xí)慣是重疊 50 毫秒左右用漢寧窗做交叉淡化聽起來完全無痕。4.5 參數(shù)調(diào)優(yōu)速查表癥狀可能原因調(diào)整方向降噪后語音發(fā)悶閾值過大 / cD4 cD5 處理過度改用 heursure 閾值或降低低頻層閾值背景噪聲清了但聲音變尖高頻細(xì)節(jié)被過度保留噪聲殘留在 cD1適當(dāng)提高 cD1 閾值出現(xiàn)音樂性偽差硬閾值導(dǎo)致的不連續(xù)換軟閾值或用硬閾值系數(shù)縮放折中波形端點有尖刺邊界效應(yīng)換延拓方式或分段交叉淡化SNR 提升不明顯分解層數(shù)太少 / 閾值太小增加層數(shù)重新檢查 sigma 估計清音和齒音聽感丟失cD1 cD2 被壓得太多單獨降低 cD1、cD2 的閾值系數(shù)5. 后續(xù)方向從小波分解到小波包如果你已經(jīng)能在 MATLAB 里跑通上面的例程下一步可以試試小波包分解。小波包和普通小波分解的區(qū)別在于普通小波只對近似系數(shù)繼續(xù)分解細(xì)節(jié)系數(shù)不再展開而小波包對近似和細(xì)節(jié)都會繼續(xù)分解相當(dāng)于把整個頻帶分得更細(xì)尤其是中高頻區(qū)域也能做更精細(xì)的閾值調(diào)控。語音里的非平穩(wěn)噪聲有時在某一個子帶里特別集中普通小波分解對這個子帶控制得不夠細(xì)。小波包則可以把對應(yīng)頻段的葉子系數(shù)單獨拿出來處理。MATLAB 里對應(yīng)函數(shù)是wpdec、wprcoef和wpthcoef你可以把第 3.1 節(jié)的例程改成小波包版本對比一下效果。還有一條路是把小波降噪和譜減法結(jié)合先用小波降噪去除寬帶白噪聲再用譜減法處理殘留的窄帶噪聲能做到紅白噪聲混合場景下的更好效果。我后來在某個音頻后處理項目里就是兩層疊加換來的是大約 1~2 dB 的額外提升和更干凈的聽感。我個人的體會是小波降噪這套流程最難的部分不是代碼而是“理解你動的是哪些系數(shù)”。每次調(diào)參數(shù)前先在腦海里過一遍這一層細(xì)節(jié)系數(shù)現(xiàn)在對應(yīng)的頻段是什么語音在這個頻段有多少成分噪聲又有多少成分。想清楚了再動手改閾值基本不會跑偏。最后再分享一個小技巧離線處理時不要上來就用全局閾值。先用第 1 層細(xì)節(jié)系數(shù)算出 sigma畫出cD1系數(shù)的直方圖看看它是不是近似鐘形分布。如果分布明顯多出一個拖尾的大系數(shù)群說明這一層里語音細(xì)節(jié)占比不低閾值可以適當(dāng)放寬。這個習(xí)慣幫我避開了很多“指標(biāo)好看但聽感劣化”的情況建議你也試試。