基於MATLAB的遠程聲控小車的系統設計與仿真

寫在前面

在本篇中將利用MATLAB設計一個遠程聲控小車系統並仿真,整體難度並不大,關鍵要理清信息的傳輸過程,理解信源和信道編碼的意義等等,在課堂上學到的香農信息論等內容都是偏向於理論方面且比較抽象,親自動手進行設計對這些理論的理解還是有蠻大的幫助的。
如果你對信通或電子科學方面感興趣或是正在進行這方面的本科學習,可以去看一下我整理的這篇對信息與電子方向部分本科項目的總結(持續更新中),也許某些課程或是科研項目的總結能對你有所幫助。



1 設計目標與問題分解

1.1 設計目標

完成遠程聲控小車系統設計與實現,需要採集語音控制信號並在適當壓縮後發出,通過噪聲信道傳輸,在小車接收端進行接收識別,進而控制小車在平面上運動。

1.2 問題分解

該目標可以分爲以下幾步進行設計:

  1. 採集聲音信號,並對聲音指示信號進行一定的壓縮,即選擇合適的編碼方式進行信源編碼;
  2. 爲了減小傳輸過程中噪聲的影響,需要選擇合適的編碼方式進行信道編碼並進行調製;
  3. 需要設計噪聲信道,在調製後的信息內加入噪聲;
  4. 需要在接收端接收信號並進行解調、信道解碼、信源解碼,重新將其轉換成聲音指示信號;
  5. 需要進行聲音控制信號類型的識別,並將聲音控制信號轉換爲相應的數字指示信號;
  6. 需要設計小車的控制系統,能根據指示信號做出反應並且保證系統具有可觀能控性;


2 解決思路

根據問題分解,可設計流程圖如下,
流程圖
接下去將使用MATLAB軟件進行實現,進行分步處理。

2.1 信源編碼和解碼部分

爲了對輸入的消息進行適當壓縮,要選用合適的編碼方式,本次設計中對信號採用PCM的A律13折線法。
PCM(Pulse Code Modulation)脈衝編碼調製是數字通信的編碼方式之一。主要過程是對語音等模擬信號採樣使其離散化後將抽樣值按分層單位四捨五入取整量化,同時將抽樣值按一組二進制碼來表示抽樣脈衝的幅值。A律13折線法即爲將y軸等分成8份,而x軸按1/2比逐次縮小化取值,總共連成8個轉折點,由於第一個點斜率不需要考慮,因此只考慮7點,算上y軸左側就有14點。同時最左側和最右側的線段斜率相同,因此只需考慮13點爲量化標準。
由於採用電腦仿真,因此在讀取文件時已經完成了語音信號的採樣,只需要進行幅值量化即可,同時對信號的幅值進行量化的這一過程也可以看作是對源信息的壓縮,因爲量化後表示某個小數所需要的二進制碼比特數大概率會減小很多。

2.2 信道編碼和解碼部分

爲了方便,本次設計採用3位重複編碼,即1->111,0->000,此時可計算得編碼速率爲1/3,可以對1bit進行糾錯。
信道解碼如下表,
信道編碼表
可見此信道編碼方式只能檢測一位錯誤,當三位中有兩位或以上產生錯誤時結果將出錯,會影響最終解碼。


2.3 噪聲信道部分

對於噪聲信道部分,由於缺乏相應的設備,只能通過MATLAB來仿真噪聲信道,通過將白噪聲加入傳輸信號來模擬;

2.4 聲音信號識別部分

對於輸入的音頻信號,可以利用MATLAB內部函數來計算聲音特徵,並與先前存儲的標準音頻進行比對,將相似度最高的一項作爲配對結果,將其轉化爲該項所對應的消息,完成聲音控制信號到數字控制信號的轉換。其中語音消息和數字信號對照表如下,
語音消息轉換表

2.5 控制器部分

控制系統也由MATLAB模擬,通過輸出相應的結果來查看控制效果,用平面內的所有整數座標點作爲小車的活動區域,小車當前所處狀態即爲當前座標,可以設計聲控小車的語音消息和對應執行命令如下,
控制命令轉換表
能控性證明
顯然,由以上的命令表可知,小車可以前往平面內任意整數座標位置,也可以從任意初始位置經過一系列操作後仍能回到原位置,即證明了該系統是能控的。
能觀性證明
輸入將以規定運動軌跡的方式來控制小車運動,因此可以通過當前輸入以及小車最終所處位置來反推出初始狀態,即根據輸入從終點開始反向繪製運動軌跡就可以找到初始位置,故該系統爲能觀的。







3 實現過程及每步實現結果

3.1 信源和信道編碼模塊

按照解決思路內的原理可完成PCM編碼的MATLAB代碼,如果覺得比較困難的話可以參考這篇文章《基於 MATLAB 的 PCM 編碼解碼實現》。信道編碼的實現則相對比較簡單,在輸入的信號中添加冗餘項即重複三位,解碼時每隔三位識別和是否大於2即可。
考慮到音頻文件在MATLAB內讀取時會自動被採樣爲離散的數字信號,因此在測試時的輸入設置爲:xm4a=2*rand(1,100)-1;%隨機產生(-1,1)的數字序列。部分測試代碼和結果截圖如下,
編碼解碼
可見信源和信道的編碼和解碼均正常進行,其中miss代表信源和解碼信號的歐氏距離,從中可見前後信號差距不大,體現該編碼方式失真度較低,並且由對信號的幅度值進行了量化,因此起到了很好的壓縮效果,便於傳輸。信源和信道的編碼解碼設計成功。

3.2 調製解調模塊

此處將採用QPSK調製,由於信道編碼後的序列爲二進制,爲充分發揮QPSK效果,需要將其進行兩兩分組從而轉爲四進制,此時可以利用reshape函數將信道編碼後的序列的維度從1*n轉爲(n/2)*2,再利用bi2de函數將每一行的兩個二進制碼轉爲10進制,即可完成二-四進制間的轉換,之後使用pskmod和pskdemod函數進行QPSK調製與解調,再轉回二進制碼序列。
具體模塊的MATLAB代碼如下,

%QPSK調製
x=bi2de((reshape(xch,2,length(xch)/2))');
yout = pskmod(x,4);
%QPSK解調
yin=pskdemod(yout,4);
ydein=reshape(de2bi(yin,2)',1,length(yin)*2);

測試結果如下,左圖爲星座圖,右圖爲調製和解調調製信號的對比,可見調製與解調過程正常進行,結果正確。
調製解調

3.3 噪聲模塊

該部分可以直接採用MATLAB內部awgn函數來模擬,此時即可將噪聲加入進行測試,測試代碼和結果如下,
在這裏插入圖片描述
圖中左側工作區的M代表誤碼數,R代表誤碼率,從中可以看出,對於隨機生成的這10000個消息,經過信源和信道編碼後變爲24000bits的二進制信號,該二進制在通過信噪比爲3dB的噪聲信道後,有26967bits受噪聲影響出錯了,因此錯誤率爲11.24%,會對最後的解碼有一定影響。可見大多數信號在經過該噪聲信道後仍能保持正確的信息。
同時針對不同信噪比進行分析,作出如下圖象,可見隨着信噪比的提升,錯誤率逐漸下降至趨於0,與理論情況相符合,並且在信噪比10dB時已經幾乎不會出錯。

噪聲與誤碼
至此,對信息傳輸過程的設計與實現部分已成功完成,接下來是處理。



3.4 聲音信號處理模塊

該部分最關鍵的是要進行語音識別,具體實現如下。
先錄製幾段標準聲音文件作爲對輸入音頻進行配對用的音頻信號,並存儲在電腦內。
採集聲音信號爲m4a文件,利用MATLAB內部audioread()函數來進行聲音-數字信號的轉換,其後利用MATLAB的工具箱voicebox內的melcepst函數來計算輸入音頻的語音特徵梅爾頻率倒譜系數(MFCC),此處voicebox不是MATLAB安裝時自帶的,需要另行下載。
當輸入爲單個音頻控制信號時,用dtw函數來計算輸入信號MFCC與先前存儲的標準聲音文件的MFCC的差距,將兩者作爲dtw函數的兩個輸入,輸出的值越小則說明匹配度越高,並選擇能使得dtw輸出最小的一個標準聲音文件與輸入配對,至此,語音識別完成。需要注意的是,dtw的輸入必須維度相同,因此要對音頻進行長度上的對齊。
在完成語音識別後,即可將輸入音頻轉化爲與所匹配的標準音頻所對應的消息。
當輸入爲多個音頻控制信號時,只需將其在時域上進行一段段的劃分,分別進行MFCC的計算和與標準音頻的匹配,即可完成對多個音頻控制信號的轉化。
下面以“東”,“南”,“西”,“北”的音頻爲例演示語音識別模塊:
文件2爲“東”,文件1爲“東”的標準聲音文件,文件4爲“西”,文件3爲“西”的標準聲音文件,文件6爲“南”,文件5爲“南”的標準聲音文件,文件8爲“北”,文件7爲“北”的標準聲音文件,MATLAB主體代碼如下,






音頻
運行後結果如下,可以看出,與文件2匹配度最高的爲文件1,與文件4匹配度最高的爲文件3,與文件6匹配度最高的爲文件5,與文件8匹配度最高的爲文件7,即“東”,“南”,“西”,“北”的音頻均識別正確。在這裏插入圖片描述
在此基礎上稍作修改即可完成音頻信息與數字控制消息間的轉化。

3.5 控制模塊

在仿真中假設地圖滿足上北下南左西右東的規則,設計控制器MATLAB代碼mov.m定義爲:function [destination,line] = mov(decode,start)%返回目的地和路徑
因爲此處只涉及平移的操作,實現起來較爲簡單,直接利用case語句寫即可,所以不再贅述。

3.6 系統整體實現

根據前面的分析可以來撰寫整體的代碼。對輸入設置如下,

%輸入聲音文件,內部每2s一個聲音信號,每個信號有效長度在0.5s以內,順序爲北-東北-東-東南-南-西南-西-西北,旋轉一圈
xdig=m4a2xdig('C:\Users\46817\Desktop\m4a\序列.m4a');

運行結果如下,
結果
從結果可見小車成功按照語音控制信號的指示路徑轉了一圈,回到了起點。遠程聲音控制系統設計成功。
由於收集大量音頻信號工作量比較大,此處在MATLAB內隨機挑選八個方向的音頻信號共100次並將結果整合成一個向量來作爲輸入進行整體系統性能的測試,實現代碼如下,


for i=1:100
j=randi([1 8]);
tem(i,:)=orim4a(j,:);%orim4a內爲各音頻信號
end
xm4a=reshape(tem',1,100*length(orim4a));

仿真結果如下所示,從圖中可見此小車路徑中沒有出現紅色箭頭,並且實際終點與正確終點相重合,因此遠端消息對小車進行了準確的控制操作,因此所設計系統對大量輸入也能正確進行遠程控制,設計成功。
結果
當信噪比較小例如1dB時,控制信號在傳輸時可能會受噪聲影響而出錯,造成如下結果,可見有很多路徑出現了紅色箭頭,即識別出錯,最後的終點也與正確終點不同,因此該系統對信道的噪聲有一定要求。
結果
至此,遠程聲音控制系統仿真完成。
此處附上整體實現代碼




clc;clear;close all;
%%輸入
%輸入聲音文件,內部每2s一個聲音信號,每個信號有效長度在0.5s以內,順序爲北-東北-東-東南-南-西南-西-西北,旋轉一圈
[xm4a,fs]=audioread('');
%%
%編碼和調製模塊
%信源PCM編碼
xso=soencodePCM(xm4a);
%信道編碼
len=3;
xch=chencode(xso,len);
%QPSK調製
x=bi2de((reshape(xch,2,length(xch)/2))');
yout=pskmod(x,4);
%%
%噪聲模塊
SNR=10;
yn=awgn(yout,SNR);
%%
%解調和解碼模塊
%解調
yin=pskdemod(yn,4);
ydein=reshape(de2bi(yin,2)',1,length(yin)*2);
%信道解碼
ych=chdecode(ydein,len);
%信源PCM解碼
yso=sodecodePCM(ych);
%%
%音頻信號處理模塊
ydig=m4a2xdig(yso);
%%
%控制系統
%起始點
start=[1 2];
%控制器解析傳入信號
[outy,liney]=mov(ydig,start);
%控制器解析原始信號
xdig=m4a2xdig(xm4a);
[outx,linex]=mov(xdig,start);
%繪製小車路徑的有向圖、起點、正確終點、實際終點
plot(liney(:,1),liney(:,2),'Color','b');hold on;
for i = 1:length(ydig)
    if ydig(i)==xdig(i)%信息傳遞正確則藍色箭頭
        ay = annotation('arrow','HeadLength',4,'HeadWidth',3,'Color','b');
    else%信息傳遞錯誤則紅色箭頭
        ay = annotation('arrow','HeadLength',6,'HeadWidth',5,'Color','r');
    end
    set(ay,'parent',gca);   
    set(ay,'position',[liney(i+1,1) liney(i+1,2) 0.05*(liney(i+1,1)-liney(i,1)) 0.05*(liney(i+1,2)-liney(i,2))]);
    hold on;
end
plot(start(1),start(2),'g.','MarkerSize',20);hold on;
plot(outy(1),outy(2),'r.','MarkerSize',15);hold on;
plot(outx(1),outx(2),'b.','MarkerSize',10);hold on;
legend('實際路徑','起點','實際終點','正確終點');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章