通過Chirp信號的接受來確定聲源的位置和方向,通過實驗來研究它的精度和那些因素有關係?
一、實驗的設置:
實驗分爲聲音的發送和接收裝置。下面依次介紹發送和接收實驗裝置的設置。
1. 接收雙聲道麥克風的佈局
使用了兩個駐極體麥克風來接收聲源的聲音。它們的固定方式如下圖所示。
左右兩個麥克風的距離爲26.5釐米,距離地面的高度爲15釐米。
接收聲音的左右聲道麥克風的佈局
2. 發送聲音的揚聲器和滑軌
固定在滑軌上的聲源採用8的動圈式揚聲器。它的尺寸和固定的高度見下圖所示。它外部固定一個與其尺寸相當的原來的鋁質燈罩,可以減少揚聲器外部聲音斷路,提高發送聲音的效率。
固定揚聲器的滑軌可以做維運動,運動的範圍大約0.7米。驅動器可以通過WiFi接收到運動距離的指令。
實驗平臺
定義滑軌的起始位置和結束位置:
起始位置,近端:帶有步進電機驅動、齒輪傳動的一端成爲起始端;
結束位置,遠端:相對應的另外一段定義爲結束位置;
控制命令的功能:
rccw(nstep) : 控制滑軌從起始位置運動到結束位置,nstep:移動的步數,取值範圍(0~14000)。由於有慣性,如果分佈運行時,總的運動步數減小。比如:移動100步,每次移動115,總共11500,基本上可以從起始端移動到結束端;
rcccw(nstep): 控制滑軌從結束端移動到起始端。
3. 驅動聲源喇叭的功放
驅動聲源揚聲器的音頻功率放大器是一款雙聲道的音箱音頻放大器。適配電源爲12V,BTL輸出。前端帶有音量、左右平衡、高音、低音調解旋鈕。
實驗中只是用其中一路來驅動滑軌上的揚聲器。
驅動聲源揚聲器的音頻功率放大器
4. 數據發送和接收
下圖是發送和接收聲音數據的帶有單片機的實驗麪包板。它的原理在如下相關博文中進行了介紹:
發送和接收聲音的數據採集單片機實驗麪包板
二、實驗數據採集
1. 實驗的方案
設置麥克陣列在相距滑軌不同的距離下,控制揚聲器從左移動到右,每個位置下發出Chirp聲音。接收並存儲該聲音數據。
麥克與滑軌之間的距離
1. Chirp聲音參數:頻率250~2000Hz;時間長度0.2048秒;採樣頻率10kHz;
2. 滑軌移動參數:方向是從遠端移動到近端。移動100次,控制指令中移動步長爲115。
3. 麥克風與滑軌距離:距離分別設置在90釐米,50釐米,25釐米。總共採集三組數據。
4. 採集數據格式每個位置數據包括有100組數據,每組數據爲(d1,d2, sd, rd1, rd2)
其中:d1,d2:是按照27.7攝氏度下聲速計算出來的左右兩個聲道距離聲源的距離;
sd:發送信號的原始數據; rd1,rd2:是接受到的左右兩個聲道的原始聲音數據。數據的長度爲2048。
d1,d2數據處理算法代碼:
AMBIENT_TEMPERATURE = 27.7
def soundspeed(temperature = 25):
return 331.4+0.6*temperature
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]
datalen = len(send)
sendspace = zeros(datalen*2)
sendspace[0:datalen] = send
recespace = zeros(datalen*2)
recespace[0:datalen] = rece
tempfft = fft.fft(sendspace) * conj(fft.fft(recespace))
expandfft = zeros(datalen*2*interptime, dtype=complex64)
expandfft[0:datalen] = tempfft[0:datalen]
expandfft[-datalen:] = tempfft[datalen:]
cor = list(fft.ifft(expandfft).real)
maxpos = cor.index(max(cor))
return (4096 * interptime - maxpos) / interptime * soundspeed(AMBIENT_TEMPERATURE) * 0.1e-3
2. 實驗數據
每個位置的數據中,d1,d2數量比較小,下面分別給出了三個位置下,d1,d2的波形和數據。原始的sd,rd1,rd2由於維度(2048維)比較大,可以在下載資源裏進行下載。
1. 在一米處的採集數據
在1米處採集到的D1,D2數據
在實際處理中,估計相關位置進行插值,插值倍數取20。
d1=[1.2946344, 1.2946344, 1.2894141, 1.2859339, 1.2824537, 1.2789735, 1.2754933, 1.2720131, 1.2685329, 1.2650527, 1.2615725, 1.2580923, 1.2546121, 1.2511319, 1.2476517, 1.2459116, 1.2424314, 1.2406913, 1.2372111, 1.235471, 1.2319908, 1.2302507, 1.2267705, 1.2250304, 1.2232903, 1.2198101, 1.21807, 1.2163299, 1.2145898, 1.2128497, 1.2111096, 1.2093695, 1.2076294, 1.2058893, 1.2041492, 1.200669, 1.1989289, 1.1971888, 1.1954487, 1.1937086, 1.1902284, 1.1884883, 1.1867482, 1.1850081, 1.183268, 1.183268, 1.1815279, 1.1797878, 1.1850081, 1.1763076, 1.1745675, 1.1745675, 1.1728274, 1.1728274, 1.1710873, 1.1710873, 1.1693472, 1.1693472, 1.1693472, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.165867, 1.165867, 1.165867, 1.165867, 1.165867, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1676071, 1.1693472, 1.1693472, 1.1710873, 1.1710873, 1.1728274, 1.1728274, 1.1745675, 1.1763076, 1.1780477, 1.1797878, 1.183268, 1.1867482, 1.1902284, 1.1919685]
d2=[1.1971888, 1.1989289, 1.1954487, 1.1937086, 1.1919685, 1.1902284, 1.1884883, 1.1867482, 1.1850081, 1.1815279, 1.1797878, 1.1797878, 1.1780477, 1.1763076, 1.1745675, 1.1728274, 1.1728274, 1.1728274, 1.1710873, 1.1693472, 1.1693472, 1.1693472, 1.1676071, 1.165867, 1.1676071, 1.165867, 1.165867, 1.1641269, 1.1641269, 1.1641269, 1.1641269, 1.1623868, 1.1623868, 1.1623868, 1.1623868, 1.1623868, 1.1623868, 1.1623868, 1.1623868, 1.1623868, 1.1641269, 1.1641269, 1.1641269, 1.165867, 1.165867, 1.1676071, 1.1676071, 1.1693472, 1.1763076, 1.1710873, 1.1710873, 1.1745675, 1.1763076, 1.1780477, 1.1797878, 1.1815279, 1.183268, 1.1850081, 1.1867482, 1.1884883, 1.1902284, 1.1902284, 1.1937086, 1.1937086, 1.1954487, 1.1971888, 1.1989289, 1.200669, 1.200669, 1.2024091, 1.2041492, 1.2058893, 1.2093695, 1.2111096, 1.2128497, 1.2145898, 1.21807, 1.21807, 1.2215502, 1.2232903, 1.2250304, 1.2267705, 1.2285106, 1.2302507, 1.2302507, 1.2319908, 1.235471, 1.2372111, 1.2406913, 1.2441715, 1.2476517, 1.2511319, 1.2546121, 1.2580923, 1.2598324, 1.2633126, 1.2633126, 1.2667928, 1.270273, 1.2737532]
2. 在50釐米處採集的數據
在50釐米處採集到的D1,D2數據
d1=[0.9883767999999998, 0.9883767999999998, 0.9831564999999999, 0.9779361999999999, 0.9709758000000001, 0.9657555000000001, 0.9622753, 0.957055, 0.9518347, 0.9466143999999999, 0.9413940999999999, 0.9361738, 0.9309535, 0.9257332, 0.9222529999999999, 0.9187728, 0.9135525, 0.9083322, 0.9048520000000001, 0.8996317000000001, 0.8961515, 0.8926713000000001, 0.8891911, 0.8857108999999999, 0.8804905999999999, 0.8770104, 0.8735302, 0.87005, 0.8665698, 0.8648297, 0.8613495, 0.8596094, 0.8561292, 0.8543891, 0.8509089000000001, 0.8474287, 0.8439484999999999, 0.8422084, 0.8387281999999999, 0.835248, 0.8335079, 0.8317678000000001, 0.8300277, 0.8282876, 0.8265475000000001, 0.8230673, 0.8213272000000001, 0.8195871, 0.817847, 0.8143668, 0.8126267, 0.8108866, 0.8091465, 0.8074064, 0.8056663, 0.8039262, 0.8021861, 0.800446, 0.800446, 0.7987059, 0.7987059, 0.7969658, 0.7969658, 0.7969658, 0.7969658, 0.7969658, 0.7969658, 0.7969658, 0.7969658, 0.7969658, 0.7987059, 0.7987059, 0.7987059, 0.7987059, 0.7987059, 0.800446, 0.7987059, 0.800446, 0.8021861, 0.8021861, 0.8039262, 0.8039262, 0.8056663, 0.8074064, 0.8108866, 0.8126267, 0.8143668, 0.8161069, 0.817847, 0.8195871, 0.8213272000000001, 0.8230673, 0.8248073999999999, 0.8265475000000001, 0.8282876, 0.8300277, 0.8335079, 0.835248, 0.8404683, 0.8422084]
d2=[0.835248, 0.8335079, 0.8317678000000001, 0.8282876, 0.8265475000000001, 0.8248073999999999, 0.8230673, 0.8195871, 0.8161069, 0.8126267, 0.8091465, 0.8074064, 0.8039262, 0.800446, 0.7987059, 0.7969658, 0.7952257, 0.7934856, 0.7917455, 0.7900054, 0.7882653, 0.7865252, 0.7847851, 0.783045, 0.7813049, 0.7813049, 0.7795648, 0.7795648, 0.7795648, 0.7778247, 0.7778247, 0.7778247, 0.7778247, 0.7760846, 0.7778247, 0.7778247, 0.7778247, 0.7795648, 0.7795648, 0.7813049, 0.7813049, 0.7813049, 0.7813049, 0.7813049, 0.783045, 0.7847851, 0.7847851, 0.7865252, 0.7882653, 0.7900054, 0.7934856, 0.7952257, 0.7987059, 0.8021861, 0.8056663, 0.8108866, 0.8143668, 0.8161069, 0.8195871, 0.8213272000000001, 0.8248073999999999, 0.8265475000000001, 0.8282876, 0.8317678000000001, 0.835248, 0.8387281999999999, 0.8422084, 0.8456886000000001, 0.8491687999999998, 0.8509089000000001, 0.852649, 0.8561292, 0.8596094, 0.8613495, 0.8665698, 0.87005, 0.8735302, 0.8770104, 0.8804905999999999, 0.8839708, 0.8874510000000001, 0.8909312, 0.8944114, 0.8996317000000001, 0.9048520000000001, 0.9083322, 0.9118124000000001, 0.9152926, 0.9187728, 0.9222529999999999, 0.9274732999999998, 0.9344337, 0.939654, 0.9466143999999999, 0.9518347, 0.957055, 0.9605352000000001, 0.9657555000000001, 0.9727159, 0.9761961]
3. 在25釐米處採集的數據
在25釐米處接收到的D1,D2的數據
d1=[0.8543891, 0.852649, 0.8474287, 0.8422084, 0.8369881, 0.8335079, 0.8265475000000001, 0.8195871, 0.8126267, 0.8074064, 0.8021861, 0.7952257, 0.7865252, 0.7778247, 0.7708643, 0.7673841, 0.7621638, 0.7552034, 0.7447628, 0.7360623, 0.730842, 0.7291019, 0.7256217, 0.7186613, 0.7082207, 0.6995202, 0.6925598, 0.6890796, 0.6855994, 0.6803791, 0.6734187, 0.6629781, 0.6542776, 0.6490573, 0.643837, 0.6368766, 0.6299162, 0.6229558, 0.6142553, 0.6055548, 0.5985944, 0.591634, 0.5829335, 0.5759731, 0.5707528, 0.5655325, 0.5620523, 0.556832, 0.5533518000000001, 0.5481315, 0.5411711, 0.5359508000000001, 0.5324706, 0.5289904, 0.5255102, 0.5237701, 0.5202899, 0.5185498, 0.5150696, 0.5115894, 0.5081092, 0.5063691, 0.5028889, 0.5011488000000001, 0.4994087, 0.4959285, 0.4959285, 0.4941883999999999, 0.49244830000000006, 0.49244830000000006, 0.4907082, 0.4907082, 0.4907082, 0.4907082, 0.4907082, 0.4907082, 0.4907082, 0.4907082, 0.49244830000000006, 0.49244830000000006, 0.4941883999999999, 0.4959285, 0.4994087, 0.5011488000000001, 0.504629, 0.5133295, 0.5115894, 0.5150696, 0.5168097, 0.5185498, 0.5202899, 0.52203, 0.5255102, 0.5289904, 0.5342107, 0.539431, 0.5429111999999999, 0.5481315, 0.5516116999999999, 0.5533518000000001]
d2=[0.6194756, 0.6194756, 0.6142553, 0.609035, 0.6038147, 0.5968543, 0.5898939, 0.5811934, 0.574233, 0.5690127, 0.5655325, 0.5603122, 0.5585721, 0.5550919, 0.5498716, 0.5446513000000001, 0.539431, 0.5342107, 0.5307305, 0.5289904, 0.5255102, 0.5237701, 0.5202899, 0.5185498, 0.5168097, 0.5150696, 0.5115894, 0.5098493, 0.5063691, 0.504629, 0.5028889, 0.5011488000000001, 0.4994087, 0.4976686, 0.4959285, 0.4959285, 0.4941883999999999, 0.4941883999999999, 0.4941883999999999, 0.4941883999999999, 0.4941883999999999, 0.4959285, 0.4959285, 0.4976686, 0.4994087, 0.5011488000000001, 0.5028889, 0.5028889, 0.5063691, 0.5081092, 0.5098493, 0.5115894, 0.5150696, 0.5185498, 0.52203, 0.5255102, 0.5307305, 0.5342107, 0.539431, 0.5429111999999999, 0.5463914, 0.5498716, 0.5550919, 0.5603122, 0.5655325, 0.5690127, 0.574233, 0.5794533, 0.5846736, 0.5898939, 0.5951142, 0.6020746, 0.609035, 0.6125152, 0.6212157, 0.6281761, 0.6333964, 0.6386167, 0.6455771, 0.6507974, 0.6594979, 0.6681984, 0.6734187, 0.678639, 0.6838593, 0.69604, 0.6995202, 0.7047405, 0.7117009, 0.7169212, 0.7221415, 0.7291019, 0.7360623, 0.7465029, 0.7534633, 0.7586836, 0.7639039, 0.7708643, 0.7795648, 0.7865252]
三、數據分析
1. 實驗數據理論模型
根據勾股定理,聲源在滑軌上的移動距離和接收聲音的麥克風之間的距離爲:
滑塊移動距離與聲源和接收傳感器之間的距離關係
下圖就是在x0=50, y1=25, x1在[0,100]範圍內,L1與x1之間的關係:
橫向運動距離 與直線距離之間的關係曲線
2. 實驗數據參數估計方法
1. 分析模型已知和未知參數
從前面實驗所得到的不同位置的d1,d2數據曲線來看,它們都大體呈現與上面理論模型相近的性質。只是在實驗中粗略的知道y1,x0,x1的數據,實際上測量並不精確。再加上實驗中聲速也是一個變化量,所以直接使用原始數據來驗證它是否符合理論模型就會有困難。
下面先假設數據符合上面的理論模型,然後在對未知的x0, y1, x1進行估計,然後再驗證模型的精確性。
在這裏先假設以下兩點是準確的:
(1)滑軌是直線的;滑軌移動距離是可以實現測量得到的,它等於:。
(2)每個數據點都是在起始點和終止點之間的均勻採樣。假設起始點,終止點。
(3)採集數據的個數N=100,數據爲:
這個數據時通過聲音傳播速度計算得到的,它與真實距離之間相差一個比例,即:
然後通過採集所得到的數據擬合下面的公式:
未知參數包括有:。
2. 模型優化算法
模型優化算法採用python中的scipy.optimize優化工具完成模型參數估計。下面給出了相應的參考代碼。
#------------------------------------------------------------
N = 100
xstart = 0
xstop = 0.7 # as delta D
def distfunc(x, a, x0, y1):
x1n = (xstop-xstart) * x / (N-1) + xstart
return sqrt((x1n-x0)**2 + y1**2) / a
#------------------------------------------------------------
d1, d2 = dataall2lr(dataall2) # Read the L from the data file
x = linspace(0, N, N, endpoint=False)
fit_params, pcov = scipy.optimize.curve_fit(distfunc, x, d1)
3. 參數估計結果分析
1. 在1米處的數據進行參數估計
使用左右兩個聲道的距離完成估計的參數分別是:
- 左聲道:a=0.8857, x0=0.5006, y1=1.0319
- 右聲道:a=0.8958,x0=0.2341, y1=1.0445
兩個聲道的數據是同時測量的,測量的條件相似,它們的距離比例因子a的數值基本相同,大約在0.9左右。
兩個聲道的x0相差大約爲0.266米,這與直接使用鋼尺測量兩個麥克風的中心位置距離0.265米在誤差範圍1mm內是相同的;
由於兩個麥克風擺放位置是平行與滑軌,所以它們距離滑軌的距離y0應該是相同的,它們的結果反映了這一點。由於實際測兩個麥克風與滑軌的距離爲0.9日左右,所以將y1乘以距離因子a,則等於:。這就與實際距離相吻合了。
兩個聲道數據和參數估計後擬合數據
2. 在0.5米處的數據處理
使用左右兩個聲道的距離完成估計的參數分別是:
- 左聲道:a=0.8145, x0=0.4787, y1=0.6492
- 右聲道:a=0.7907,x0=0.2326, y1=0.6177
左右兩個聲道原始數據和參數估計後的擬合數據
3. 在0.25米處的數據處理
使用左右兩個聲道的距離完成估計的參數分別是:
- 左聲道:a=0.7180, x0=0.5241, y1=0.354
- 右聲道:a=0.7039,x0=0.2644, y1=0.349
左右兩個聲道原始數據和參數估計後的擬合數據
4. 聲音測距因子
(1)實驗結果中聲音測距因子存在的問題
前面使用了基於理論模型參數估計的方法,從直線滑軌採集的數據中獲得了實際滑軌和拾音麥克之間的相對位置(x0,y1),但是有一個參數:聲音測距因子 a 在每組數據都各不相同。a 反映了通過聲音延遲所獲得的距離與實際距離之間的差別比例。
如果這個因子僅僅是由於利用空氣聲音傳播速度、採樣時間延遲等因素所造成的,那麼因子a的數值有兩點問題:
(1)因子a的數值不會這麼大。空氣聲音傳播速度會因爲溫度不同而變化,但是在室溫條件下,這個變化範圍不會超過5%。按照實際測量的溫度相差十度來估算的誤差範圍;考慮到採樣系統中AD,DA延遲,它們都在十幾個微秒的範圍,所造成的距離誤差在幾個毫米。
(2)在三個不同的位置所測量得到的距離因子 a 它們應該相同,但實際上,三個位置上的 a各不相同。
分析造成聲音測距因子的來源應該是地面反射聲波的影響。
(2)考慮地面反射波的影響
假設麥克風距離地面高度爲,揚聲器距離地面的高度爲,它們之間的水平距離爲。
麥克與揚聲器之間的直線距離:
麥克與揚聲器之間的位置關係
地面反射波在地面的反射點距離麥克的距離爲,距離揚聲器的距離爲。那麼:
再根據反射波的入射角與出射角相同,則有:
那麼可以得到:
反射距離爲:
猜測實際聲波傳送的距離應該是和的某種加權平均。
根據前面實驗中的數據:=0.15m,=0.12m。下面分別列些出在0.9m,0.5m,0.25m的情況下,,的取值:
序號 | L2,L3平均值 | |||
---|---|---|---|---|
1 | 0.9 | 0.9005 | 0.9396 | 0.92 |
2 | 0.5 | 0.5009 | 0.5682 | 0.54 |
3 | 0.25 | 0.252 | 0.3680 | 0.31 |
從上面表格中可以看到在相距0.9,0.5,0.25米的距離上,直接傳播距離L2,反射波傳播距離L3都比L1大。在這裏取L1與L3的比值來計算一下距離因子 a,可以得到三個距離下的距離因子a:
序號 | a=/ | 數據擬閤中的a | ||
---|---|---|---|---|
1 | 0.9 | 0.9396 | 0.9578 | 0.9 |
2 | 0.5 | 0.5682 | 0.88 | 0.8 |
3 | 0.25 | 0.368 | 0.679 | 0.7 |
在等於0.25米是,對應的計算因子與實際數據擬閤中的a相接近,但其它位置的a都相差較遠。
具體的差別現在還需要進一步分析和探索。