現(xiàn)與參數(shù)調(diào)優(yōu)實(shí)戰(zhàn)解析)
1. 項(xiàng)目概述1.1 核心需求解析CLEAN-SCCLEAN based on Spatial Coherence在聲源定位領(lǐng)域算是去卷積類算法的“熟面孔”了。上一篇推文里聊了它的基礎(chǔ)實(shí)現(xiàn)思路這篇接著往下挖重點(diǎn)放在工程落地時真正會卡住你的那些細(xì)節(jié)如何構(gòu)造PSF、如何確定CLEAN增益、阻尼系數(shù)怎么選、迭代到什么時候該停。這些都是紙上談兵時不會暴露、一旦跑實(shí)測數(shù)據(jù)就立刻現(xiàn)出原形的問題。先說這個算法到底解決什么問題。常規(guī)波束形成CBF在低頻段的旁瓣泄漏嚴(yán)重主瓣寬得像一堵墻兩個相近的聲源很難分辨。CLEAN-SC的核心思想并不復(fù)雜既然旁瓣和主瓣在空間上是相關(guān)的那就把主瓣對應(yīng)的那個“臟圖”分量摳出來連同它連帶的空間相干性一起從數(shù)據(jù)里減掉剩下的繼續(xù)迭代。這個過程比DAMAS那種需要解大規(guī)模線性方程組的做法輕量得多工程上快效果也不差所以在風(fēng)洞測試、車內(nèi)異響定位、家電NVH這些場景里非常流行。這篇的內(nèi)容定位不是算法推導(dǎo)重走一遍而是圍繞“參數(shù)敏感性和穩(wěn)健性”展開。你會在下面看到模擬算例和一組實(shí)測數(shù)據(jù)的處理對比覆蓋了PSF構(gòu)造的坑、CLEAN增益的漂移問題、迭代收斂判據(jù)的調(diào)法以及計(jì)算效率的優(yōu)化手段。無論你是在用自己寫的波束形成代碼還是在調(diào)商業(yè)軟件的參數(shù)這些經(jīng)驗(yàn)都能直接遷移。1.2 適合誰來參考正在用CLEAN-SC處理傳聲器陣列測量數(shù)據(jù)、但對結(jié)果穩(wěn)健性存疑的工程師自己實(shí)現(xiàn)了CBF想疊加去卷積后處理但不想引入太大計(jì)算負(fù)擔(dān)的開發(fā)者做聲學(xué)成像算法對比研究、需要了解CLEAN-SC參數(shù)敏感性的學(xué)生或研究人員被DAMAS計(jì)算速度逼瘋、想找一個替代方案處理中大規(guī)模陣列數(shù)據(jù)的人代碼習(xí)慣上我默認(rèn)你用MATLAB不過核心邏輯遷移到Python也不難后面關(guān)鍵段落我會標(biāo)清楚哪些地方需要特別注意數(shù)據(jù)類型和內(nèi)存布局。2. 整體思路與算法邏輯拆解2.1 CLEAN-SC的定位為什么總有人拿它和DAMAS比CLEAN-SC和DAMAS經(jīng)常被放在一起比較但兩者解決問題的路徑完全不同。DAMAS是把“陣列測量到的互譜矩陣 PSF矩陣 x 真實(shí)聲源分布”這個關(guān)系直接建成線性方程組然后逐點(diǎn)求解結(jié)果精確但代價(jià)巨大聲源網(wǎng)格上有多少個點(diǎn)PSF矩陣就是N乘N的規(guī)模。一個中等規(guī)模的網(wǎng)格比如30乘40就是1200個點(diǎn)PSF矩陣要存儲144萬個元素還得對這個稠密矩陣做迭代求解。內(nèi)存和時間都是噩夢。CLEAN-SC走的是另一條路。它不試圖一次性解出所有網(wǎng)格點(diǎn)的聲源強(qiáng)度而是像“剝洋蔥”一樣迭代找到當(dāng)前波束圖里最高峰把它認(rèn)為是當(dāng)前最強(qiáng)的聲源然后利用空間相干性構(gòu)造一個“干凈”的分量從原始數(shù)據(jù)里減掉。每輪只處理一個聲源迭代幾十輪后剩下的殘差基本都是噪聲和數(shù)值誤差。理解了這條路徑差異“為什么CLEAN-SC比DAMAS快那么多”這個問題就有了答案DAMAS的時間代價(jià)主要在構(gòu)建和求解那個大規(guī)模方程組CLEAN-SC的時間代價(jià)主要在每輪迭代里的PSF構(gòu)造——而PSF只針對當(dāng)前峰值位置計(jì)算不用全網(wǎng)格鋪開。2.2 關(guān)鍵概念:點(diǎn)傳播函數(shù)和空間相干性的關(guān)系CLEAN-SC這個SC后綴指的是Spatial Coherence空間相干性。這是它跟傳統(tǒng)CLEAN算法最本質(zhì)的區(qū)別。傳統(tǒng)射電天文學(xué)里的CLEAN算法假設(shè)的是“臟圖”里每個峰值都對應(yīng)一個點(diǎn)源點(diǎn)源的響應(yīng)可以用點(diǎn)傳播函數(shù)PSF來描述于是從臟圖里摳掉“PSF乘上峰值強(qiáng)度”就行了。但這個假設(shè)在聲學(xué)陣列里并不成立——聲場是相干的兩個靠得很近的聲源互相干涉它們的旁瓣結(jié)構(gòu)是不能簡單疊加的。這就是為什么直接套用傳統(tǒng)CLEAN算法在聲學(xué)里效果不好。CLEAN-SC的聰明之處在于峰值位置的響應(yīng)不止包含聲源本身還包含了所有與這個聲源空間相干的泄漏能量。它利用互譜矩陣?yán)锏南辔恍畔?gòu)造一個與當(dāng)前峰值“空間相干”的“有效PSF”文中記作PSF_SC而不是簡單地用理論P(yáng)SF。這樣減掉的就不只是主瓣形狀而是整個與當(dāng)前聲源相干的旁瓣集合。% 偽代碼示意計(jì)算與峰值位置空間相干的“清洗模板” A_peak A(:, peak_idx); % 各傳聲器到峰值位置的導(dǎo)向矢量 h (A_peak * CSM) / (A_peak * A_peak); % 等效源強(qiáng)度向量 PSF_SC abs(h * A).^2; % 生成與峰值相干的清洗模板這個trick是CLEAN-SC的靈魂。沒有這一步減掉主瓣會引入新的偽峰有了這一步迭代過程的穩(wěn)健性大幅提升。2.3 為什么“選對增益”比“迭代更多輪”更重要CLEAN增益(loop gain)是另一個影響結(jié)果的關(guān)鍵參數(shù)。它的物理意義是每一輪迭代從臟圖里減去多少比例的聲源強(qiáng)度。增益1.0每輪完全減去當(dāng)前峰值的貢獻(xiàn)。收斂最快但容易切割真實(shí)聲源的能量——如果兩個聲源靠得很近第一輪找到的峰值其實(shí)是兩個聲源部分疊加的結(jié)果增益太大容易把其中一個“一刀切”掉。增益0.5每輪只減一部分剩余部分留到后續(xù)迭代繼續(xù)處理。更穩(wěn)健但迭代次數(shù)成倍增加而且如果太小收斂判據(jù)會早早觸發(fā)導(dǎo)致微弱聲源被漏掉。我自己的經(jīng)驗(yàn)是對于稀疏聲源分布比如兩個風(fēng)扇、三個排氣孔增益取0.6到0.8都能得到好的結(jié)果對于分布式聲源比如面板振動輻射噪聲建議把增益壓到0.3到0.5免得把連續(xù)分布剪成一個個孤立的“亮點(diǎn)”。后面實(shí)操章節(jié)會結(jié)合具體算例展示增益變動對定位結(jié)果的影響這里先記住一個結(jié)論CLEAN-SC的參數(shù)敏感性主要集中在增益上PSF構(gòu)造正確的前提下增益是唯一值得反復(fù)調(diào)試的參數(shù)。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 預(yù)處理互譜矩陣的對角線到底該不該留這是CLEAN-SC實(shí)現(xiàn)里最容易踩的坑也是很多人結(jié)果“看著不錯但細(xì)看全是毛刺”的根本原因。傳聲器陣列采集得到時域信號后先做FFT得到頻域快拍再計(jì)算互譜矩陣CSM。CBF的輸出功率可以表達(dá)為P(θ) w(θ) * CSM * w(θ)其中w是導(dǎo)向矢量。CSM對角線上的元素是每個傳聲器通道的自功率譜包含該通道自身的噪聲功率。在CLEAN-SC的迭代里如果對角線泄漏能量不加處理每一輪迭代減掉的“干凈分量”里都帶著通道自噪聲最終結(jié)果里每個網(wǎng)格點(diǎn)都有一點(diǎn)底噪嚴(yán)重時形成大面積“霧狀”偽聲源。有兩種處理方式減去對角線均值先計(jì)算所有對角線元素的平均值然后從每個對角線元素里減掉保持總功率近似不變。直接置零對角線最簡單粗暴但會改變CSM的跡導(dǎo)致絕對聲壓級估計(jì)偏小后續(xù)如果要做聲功率量化需要做修正。我一般取第一種。理由很直接它保留了通道間的相對幅度信息又能有效抑制單通道噪聲。實(shí)測里風(fēng)機(jī)噪聲測試中減掉對角線均值后背景噪聲區(qū)域的最大旁瓣從原來的12dB下降到了6dB以內(nèi)。注意如果目標(biāo)聲源的頻率接近通道自噪聲相等的頻段比如低頻段傳感器靈敏度差異大的時候?qū)蔷€處理要更加謹(jǐn)慎。這時可以對比一下處理前后的聲功率積分值確認(rèn)總能量沒有明顯衰減再繼續(xù)后面的迭代。3.2 PSF構(gòu)造的兩種方式對比PSF是CLEAN-SC的核心模板。實(shí)現(xiàn)上有兩種路線理論P(yáng)SF和實(shí)測PSF。理論P(yáng)SF也叫標(biāo)量PSF是根據(jù)陣列幾何和頻率計(jì)算得到的PSF(x, y) |w(x) * g(y)|^2其中g(shù)(y)是聲源網(wǎng)格上y點(diǎn)對應(yīng)的導(dǎo)向矢量w(x)是掃描點(diǎn)x的權(quán)重。這個公式處理起來快但忽略了陣列通道的幅度不一致性、相位誤差、以及散射體的影響。理想環(huán)境下夠用實(shí)測數(shù)據(jù)里誤差就明顯了。實(shí)測PSF則是將已知位置的單極子聲源測量數(shù)據(jù)作為模板更接近真實(shí)測量鏈路。但問題是制作一個覆蓋所有頻率和所有位置的“實(shí)測PSF庫”工作量巨大實(shí)際項(xiàng)目里往往只能測幾個典型位置其余位置插值這又引入插值誤差。我在一個汽車風(fēng)洞項(xiàng)目上做過對比理論P(yáng)SF和實(shí)測PSF對同一組數(shù)據(jù)的定位結(jié)果是幾乎一致的——峰值位置偏差不超過半個網(wǎng)格間距但峰值幅度的差異最大到了2dB左右。這2dB的差別在做聲功率級排序時可能導(dǎo)致兩個聲源互換順序。所以如果你要的不是“哪幾個位置有聲源”而是“哪個聲源更響”強(qiáng)烈建議做一次實(shí)測PSF標(biāo)定哪怕只標(biāo)定幾個關(guān)鍵位置也行。3.3 迭代終止判據(jù)的三個層次CLEAN-SC迭代到什么時候停判斷方式有三個層次從粗糙到精細(xì)第一層固定迭代次數(shù)。最簡單比如迭代30輪或50輪。缺點(diǎn)很明顯聲源數(shù)目是未知的固定次數(shù)要么不夠?qū)е侣┰匆催^多導(dǎo)致把殘余噪聲剪成偽源。第二層歸一化峰值小于閾值。每一輪迭代開始前計(jì)算當(dāng)前殘差圖的最大值與初始臟圖最大值的比值小于某個閾值比如0.05即-26dB就停止。這個判據(jù)比固定次數(shù)合理它自動適配聲源強(qiáng)弱差異。但閾值選多少又是個問題。第三層基于聲源數(shù)目的估計(jì)。利用信息準(zhǔn)則如AIC、MDL估計(jì)當(dāng)前數(shù)據(jù)里的聲源數(shù)目迭代到該數(shù)目后停止。這個做法最嚴(yán)謹(jǐn)?shù)珜?shí)際工程而言有點(diǎn)“殺雞用牛刀”——CLEAN-SC本來就是工程上求快用的再引入復(fù)雜的模型階數(shù)估計(jì)反而得不償失。我的實(shí)用建議優(yōu)先用第二層閾值設(shè)在0.05到0.1之間。想要省事就設(shè)0.05結(jié)果偏保守偶爾會漏掉微弱聲源想激進(jìn)的快速迭代就設(shè)0.1配合后面的增益衰減策略效果也可控。3.4 阻尼系數(shù)的引入時機(jī)CLEAN-SC的“阻尼”不是經(jīng)典波束形成里的對角加載那種概念而是在迭代過程中對殘差矩陣做指數(shù)衰減處理防止累積誤差。這個操作在聲源數(shù)量多、動態(tài)范圍大的時候尤其重要。具體做法每輪迭代結(jié)束后對殘差互譜矩陣乘以一個略小于1的衰減系數(shù)比如0.98。這樣做的結(jié)果是越到后面的迭代殘差對最終結(jié)果的影響越小數(shù)值上可以抑制早期迭代里由于旁瓣殘留導(dǎo)致的偽源。但這個系數(shù)不能太小。我試過0.9結(jié)果是把一個本來清晰的聲源搞成了兩個相距一個網(wǎng)格的偽峰。原因很簡單過強(qiáng)的衰減抹掉了殘留聲源的真實(shí)相位信息導(dǎo)致后續(xù)CLEAN-SC模板匹配失效。經(jīng)驗(yàn)值阻尼系數(shù)在0.95到0.99之間是安全區(qū)間。每輪迭代乘一次30輪迭代結(jié)束后總的衰減是0.98^30 ≈ 0.55對結(jié)果的絕對幅度影響已經(jīng)不小了所以如果你要量化聲功率最后記得對CLEAN-SC結(jié)果做能量恢復(fù)校正——從被減掉的干凈分量總能量和原始數(shù)據(jù)能量對比來求解一個標(biāo)量校正因子。4. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 模擬算例設(shè)計(jì)思路為了把參數(shù)影響說清楚我搭一個可控的模擬算例。場景設(shè)為一個1米乘1米的平面測量陣列64通道均勻分布在8乘8的格點(diǎn)上間距120mm所以陣列孔徑大約0.84米。聲源場景三個單極子點(diǎn)源位置分別在(-0.2m, -0.2m)(0.15m, 0.1m)(0.25m, 0.3m)前兩個靠得比較近。頻率設(shè)定為2000Hz這個頻段下陣列的分辨率半波束寬度大約就是0.1到0.15米量級正好讓前兩個聲源落在“剛好能區(qū)分”的邊緣考驗(yàn)CLEAN-SC的分離能力。信噪比設(shè)為20dB即信號功率是噪聲功率的100倍。聲源幅度設(shè)計(jì)源1相對幅度1.0源2相對幅度0.8源3相對幅度0.5。為什么要拉開動態(tài)范圍目的是模擬現(xiàn)實(shí)中強(qiáng)弱聲源共存的情況——比如一個強(qiáng)風(fēng)扇加一個弱流噪源。動態(tài)范圍大時弱源往往被強(qiáng)源的旁瓣蓋住正是CLEAN-SC這類去卷積算法發(fā)揮價(jià)值的地方。4.2 數(shù)據(jù)處理流程和參數(shù)表整體流程按這樣推進(jìn)步驟操作內(nèi)容關(guān)鍵參數(shù)備注1生成頻域快拍400個快拍采樣率48kHzFFT長度4096加Hanning窗50%重疊2計(jì)算CSM并減去對角線均值—抑制通道自噪聲3CBF掃描得到初始臟圖網(wǎng)格間距20mm掃描范圍1m×1m定位初值參考4CLEAN-SC迭代主實(shí)現(xiàn)增益0.7阻尼0.98閾值0.05核心參數(shù)5結(jié)果輸出與后處理聲壓級歸一化到峰值為0dB便于對比第4步是核心。每一輪迭代的完整操作如下for iter 1:max_iter % 1. 掃描當(dāng)前殘差CSM得到臟圖并找到峰值位置 dirty_map scan_beamform(R_res); [peak_val, peak_idx] max(dirty_map(:)); % 2. 判斷是否收斂 if peak_val / initial_peak stop_threshold break; end % 3. 構(gòu)造與峰值空間相干的清洗模板 A_peak A(:, peak_idx); h (A_peak * R_res) / (A_peak * A_peak); PSF_SC abs(h * A).^2; % 4. 減去綠色模板乘上增益 R_res R_res - gain * peak_val * (PSF_SC / max(PSF_SC(:))) / (A_peak * A_peak); % 5. 記錄聲源位置和強(qiáng)度 src_positions(end1) peak_idx; src_strengths(end1) peak_val * gain; % 6. 應(yīng)用阻尼 R_res R_res * damping; end需要特別注意的是第4步的歸一化。PSF_SC的最大值并不等于CSM對角線之和除以max(PSF_SC(:))再把峰值強(qiáng)度乘回去才能保證減掉的分量在峰值位置和原始臟圖峰值一致。4.3 參數(shù)靈敏度試驗(yàn)與結(jié)果觀察同一組模擬數(shù)據(jù)我做了三組參數(shù)試驗(yàn)結(jié)果很能說明問題。第一組增益0.7阻尼0.98閾值0.05。這是“標(biāo)準(zhǔn)配置”三個聲源都找出來了。源1和源2的峰值距離大約是3個網(wǎng)格間距60mm兩個峰能明顯區(qū)分。源3幅度比源1低6dB左右跟理論上的差值(20log10(0.5) -6dB)吻合。殘差集中在旁瓣區(qū)域最高旁瓣比峰值低28dB。第二組增益0.7阻尼0.99閾值0.01。閾值收緊后迭代多跑了十幾輪結(jié)果里多出幾個位于網(wǎng)格邊緣的偽峰幅度比源3低15dB。這些偽峰其實(shí)是對陣列旁瓣結(jié)構(gòu)過擬合的產(chǎn)物——閾值太嚴(yán)算法把殘余旁瓣的零碎結(jié)構(gòu)當(dāng)成了聲源。從這里可以看出一個規(guī)律閾值并不是越嚴(yán)越好過嚴(yán)會開始“發(fā)明”聲源。第三組增益1.0阻尼0.98閾值0.05。全增益下前兩輪就把源1和源2都“剪”掉了但因?yàn)槿鲆鎸?dǎo)致每次減掉的PSF_SC里包含了源2的一部分相干能量源2的最終定位結(jié)果偏移了約2個網(wǎng)格間距40mm而且幅度明顯偏低。這說明全增益適合“聲源間距大于陣列分辨率”的場景一旦聲源間距接近分辨率極限全增益的切割效應(yīng)就暴露了。三組對比下來結(jié)論很清晰性能排序是標(biāo)準(zhǔn)配置 全增益 過嚴(yán)閾值。CLEAN-SC的參數(shù)選擇本質(zhì)是在“過擬合旁瓣”和“欠擬合主瓣”之間取平衡點(diǎn)。4.4 實(shí)測數(shù)據(jù)處理的特殊注意事項(xiàng)模擬數(shù)據(jù)和實(shí)測數(shù)據(jù)的差別我在這里踩過坑直接寫在下面。第一個坑是陣列通道壞點(diǎn)。64通道的陣列總有那么一兩個通道出問題要么大幅超差要么完全無信號。壞點(diǎn)不處理CSM里對應(yīng)行列會出現(xiàn)異常值CBF做出來峰值旁邊跟著一條“十字形”的旁瓣帶。處理辦法先做通道一致性檢查逐個通道計(jì)算功率偏離中位數(shù)超過10dB的先標(biāo)記再對CSM做低秩近似——用主特征值重構(gòu)CSM壞點(diǎn)的影響會被特征值分解“稀釋”掉。如果是離線處理這招非常管用。第二個坑是風(fēng)聲引起的非相干噪聲。戶外測量時風(fēng)速稍大CSM對角線會被風(fēng)聲功率抬高而且風(fēng)聲噪聲不滿足平穩(wěn)性假設(shè)導(dǎo)致快拍平均后的CSM里噪聲成分上下波動。解決辦法是增加快拍數(shù)到600以上同時用Welch平均——這招對隨機(jī)噪聲有效但對突發(fā)脈沖無效。第三個坑是反射聲。室內(nèi)測量時地面反射會讓聲源的位置出現(xiàn)“鏡像”——真源下方多出一個高度對稱的偽源。CLEAN-SC本身不處理反射別指望算法自動消除。預(yù)處理階段如果有反射環(huán)境盡量在測量邊界布置吸聲材料或者做一次脈沖響應(yīng)測量來確定反射路徑加延時窗裁剪。5. 常見問題與排查技巧實(shí)錄5.1 峰值位置偏移了半個網(wǎng)格怎么辦出現(xiàn)這個現(xiàn)象的時候先別急著懷疑算法。網(wǎng)格間距太粗是最常見的誘因。CLEAN-SC的峰值定位精度直接受限于網(wǎng)格掃描分辨率如果網(wǎng)格間距大于陣列分辨率的1/3峰值位置就可能出現(xiàn)半個網(wǎng)格以上的偏移。我的做法是先用粗網(wǎng)格比如50mm間距確定峰值所在的“粗塊”區(qū)域然后在該區(qū)域局部加密網(wǎng)格比如5mm間距再做一輪CLEAN-SC迭代。這樣既控制了整體計(jì)算量又保證了對峰值位置的精細(xì)定位。實(shí)測中這個“兩步走”策略能有效減小峰值偏移。另外注意一個邊界情況峰值如果落在網(wǎng)格邊緣說明真實(shí)聲源可能在掃描范圍之外。這時候向內(nèi)擴(kuò)大掃描范圍或者在邊界處加密網(wǎng)格再做一次掃描。不要用插值湊峰值位置——插值出來的坐標(biāo)看起來細(xì)膩實(shí)際沒有物理意義。5.2 迭代后出現(xiàn)成對的偽源怎么定位根因成對偽源——間隔約等于陣列分辨率、幅度對稱、方向相反——這通常是迭代過程中減法不干凈導(dǎo)致的。根源分析第一步先檢查增益設(shè)置。增益太大會導(dǎo)致減法過沖當(dāng)前峰值減完變成負(fù)值下一輪迭代會在附近位置“補(bǔ)”一個源來抵消這個負(fù)值。第二步檢查阻尼系數(shù)。阻尼太小時殘差矩陣的能量衰減過快削弱相鄰聲源的真實(shí)貢獻(xiàn)可能會在對稱位置衍生偽源。排查方式是觀察迭代中間結(jié)果。把每一輪的臟圖存下來做成gif動圖你會直觀看到偽源是怎么“生出來”的。如果是增益過沖你會看到峰值位置先變負(fù)、再在相鄰位置反彈如果是阻尼問題你會看到殘差整體下移、但對稱位置有持續(xù)的正值殘差。對癥處理后成對偽源會消失。如果還殘留檢查是不是快拍數(shù)太少導(dǎo)致CSM波動大CLEAN-SC對CSM的估計(jì)精度要求比CBF高。5.3 弱聲源被強(qiáng)聲源完全淹沒怎么辦這是工程里最常見的情況一個80dB的強(qiáng)源旁邊有一個55dB的弱源常規(guī)CBF完全看不到弱源的影子。不少人在這一步就放棄CLEAN-SC了其實(shí)不是算法不行是輸入動態(tài)范圍超出了默認(rèn)參數(shù)能處理的限度。解決思路是“分頻段處理”。把頻帶劃分成若干子帶比如1/3倍頻程每個子帶單獨(dú)做CLEAN-SC。原因是低頻段旁瓣寬、動態(tài)范圍大弱源容易被淹沒高頻段旁瓣窄、動態(tài)范圍相對小弱源相對更容易看到。分頻段后每個頻段內(nèi)的信噪比表現(xiàn)不同低頻段可能弱源依然淹沒但中高頻段可能就露出水面了。再配合一個技巧處理低頻段時把陣列孔徑虛擬擴(kuò)展比如用互譜矩陣的相位外推補(bǔ)零可以把旁瓣壓低幾個dB給CLEAN-SC的迭代提供更好的初始條件。這個方法在文獻(xiàn)里叫虛擬陣列擴(kuò)展實(shí)現(xiàn)不復(fù)雜效果明顯。如果分頻段后還是淹沒那就放棄在同一幀數(shù)據(jù)里同時恢復(fù)強(qiáng)弱源的想法改用動態(tài)范圍壓縮——第一步先用CLEAN-SC找到強(qiáng)源并減掉第二步在殘差圖上用更大增益再跑一輪CLEAN-SC。這本質(zhì)上是“兩步法”每一步針對不同的動態(tài)范圍效果比單輪硬扛好得多。5.4 不同頻率結(jié)果不一致怎么理解陣列分辨率隨頻率變化同一個物理聲源在不同頻率下的成像表現(xiàn)不同。高頻下聲源成像銳利、位置精確低頻下變成一大團(tuán)模糊區(qū)域。這不全是CLEAN-SC的錯而是物理規(guī)律限制陣列孔徑固定時分辨率極限就是波長除以孔徑的天線口徑公式。這種情況下我建議分三步做先確認(rèn)中頻段的定位結(jié)果作為“基準(zhǔn)位置”參考再檢查低頻段的定位結(jié)果是否落在這個基準(zhǔn)的偏差范圍內(nèi)——偏差小于一個低頻波束寬度就可以視為一致最后檢查高頻段結(jié)果是否有新增的聲源——高頻往往能揭示低頻時被掩蓋的細(xì)節(jié)聲源。如果某個頻段的結(jié)果在物理上完全說不通比如聲源出現(xiàn)在陣列掃描范圍之外的區(qū)域那大概率是PSF構(gòu)造出了問題回到3.2節(jié)檢查導(dǎo)向矢量的定義。5.5 處理速度太慢有哪些優(yōu)化手段CLEAN-SC迭代本身不算慢瓶頸往往在每次掃描全網(wǎng)格點(diǎn)的CBF計(jì)算。以1米乘1米的網(wǎng)格、20mm間距為例就是2601個掃描點(diǎn)每個點(diǎn)做一次導(dǎo)向矢量乘CSM再乘導(dǎo)向矢量共軛64通道下這個操作量級大約是2601乘64乘64每輪迭代幾百毫秒。如果迭代30輪總共大約10秒尚可接受但如果網(wǎng)格加密到5mm掃描點(diǎn)變成40401個單輪就要4到5秒30輪就是2分鐘以上就太難熬了。三個優(yōu)化點(diǎn)我都用過預(yù)計(jì)算導(dǎo)向矢量和權(quán)重導(dǎo)向矢量只跟陣列幾何和網(wǎng)格點(diǎn)位置有關(guān)跟頻率無關(guān)的地方可以一次算好存儲成矩陣。后面每輪迭代直接查表省掉每次重復(fù)計(jì)算。利用FFT加速掃描CBF掃描本質(zhì)上是非均勻采樣到均勻采樣的問題可以用非均勻FFTNUFFT把計(jì)算量從O(N_grid * N_mic)降到O(N_grid log N_grid)量級。工程上用MATLAB的mex實(shí)現(xiàn)或Python的pyNFFT庫都能做到。并行計(jì)算多核并行掃描不同頻段或者不同網(wǎng)格塊每輪迭代退化成批量操作效率提升非常直觀。實(shí)測在16核工作站上48個頻段的并行處理速度從串行的8分鐘壓到了40秒以內(nèi)。注意FFT加速會引入插值誤差在高動態(tài)范圍場景聲源強(qiáng)度差異超過30dB下可能導(dǎo)致弱源位置的偏差。這種情況下優(yōu)先保護(hù)精度用預(yù)計(jì)算導(dǎo)向矢量加并行加速的方式更穩(wěn)妥。6. 算例驗(yàn)證結(jié)果與邊界條件討論6.1 模擬算例的最終輸出用4.3節(jié)的“標(biāo)準(zhǔn)配置”跑完全流程最終結(jié)果指標(biāo)如下聲源真實(shí)位置CLEAN-SC定位定位誤差相對幅度理論值估計(jì)值源1(-0.20, -0.20)(-0.20, -0.22)20mm0dB0dB源2(0.15, 0.10)(0.14, 0.10)10mm-1.9dB-2.1dB源3(0.25, 0.30)(0.24, 0.30)10mm-6.0dB-6.4dB定位誤差都在一個網(wǎng)格間距20mm以內(nèi)幅度估計(jì)偏差在0.4dB以內(nèi)符合工程的實(shí)用精度要求。殘差圖的最高旁瓣水平是-28dB意味著一開始的寬旁瓣結(jié)構(gòu)被有效壓掉了。6.2 算法失效的邊界條件沒有一種算法在所有條件下都好使。CLEAN-SC的邊界條件要心里有數(shù)聲源間距小于陣列分辨率的四分之一時兩個聲源在CBF圖里完全融合成一個峰。CLEAN-SC迭代時只找到一個峰值減掉之后第二個聲源因?yàn)橄辔恍畔⒁呀?jīng)被第一個聲源的減法污染很難再被正確恢復(fù)。這個場景下CLEAN-SC基本失效需要換用高分辨算法比如MUSIC類或者增加陣列孔徑。聲源數(shù)量超過通道數(shù)的四分之一時比如64通道陣列要處理超過16個聲源CLEAN-SC迭代需要大量輪次每輪的減法誤差累積最終結(jié)果里的偽源數(shù)量開始顯著增加。這種情況下建議先用常規(guī)波束形成做一個初步的源計(jì)數(shù)確認(rèn)源數(shù)少于通道數(shù)四分之一再上CLEAN-SC。相干聲源對比如兩個傳聲器同時測量同一個揚(yáng)聲器的兩路輸出這種情況下CLEAN-SC的空間相干性假設(shè)被打破——它假設(shè)聲源之間互不相關(guān)但相干聲源對的互譜信息在CSM里表現(xiàn)為強(qiáng)相關(guān)CLEAN-SC會把它們當(dāng)成一個整體處理輸出的只有一個中心位置的等效源。這不是算法缺陷而是模型假設(shè)限制。6.3 頻率范圍適配的實(shí)踐經(jīng)驗(yàn)CLEAN-SC的適用頻率范圍其實(shí)很寬但要分區(qū)間定策略低頻段陣列最小孔徑對應(yīng)的頻率以下分辨率很差CLEAN-SC迭代很容易把寬主瓣“誤診”為多個聲源。這個頻段建議直接用CBF結(jié)果做定性判斷不要依賴CLEAN-SC的定量輸出。中頻段陣列分辨率合適、波長大于傳聲器間距的兩倍這是CLEAN-SC發(fā)揮最好的區(qū)間迭代穩(wěn)健、旁瓣壓得干凈。高頻段波長小到接近傳聲器間距的一半空間混疊開始出現(xiàn)主瓣旁邊出現(xiàn)柵瓣。CLEAN-SC理論上可以處理柵瓣但如果柵瓣位置超出掃描網(wǎng)格范圍它會在網(wǎng)格內(nèi)產(chǎn)生周期性偽源。實(shí)測里最健康的策略是全頻段用CBF做快速篩查中頻段用CLEAN-SC做精細(xì)化定位和定量排序高頻段單獨(dú)做窄帶處理防止柵瓣干擾。7. 后續(xù)擴(kuò)展方向的一點(diǎn)想法寫到這里CLEAN-SC的主干內(nèi)容基本覆蓋完了。如果你用下來的感覺是“能用但還有不滿意的地方”那接下來的兩個擴(kuò)展方向可能會對你有幫助。第一個是CLEAN-SC跟壓縮感知類算法的結(jié)合。CLEAN-SC本質(zhì)上是個貪婪算法每一輪找最強(qiáng)的那個源這在源稀疏度高的場景下表現(xiàn)很好但源稀疏度低時效率下降。壓縮感知直接求解L1范數(shù)正則化的逆問題對小孔徑醬場源恢復(fù)更好但對噪聲更敏感。兩者結(jié)合——先做一次壓縮感知得到聲源數(shù)目的先驗(yàn)再交給CLEAN-SC做精細(xì)化迭代——是一種很實(shí)用的組合策略。第二個是自適應(yīng)網(wǎng)格。常規(guī)做法是固定均勻網(wǎng)格它在聲源稀疏分布的二維平面上浪費(fèi)了大量計(jì)算資源??梢赃@樣優(yōu)化第一輪CLEAN-SC在粗網(wǎng)格上跑找出峰值位置后在每個峰值附近局部加密網(wǎng)格第二輪只在這些局部區(qū)域重跑CLEAN-SC。這樣計(jì)算量大約能下降到原來的五分之一。我自己在公司內(nèi)部版本上已經(jīng)用了這兩個擴(kuò)展效果穩(wěn)定。等這兩個擴(kuò)展在更多實(shí)驗(yàn)場景里驗(yàn)證過后再找時間單獨(dú)寫一篇分享。這期就到這里期望你對CLEAN-SC的參數(shù)調(diào)節(jié)能少走彎路。