如果提高聲音測距的分辨率?

聲音延遲的分辨率與空間分辨率之間的關係

通過相關運算可以獲得聲音傳播的延遲,近而獲得聲源與接收MIC之間的距離。
由於聲音信號是通過離散時間採樣,因此對於時間 延遲的分辨率就會受到採樣時間TsT_s的影響。在直線軌道上聲音延遲信號分析
推文中,給出了是結果,如下圖所示。可以看出時間延遲曲線呈現明顯的臺階。這就是因爲採樣時間所引起的時間分辨率引起的。
相關係數最大值最小值的位置與數據採用之間的關係
根據實驗延遲計算出空間距離,同樣也會具有一個分辨率下限。Δd=Tsvair\Delta d = T_s \cdot v_{air}。其中的vairv_{air}是空氣中的升速,TsT_s是聲音信號採樣時間。

下面討論如何提高聲音延遲的分辨率、計算效率、以及麥克的不同空間指向對於測量結果的影響。

快速相關運算

1、利用FFT加速計算相關運算

(1)相關運算的複雜度

對於兩個時間信號x(t),y(t)x\left( t \right),y\left( t \right),它們的相關運算結果Rxy(t)R_{xy} \left( t \right)定義如下:
Rxy(t)=x(τ)y(τt)dτR_{xy} \left( t \right) = \int_{ - \infty }^\infty {x\left( \tau \right) \cdot y\left( {\tau - t} \right)^* \cdot d\tau }如果這兩個信號都是實值信號,公式裏面的共軛就可以省略。

對於兩個實數離散時間信號x[n],y[n],n{0,...,N1}x\left[ n \right],y\left[ n \right],n \in \left\{ {0,...,N - 1} \right\},它們之間的普通相關運算定義爲:
Rxy[n]=m,mn[0,N1]x[m]y[mn]R_{xy} \left[ n \right] = \sum\limits_{m,m - n \in \left[ {0,N - 1} \right]}^{} {x\left[ m \right] \cdot y\left[ {m - n} \right]}

從相關運算定義來看,計算兩個長度爲NN的序列相關運算,乘法、加法的計算複雜度與N2N^2成正比。

(2)相關運算與卷積運算的關係

在信號運算中,還有一個應用更廣泛的運算:卷積運算。x(t),y(t)x\left( t \right),y\left( t \right)之間的卷積運算定義爲:x(t)y(t)=x(τ)y(tτ)dτx\left( t \right) * y\left( t \right) = \int_{ - \infty }^\infty {x\left( \tau \right) \cdot y\left( {t - \tau } \right)d\tau }
對比一下信號的相關運算和卷積運算的定義,可以看出它們之間的關係:
Rxy(t)=x(t)y(t)R_{xy} \left( t \right) = x\left( t \right) * y^* \left( { - t} \right)

(2)快速卷積數值計算
之所以討論相關運算與卷積運算之間的關係,是爲了尋找相關運算的快速算法。

計算一個序列x[n],n{0,...,N1}x\left[ n \right],n \in \left\{ {0,...,N - 1} \right\}的離散傅里葉變換DFT{x[n]}DFT \left\{ {x\left[ n \right]} \right\}有相應的快速算法-快速傅里葉變換FFT{x[n]}FFT\left\{ {x\left[ n \right]} \right\},在NN爲2的整數次冪的情況下,計算FFT的乘法,加法的複雜度都在log2N\log _2 N的數量級別。正變換和反變換的複雜度相同。

在根據傅里葉變換的卷積定理,序列的時域卷積(和)運算,在頻域是乘積運算。基於此,再利用前面討論的相關與卷積運算之間的關係,可以得到計算兩個序列的相關運算的快速算法:

Rx,y(t)=FFT1{FFT[x(t)]FFT[y(t)]}R_{x,y} \left( t \right) = FFT^{ - 1} \left\{ {FFT\left[ {x\left( t \right)} \right] \cdot FFT\left[ {y\left( t \right)} \right]^* } \right\}

在實際工程中,往往參與卷積的兩個信號實現已知,比如在利用聲音定位的時候,發送聲音信號往往是事先確定好的固定的Chirp信號,每次參與計算的新的信號是接收到的回聲信號。所以在上面卷積的快速算法中,對於已知信號的FFT可以事先計算好並存儲,實際運算中只需要完成對新採集到信號的FFT計算,以及對乘積結果的反FFT計算。

最後需要補充一下,在利用上面公式計算的時候,還需要將兩個信號通過補0,變成長度等於兩個序列長度之和減一。

在下面程序中,首先簡單的將兩個等長序列都補零成兩倍的長度。然後按照前面公式計算出卷積結果。

def procdatafft(send, rece):
    sm = mean(send)
    rm = mean(rece)

    send = [d - sm for d in send]
    rece = [d - rm for d in rece]

    sendspace = zeros(len(send) * 2)
    sendspace[0:len(send)] = send
    recespace = zeros(len(send) * 2)
    recespace[0:len(send)] = rece

    cor = list((fft.ifft(fft.fft(sendspace) * conj(fft.fft(recespace)))).real)
    maxpos = cor.index(max(cor))
    return maxpos

使用快速計算,比直接在時域中進行卷積速度大大提高了。
通過計算獲得100個採樣數據相關峯值點,使用FFT需要大約:0.36秒鐘;而使用普通的相關運算則需要200秒左右。
通過FFT得到的相關結果峯值位置

通過FFT得到的相關結果峯值位置

使用FFT計算100點相關結果只需要0.37秒

使用FFT計算100點相關結果只需要0.37秒

直接計算100點相關結果則需要200秒左右

直接計算100點相關結果則需要192秒左右

提高相關運算的空間精度

1. 爲什麼前面測量結果曲線中出現臺階

如果直接根據序列的相關結果峯值位置確定聲音延遲,那麼聲音延遲的時間分辨率就是聲音信號的採樣時間TsT_s,再根據聲音速度vsoundv_{sound},可以計算出所對應的測量距離的空間分辨率Δd=Ts×vsound\Delta d = T_s \times v_{sound}

在採樣時間Ts=0.1msT_s = 0.1ms,20℃空氣速度v20oc=343  (m/s)v_{20^o c} = 343\,\,\left( {m/s} \right),對應的空間分辨率Δd=3.4(cm)\Delta d = 3.4\left( {cm} \right),也就是當收音麥克與音源之間的距離變化小於3.4釐米時,所測量得到的結果是一樣的。這也就解釋了前面100個位置點測量聲音延遲曲線出現了很多臺階的原因。

2. 如何提高測量結果的空間分辨率

提高基於聲音採樣數據相關方法測量距離的空間分辨率,可以通過提高AD採樣速率來解決。但這需要更高速的AD轉換器,更多的數據存儲內存以及更快速數據計算能力。

除此之外,還可以通過數據插值處理的方法來提高測量結果的空間分辨率。

數據插值柯陽春從離散時間採樣數據x[nTs]x\left[ {nT_s } \right]中獲得時間更加密集的數據x[nTs1]x\left[ {nT_{s1} } \right]。插值分解成兩個過程:第一個過程是將離散時間信號恢復成一個連續時間信號x(t)x\left( t \right);第二個過程就是在連續時間信號的基礎上採用更加密集的是時間間隔採樣x[nTs1]x\left[ {nT_{s1} } \right]

恢復成連續時間信號可以有零階保持、一階保持、理想插值等不同方法,它們都可以看成是離散時間採樣脈衝信號與一個插值函數進行卷積的結果:x(t)reconstructed=h(t)xs(t)x\left( t \right)_{reconstructed} = h\left( t \right) * x_s \left( t \right)

零階保持、一階保持、理想插值分別對應的卷積信號是矩形信號、三角信號以及sinc(t)\sin c\left( t \right)信號等。
不同的離散時間信號重建成連續時間信號的方法

不同的離散時間信號重建成連續時間信號的方法

使用理想插值所獲得的結果更加平滑,但計算起來相對比較複雜。但如果是從離散時間信號的傅里葉變換結果中恢復插值信號的話,則有一個非常方便的方法,那就是通過對數據的DFT結果補零,獲得更長的頻譜數據,再通過反離散傅里葉變換,就可以得到原來數據的理想插值結果了。具體的 原理在信號與系統課程中會進行介紹的。

由於前面在快速計算相關結果的時候,就利用了快速傅里葉變換,所以可以在最後一步進行反傅里葉變換的時候,先進行補零,然後在進行

def procdatafftinterpolation(send, rece, interptime):
    sm = mean(send)
    rm = mean(rece)
    send = [d - sm for d in send]
    rece = [d - rm for d in rece]

    sendspace = zeros(len(send) * 2)
    sendspace[0:len(send)] = send
    recespace = zeros(len(send) * 2)
    recespace[0:len(send)] = rece

    fftresult = fft.fft(sendspace) * conj(fft.fft(recespace))
    fftexpand = zeros(len(send) * interptime * 2, dtype=complex64)
    fftexpand[0:len(send)] = fftresult[0:len(send)]
    fftexpand[-len(send):] = fftresult[len(send):len(send)*2]
    cor = list(fft.ifft(fftexpand).real)
    maxpos = cor.index(max(cor))
    return maxpos

下面給出了插值10倍之後所獲得的相關峯值位置結果,對比原始計算方法,可以看到經過插值之後的結果明顯平滑多了。通過插值後的結果所獲得的空間分辨率就從原來的3.6釐米降低到3.6毫米了。

經過空間插值細化後10倍後的相關峯值位置計算結構

經過空間插值細化後10倍後的相關峯值位置計算結構

由於實驗環境是在室內,存在着很多反射波的干擾,所以當距離遠了之後,距離測量出現了很多的波動,它們反映了空間中的很多駐波干擾。

隨着插值倍數增加,所得到延遲曲線變化

隨着插值倍數增加,所得到延遲曲線變化

通過簡單的差值就可以輕鬆提高測距的空間分辨率,所需要的代價就是計算時間加長了。下面圖給出了插值的倍數與結果計算消耗的時間之間的關係,整體上呈現線性比例關係。
細化倍數和計算時間

細化倍數和計算時間

室內環境反射波對於測量結果的影響

由於是在室內進行實驗,麥克風所接受到的聲音信號除了直接來自於聲源之外,可能還包括有四周牆壁的反射信號。如果聲源距離比較近,四周的反射聲波強度受到衰減,對於測量結果影響較小。

下面通過控制接受麥克的不同方向,考察一下測量結果是否受到影響。
使用舵機控制MIC的方向

使用舵機控制MIC的方向

下面是麥克距離音箱30釐米左右,方向從左到右旋轉180°,所測到得到的聲音延遲時間。
不同指向對應的相關延遲結果

不同指向對應的相關延遲結果

延遲時間對應的最大值和最小值分別是:tmax=4895.5,    tmin=4896.4t_{\max } = 4895.5,\,\,\,\,t_{\min } = 4896.4
在10kHz的採樣率下,上述時間差所對應的距離變化爲:Δd=(tmaxtmin)v200c=0.9×104×343=3  (cm)\Delta d = \left( {t_{\max } - t_{\min } } \right) \cdot v_{20^0 c} = 0.9 \times 10^{ - 4} \times 343 = 3\,\,\left( {cm} \right)

這個3釐米的變化距離和麥克風轉動過程中所引起的距離變化大體相當,說明此事四周的反射波對於測量結果影響不大。同時所使用的MIC的方向指向性並不強,可以對來自於180°方向的聲波都能夠很好的探測。

下面是分別將麥克在距離音箱10釐米和50釐米處重新測量不同的指向對於測距結果的影響。
在10釐米距離下麥克不同方向對應的聲音延遲

在10釐米距離下麥克不同方向對應的聲音延遲

在50釐米距離下麥克不同方向對應的聲音延遲

在50釐米距離下麥克不同方向對應的聲音延遲

發佈了275 篇原創文章 · 獲贊 199 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章