基於BP神經網絡的室內聲源定位算法(附有程序)

基於BP神經網絡的室內聲源定位算法的實現(附有程序)

  • 問題描述
    現在有一個安靜的房子,有一個人在房間裏走動,我要利用屋裏的麥克風接收這個人的腳步聲,然後對這個人進行定位。
  • 研究的意義
    聲源定位可以克服視覺定位的缺點,對看不見的地方也可以定位,在機器人追蹤與探測方面得到了很好的應用。室內聲源定位被廣泛應用於視頻會議、智能家居、車載通話設備等場景中。特別是在人工智能時代,結合機器學習和深度學習,室內聲源定位問題的應用價值變得非常大。
  • 問題的研究方法
    目前解決這個問題的主流方法有三個,分別是基於最大輸出功率的可控波束形成技術、基於高分辨率譜估計技術、基於聲達時間差的定位技術。這三種方法都是通過研究聲音的物理性質,建立相應的方程,然後進行求解,過程複雜,求解難度高。
    基於上述原因,本文從人工智能的角度考慮,我們把聲音在室內空間的混亂場當成一個黑匣子,只分析輸入輸出的數據特徵,從而找到普遍的規律,達到解決問題的目的。本文利用的人工智能算法是BP神經網絡算法,下面將按照正常人的邏輯思維順序,一步一步介紹算法的實現。
  • 摘要
    本文設計了離線採樣方案,構建了隱含層爲7個神經元的網絡結構,利用 LevenBerg-Marquardt的BP算法作爲訓練函數,編寫了matlab程序用模擬定位,實現了在100平方米的房子裏,只需要採樣100組數據進行機器訓練,就可以將定位誤差控制在幾釐米的效果。
  • 模型的建立
    (1)離線採樣方案
    在建立神經網絡之前,我們要先設計出採樣模型,分別得到輸入數據和輸出數據的形式,才能具體的設計神經網絡,因此,下面先設計採樣模型,再設計網絡模型。
    在這裏插入圖片描述
    如上圖所示,我先對將地面劃分爲n個小區域,用發聲裝置分別在每一個小區域的中心點座標處發聲一次,每發聲一次,就用四個麥克風記錄下時間差,,只需要三個時間差即可,分別爲
    在這裏插入圖片描述
    這樣,我們能得到n組數據,第i組數據如下所示:
    在這裏插入圖片描述
    其中x_i,y_i分別代表地面橫座標值和縱座標值。這n組數據就可以作爲BP神經網絡的訓練數據,離線採樣操作就完成了。
    (2)BP神經網絡的構建
    離線採樣之後,我們就可以構建BP神經網絡了。因爲輸入數據是三個分量,輸出數據是兩個分量,所以構建的BP神經網絡的輸入層與輸出層分別是三個單位和兩個單位。通過不斷測試,我得出當隱含層含有7個神經元時,預測結果最佳。網絡結構如下圖所示。
    在這裏插入圖片描述
    構建了神經網絡的結構,接下來我們要確定的是使用什麼激活函數,訓練算法和性能函數。在一般情況下,隱含層都是用S形激活函數,輸出層都是用線性激活函數,此處的用法也是如此。由於用梯度下降法訓練函數構建的網絡速度比較慢,而基於LevenBerg-Marquardt算法的訓練網絡的速度非常快,所以我們使用LevenBerg-Marquardt的BP算法訓練函數。由於我們要考慮的是網絡的整體性能,所以我們使用的性能函數是均方誤差函數。
  • 數值模擬訓練和定位測試
    不妨假設房子是個標準的長方體,它的長、寬、高分別爲10米、10米、5米,四個麥克風在空間中構成一個四面體,假設四個麥克風在空間的座標分別爲A(4.9,4.9,1.0)、B(4.9,5.1,1.0)、C(5.1,5.1,1.0),D(5.0,5.0,2.0)。地面面積爲100平方米,取每一個小區域面積爲1平方米,則可得到100組訓練數據。將這100組訓練數據用BP神經網絡算法進行機器學習之後,下面就可以用BP神經網絡進行定位測試了。
    接下來我們就可以想一下怎麼進行定位測試了,首先,我們將聲源隨機放置在房間中,即用計算機模擬一個的隨機位置座標,然後根據聲音的傳播速度,可以求出各個麥克風首次接受到聲音的時間差,將這組時間差作爲定位測試的輸入數據,用已經訓練好的BP神經網絡進行預測,得到預測值,然後再分析預測位置與真實位置的誤差。
    在100平方米的房間裏,我們只用了100組訓練數據,重複10次定位操作,得到的預測位置與實際位置的關係如下表所示。
    測試次數 聲源的實際位置 BP神經網絡的預測位置
    在這裏插入圖片描述
    誤差分析如下圖所示。
    在這裏插入圖片描述
    機器訓練的結果分析如下圖所示。
    在這裏插入圖片描述
    可以看出,用BP神經網絡算法對100平方米的室內進行聲源定位,只需要採集100組訓練數據,就可以使預測位置與實際位置的誤差只有幾釐米。從機器訓練的結果可以看出,整個定位過程所用時間非常短,收斂速非常快,均方誤差已經達到了4×10^(-6)米。
  • matlab程序代碼
%% 清空環境變量
clc
clear
%% 生成訓練數據與預測數據
%%%訓練數據
A=[4.9,4.9,1];%%%麥克風A的座標
B=[4.9,5.1,1];%%%麥克風B的座標
C=[5.1,5.1,1];%%%麥克風C的座標
D=[5.0,5.0,2];%%%麥克風D的座標
%x=0.5:1:9.5;y=0.5:1:9.5;%%%用100組數據訓練
x=0.5:0.5:10;y=0.5:0.5:10;%%%用400組數據訓練
[X,Y]=meshgrid(x,y);
tAB=(sqrt((A(1)-X).^2+(A(2)-Y).^2+A(3).^2)-sqrt((B(1)-X).^2+(B(2)-Y).^2+B(3).^2)); %%%聲源到A,B兩個麥克風的時間差,下同
tBC=(sqrt((B(1)-X).^2+(B(2)-Y).^2+B(3).^2)-sqrt((C(1)-X).^2+(C(2)-Y).^2+C(3).^2));
tCD=(sqrt((C(1)-X).^2+(C(2)-Y).^2+C(3).^2)-sqrt((D(1)-X).^2+(D(2)-Y).^2+D(3).^2));
ttAB=tAB(:)';
ttBC=tBC(:)';
ttCD=tCD(:)';
input_train=[ttAB;ttBC;ttCD];%%%訓練數據的輸入值(是麥克風接受聲音的時間差)
XX=X(:)';
YY=Y(:)';
output_train=[XX;YY];%%%訓練數據的輸出值(是位置座標)
%%%預測數據
m=10;   %%%預測m個位置(就是分別將聲源放到m個位置,用BP神經網絡算法預測,然後對比預測結果和實際結果)
X=rand(1,m)*10;
Y=rand(1,m)*10;
tAB=(sqrt((A(1)-X).^2+(A(2)-Y).^2+A(3).^2)-sqrt((B(1)-X).^2+(B(2)-Y).^2+B(3).^2));
tBC=(sqrt((B(1)-X).^2+(B(2)-Y).^2+B(3).^2)-sqrt((C(1)-X).^2+(C(2)-Y).^2+C(3).^2));
tCD=(sqrt((C(1)-X).^2+(C(2)-Y).^2+C(3).^2)-sqrt((D(1)-X).^2+(D(2)-Y).^2+D(3).^2));
input_test=[tAB;tBC;tCD];%%%預測數據的輸入值(是麥克風接受聲音的時間差)
real_locate=[X;Y];%%%真實的聲源座標,用於檢驗預測值是否正確
%% 數據歸一化
[inputn,inputps]=mapminmax(input_train);  %%%其中inputps是用於記錄數據歸一化方法
[outputn,outputps]=mapminmax(output_train);   %%%outputps同理
%% BP網絡訓練
% %初始化網絡結構
net=newff(inputn,outputn,7);%%%建立一個由7個神經元組成的隱藏層構成了一個網絡,這是新版matlab的用法
net.trainParam.epochs=5000;%%%最大迭代次數
net.trainParam.lr=0.1;%%%學習率
net.trainParam.goal=0.000004;%%%目標誤差
net.trainParam.max_fail=10000;
%網絡訓練
net=train(net,inputn,outputn);
%% BP網絡預測
%預測數據歸一化
inputn_test=mapminmax('apply',input_test,inputps);%%%對測試數據再進行數據歸一化,之前是對訓練數據進行數據歸一化,而且歸一化方式和前面的一樣
 
%網絡預測輸出
an=sim(net,inputn_test);   %訓練輸出的結果
 
%網絡輸出反歸一化
BPoutput=mapminmax('reverse',an,outputps);%%反歸一化得到實際結果
%% 結果分析
for i=1:m
fprintf('第%d 次測試的實際位置是:(%d,%d)',i,real_locate(:,i));fprintf('\n');
fprintf('BP神經網絡預測位置是:(%d,%d)',BPoutput(:,i));fprintf('\n');
end
%%%畫圖
plot(real_locate(1,:),real_locate(2,:),'*')
hold on
plot(BPoutput(1,:),BPoutput(2,:),'o')
legend('實際位置','預測位置')
title('BP網絡預測輸出','fontsize',12)
ylabel('Y方向','fontsize',12)
xlabel('X方向','fontsize',12)
%%%誤差分析(預測位置的分量與實際位置的分量做差取絕對值再相加)
figure(2)
r=real_locate-BPoutput;
r=abs(r(1,:))+abs(r(2,:));
plot(r,'-*')
title('BP網絡預測誤差','fontsize',12)
legend('誤差')
ylabel('誤差(單位/米)','fontsize',12)
xlabel('位置','fontsize',12)

本來想給你上傳程序文件的,但是我還不會怎麼上傳了程序文件,所以等我之後上傳了再來這裏給鏈接吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章