陣列 ICA 先驗(yàn)有多強(qiáng):從兩路混合看滿秩、白化與混響)
兩個(gè)麥克風(fēng)聽到同一個(gè)車間不等于能分離任意數(shù)量的聲源。經(jīng)典瞬時(shí) ICA 把觀測寫成XA S要求源具有合適的獨(dú)立性、混合矩陣可辨識(shí)且有足夠觀測?;祉戃囬g更接近多個(gè)帶延遲的卷積混合不能把一幀采樣點(diǎn)直接塞進(jìn)瞬時(shí)模型就宣稱去除了回聲。scikit-learn FastICA 文檔把白化、非線性函數(shù)、收斂次數(shù)等都作為顯式參數(shù)。這些參數(shù)會(huì)影響求解一個(gè)只有W*x的函數(shù)只是在應(yīng)用已有矩陣不是完成 FastICA 訓(xùn)練。同一份觀測為什么會(huì)無解先看一個(gè)已知矩陣的教學(xué)例子A[[1,0.5],[0.2,1]]。它的行列式為 0.9可逆。若兩只麥克風(fēng)收到完全相同的混合A 的兩行相等行列式為零再大的定點(diǎn)位寬也補(bǔ)不回丟失的獨(dú)立觀測。import math def inverse2(a): if len(a) ! 2 or any(len(row) ! 2 for row in a): raise ValueError(2x2 required) det a[0][0]*a[1][1] - a[0][1]*a[1][0] if abs(det) 1e-10: raise ValueError(rank deficient) return [[a[1][1]/det, -a[0][1]/det], [-a[1][0]/det, a[0][0]/det]] def mv(a, x): return [sum(v*w for v,w in zip(row,x)) for row in a] a [[1.0, 0.5], [0.2, 1.0]] w inverse2(a) error 0.0 for i in range(200): source [math.sin(i*0.19), 1.0 if i % 13 6 else -1.0] recovered mv(w, mv(a, source)) error max(error, max(abs(x-y) for x,y in zip(source,recovered))) assert error 1e-12 try: inverse2([[1.0, 0.5], [1.0, 0.5]]) raise AssertionError(singular matrix accepted) except ValueError: pass print(known-matrix recovery error: %.3g; singular case rejected % error)這里的 W 是從已知 A 求逆得到的不是從盲觀測估計(jì)得到的 ICA。例子只能說明可逆性不能作為盲源分離的準(zhǔn)確率也沒有把合成波形冒充現(xiàn)場語音。白化之后仍需估計(jì)方向中心化移除均值白化讓協(xié)方差接近單位陣。二者只處理二階統(tǒng)計(jì)不保證源彼此獨(dú)立。FastICA 還要通過非高斯性等目標(biāo)尋找方向并處理多分量之間的正交約束。輸出有順序和符號不確定性不能直接把第一路永遠(yuǎn)標(biāo)成人聲。在定點(diǎn)實(shí)現(xiàn)里先確定白化后的動(dòng)態(tài)范圍再選擇數(shù)據(jù)和累加位寬。用 Q15 存原始幅度并不意味著協(xié)方差、特征值倒數(shù)平方根和權(quán)重都適合同一個(gè) Q 格式。接近奇異的協(xié)方差會(huì)放大誤差必須有正則化或拒絕條件?;祉懞鸵苿?dòng)聲源要另建測試測試至少包括同步誤差、通道增益偏差、剪切飽和、聲源移動(dòng)和房間脈沖響應(yīng)變化。評價(jià)時(shí)先對齊輸出的排列、符號和尺度再報(bào)告分離指標(biāo)若最終任務(wù)是命令識(shí)別還要測下游誤識(shí)別不能只聽一段“更干凈”的音頻。本文沒有安裝音頻依賴沒有運(yùn)行 FastICA、采集陣列或驗(yàn)證 Cortex-M 實(shí)時(shí)性。ICA 的價(jià)值在于利用統(tǒng)計(jì)結(jié)構(gòu)邊界也來自這些結(jié)構(gòu)。先把瞬時(shí)可逆例子和真實(shí)混響場景分開后續(xù)優(yōu)化才有可靠參照。