基于MATLAB的远程声控小车的系统设计与仿真

文章目录

写在前面

在本篇中将利用MATLAB设计一个远程声控小车系统并仿真,整体难度并不大,关键要理清信息的传输过程,理解信源和信道编码的意义等等,在课堂上学到的香农信息论等内容都是偏向于理论方面且比较抽象,亲自动手进行设计对这些理论的理解还是有蛮大的帮助的。
如果你对信通或电子科学方面感兴趣或是正在进行这方面的本科学习,可以去看一下我整理的这篇对信息与电子方向部分本科项目的总结(持续更新中),也许某些课程或是科研项目的总结能对你有所帮助。

1 设计目标与问题分解

1.1 设计目标

要完成远程语音控制小车系统的设计和实现,需要采集语音控制信号,经过适当的压缩后发送出去,通过噪声通道传输,在汽车的接收端进行接收和识别,然后控制汽车在飞机上的运动。

[En]

To complete the design and implementation of the remote voice control car system, it is necessary to collect the voice control signal and send it out after proper compression, transmit through the noise channel, receive and identify at the receiving end of the car, and then control the movement of the car on the plane.

1.2 问题分解

这一目标可以通过以下步骤来设计:

[En]

This goal can be designed in the following steps:

  1. 采集声音信号,并对声音指示信号进行一定的压缩,即选择合适的编码方式进行信源编码;
  2. 为了减小传输过程中噪声的影响,需要选择合适的编码方式进行信道编码并进行调制;
  3. 需要设计噪声信道,在调制后的信息内加入噪声;
  4. 需要在接收端接收信号并进行解调、信道解码、信源解码,重新将其转换成声音指示信号;
  5. 需要进行声音控制信号类型的识别,并将声音控制信号转换为相应的数字指示信号;
  6. 需要设计小车的控制系统,能根据指示信号做出反应并且保证系统具有可观能控性;

2 解决思路

根据问题分解,流程图可以设计如下

[En]

According to the problem decomposition, the flow chart can be designed as follows

基于MATLAB的远程声控小车的系统设计与仿真
接下去将使用MATLAB软件进行实现,进行分步处理。

; 2.1 信源编码和解码部分

为了对输入的消息进行适当压缩,要选用合适的编码方式,本次设计中对信号采用PCM的A律13折线法。
PCM(Pulse Code Modulation)脉冲编码调制是数字通信的编码方式之一。主要过程是对语音等模拟信号采样使其离散化后将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。A律13折线法即为将y轴等分成8份,而x轴按1/2比逐次缩小化取值,总共连成8个转折点,由于第一个点斜率不需要考虑,因此只考虑7点,算上y轴左侧就有14点。同时最左侧和最右侧的线段斜率相同,因此只需考虑13点为量化标准。
由于使用了计算机模拟,在读取文件时已经完成了语音信号的采样,并且只能对幅度进行量化。同时,量化信号幅度的过程也可以看作是对源信息的压缩。因为量化后表示十进制数所需的大量二进制码比特的概率将大大降低。

[En]

Due to the use of computer simulation, the sampling of the speech signal has been completed when reading the file, and only the amplitude can be quantized. at the same time, the process of quantizing the amplitude of the signal can also be regarded as the compression of the source information. because the probability of the large number of binary code bits needed to represent a decimal will be greatly reduced after quantization.

2.2 信道编码和解码部分

为了方便,本次设计采用3位重复编码,即1->111,0->000,此时可计算得编码速率为1/3,可以对1bit进行纠错。
信道解码如下表,

基于MATLAB的远程声控小车的系统设计与仿真
由此可见,这种信道编码方法只能检测一个误码,当三个比特中的两个或两个以上产生误码时,结果就会出错,从而影响最终的译码。
[En]

It can be seen that this channel coding method can only detect one bit error, and when two or more of the three bits produce errors, the result will be wrong, which will affect the final decoding.

; 2.3 噪声信道部分

对于噪声信道部分,由于缺乏相应的设备,只能通过MATLAB来仿真噪声信道,通过将白噪声加入传输信号来模拟;

2.4 声音信号识别部分

对于输入的音频信号,可以利用MATLAB内部函数来计算声音特征,并与先前存储的标准音频进行比对,将相似度最高的一项作为配对结果,将其转化为该项所对应的消息,完成声音控制信号到数字控制信号的转换。其中语音消息和数字信号对照表如下,

基于MATLAB的远程声控小车的系统设计与仿真

; 2.5 控制器部分

控制系统也由MATLAB模拟,通过输出相应的结果来查看控制效果,用平面内的所有整数坐标点作为小车的活动区域,小车当前所处状态即为当前坐标,可以设计声控小车的语音消息和对应执行命令如下,

基于MATLAB的远程声控小车的系统设计与仿真
能控性证明
显然,从上面的指令表来看,小车可以到达平面内的任意整数坐标位置,也可以从任意初始位置进行一系列操作后仍能返回到原始位置,这证明了系统是可控的。
[En]

Obviously, from the above command table, the car can go to any integer coordinate position in the plane, or it can still return to the original position after a series of operations from any initial position, which proves that the system is controllable.

能观性证明
输入将以指定轨迹的方式控制汽车的移动,因此可以从当前输入和汽车的最终位置反向推导出初始状态,即根据输入从终点向后绘制轨迹可以找到初始位置。所以这个系统是可以观察到的。

[En]

The input will control the movement of the car in a way that specifies the trajectory, so the initial state can be inversely derived from the current input and the final position of the car, that is, the initial position can be found by drawing the trajectory backwards from the end point according to the input. so the system is observable.

3 实现过程及每步实现结果

3.1 信源和信道编码模块

按照解决思路内的原理可完成PCM编码的MATLAB代码,如果觉得比较困难的话可以参考这篇文章《基于 MATLAB 的 PCM 编码解码实现》。信道编码的实现则相对比较简单,在输入的信号中添加冗余项即重复三位,解码时每隔三位识别和是否大于2即可。
考虑到音频文件在MATLAB内读取时会自动被采样为离散的数字信号,因此在测试时的输入设置为:xm4a=2*rand(1,100)-1;%随机产生(-1,1)的数字序列。部分测试代码和结果截图如下,

基于MATLAB的远程声控小车的系统设计与仿真
可见信源和信道的编码和解码均正常进行,其中miss代表信源和解码信号的欧氏距离,从中可见前后信号差距不大,体现该编码方式失真度较低,并且由对信号的幅度值进行了量化,因此起到了很好的压缩效果,便于传输。信源和信道的编码解码设计成功。

3.2 调制解调模块

此处将采用QPSK调制,由于信道编码后的序列为二进制,为充分发挥QPSK效果,需要将其进行两两分组从而转为四进制,此时可以利用reshape函数将信道编码后的序列的维度从1n转为(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);

测试结果如下,左图为星座图,右图为调制解调信号对比,可见调制解调过程正常,结果正确。

[En]

The test results are as follows, the left picture is the constellation chart, the right picture is the comparison of modulation and demodulation modulation signals, it can be seen that the modulation and demodulation process is normal, and the result is correct.

基于MATLAB的远程声控小车的系统设计与仿真

3.3 噪声模块

该部分可以直接采用MATLAB内部awgn函数来模拟,此时即可将噪声加入进行测试,测试代码和结果如下,

基于MATLAB的远程声控小车的系统设计与仿真
图中左侧工作区的M代表误码数,R代表误码率,从中可以看出,对于随机生成的这10000个消息,经过信源和信道编码后变为24000bits的二进制信号,该二进制在通过信噪比为3dB的噪声信道后,有26967bits受噪声影响出错了,因此错误率为11.24%,会对最后的解码有一定影响。可见大多数信号在经过该噪声信道后仍能保持正确的信息。
同时针对不同信噪比进行分析,作出如下图象,可见随着信噪比的提升,错误率逐渐下降至趋于0,与理论情况相符合,并且在信噪比10dB时已经几乎不会出错。
基于MATLAB的远程声控小车的系统设计与仿真
至此,信息传输流程的设计和实现已经顺利完成,下一步是处理。
[En]

At this point, the design and implementation of the information transmission process has been successfully completed, and the next step is processing.

; 3.4 声音信号处理模块

这一部分最重要的是进行语音识别,具体实现如下。

[En]

The most important thing in this part is to carry out speech recognition, the specific implementation is as follows.

首先录制几个标准声音文件作为音频信号,以匹配输入的音频,并将其存储在计算机中。

[En]

First record several standard sound files as audio signals for matching the input audio, and store them in the computer.

采集声音信号为m4a文件,利用MATLAB内部audioread()函数来进行声音-数字信号的转换,其后利用MATLAB的工具箱voicebox内的melcepst函数来计算输入音频的语音特征梅尔频率倒谱系数(MFCC),此处voicebox不是MATLAB安装时自带的,需要另行下载。
当输入为单个音频控制信号时,用dtw函数来计算输入信号MFCC与先前存储的标准声音文件的MFCC的差距,将两者作为dtw函数的两个输入,输出的值越小则说明匹配度越高,并选择能使得dtw输出最小的一个标准声音文件与输入配对,至此,语音识别完成。需要注意的是,dtw的输入必须维度相同,因此要对音频进行长度上的对齐。
在语音识别完成后,可以将输入的音频转换为与匹配的标准音频对应的消息。

[En]

After the speech recognition is completed, the input audio can be converted into a message corresponding to the matched standard audio.

当输入为多个音频控制信号时,只需将其在时域上进行一段段的划分,分别进行MFCC的计算和与标准音频的匹配,即可完成对多个音频控制信号的转化。
下面以”东”,”南”,”西”,”北”的音频为例演示语音识别模块:

基于MATLAB的远程声控小车的系统设计与仿真
基于MATLAB的远程声控小车的系统设计与仿真
在此基础上,稍加修改即可完成音频信息与数字控制信息之间的转换。
[En]

On this basis, the conversion between audio information and digital control message can be completed with a little modification.

3.5 控制模块

在仿真中假设地图满足上北下南左西右东的规则,设计控制器MATLAB代码mov.m定义为:function [destination,line] = mov(decode,start)%返回目的地和路径
因为此处只涉及平移的操作,实现起来较为简单,直接利用case语句写即可,所以不再赘述。

3.6 系统整体实现

可以根据前面的分析编写总体代码。输入设置如下

[En]

The overall code can be written according to the previous analysis. The input settings are as follows

%输入声音文件,内部每2s一个声音信号,每个信号有效长度在0.5s以内,顺序为北-东北-东-东南-南-西南-西-西北,旋转一圈
xdig=m4a2xdig('C:\Users\46817\Desktop\m4a\序列.m4a');

运行结果如下,

基于MATLAB的远程声控小车的系统设计与仿真
从结果可以看出,该车按照声控信号指示的路径成功调头,返回起点。成功地设计了远程声控系统。
[En]

It can be seen from the results that the car successfully turned around according to the path indicated by the voice control signal and returned to the starting point. The remote sound control system is designed successfully.

由于收集大量音频信号工作量比较大,此处在MATLAB内随机挑选八个方向的音频信号共100次并将结果整合成一个向量来作为输入进行整体系统性能的测试,实现代码如下,

for i=1:100
j=randi([1 8]);
tem(i,:)=orim4a(j,:);%orim4a内为各音频信号
end
xm4a=reshape(tem',1,100*length(orim4a));

仿真结果如下,从图中可以看出,汽车的路径上没有红色箭头,实际终点与正确终点重合,因此远程消息对汽车进行了准确的控制。因此,所设计的系统还可以对大量输入进行正确的远程控制,设计是成功的。

[En]

The simulation results are as follows, it can be seen from the figure that there is no red arrow in the path of the car, and the actual end point coincides with the correct end point, so the remote message controls the car accurately. Therefore, the designed system can also remotely control a large number of inputs correctly, and the design is successful.

基于MATLAB的远程声控小车的系统设计与仿真
当信噪比较小例如1dB时,控制信号在传输时可能会受噪声影响而出错,造成如下结果,可见有很多路径出现了红色箭头,即识别出错,最后的终点也与正确终点不同,因此该系统对信道的噪声有一定要求。
基于MATLAB的远程声控小车的系统设计与仿真
至此,完成了远程声控系统的仿真。
[En]

At this point, the simulation of the remote sound control system is completed.

此处附上整体实现代码

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('实际路径','起点','实际终点','正确终点');

Original: https://blog.csdn.net/zjuxym/article/details/113396656
Author: {xy=M}
Title: 基于MATLAB的远程声控小车的系统设计与仿真

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/515272/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球