Skip to content

Lsyhahah/data-fusion-for-indoor-tracking-by-RFID

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 

Repository files navigation

欢迎来到“多传感器数据融合”课程

课程网站 data fusion on GitHub 包含了这门课程的所有信息。

课程内容

  本课程共分为三大部分。它们的关系见下图课程内容结构关系   课程主要包括理论、方法及实现系统等内容。

文件说明 

课程资料放在每一个子目录下,每个子目录的名字以“Lesson”开头,后面加数字,例如Lesson1表示第一部分,即理论部分。 每个文件夹有4种文件:

  1. 课程说明PDF文件,该文件详细给出每一次课的课程内容。
  2. matlab程序文件,每一次课程涉及到的所有程序,包括所需的数据。
  3. readme文件,该文件只是简要介绍每次课程的大致内容,共学习者迅速了解该课程。
  4. 如何使用matlab文件的相关说明。

关于Matlab程序

为使用方便,请将所有matlab文件下载后放在一个目录下例如datafusion,并确保已经将其放在matlab的有效路径下。

MATLAB语言基础知识

已有功底的飘过~~~~~

编程知识之一:matlab程序结构

MATLAB语言广泛应用于各种仿真研究中,尤其是自动控制领域。与Python,R等具有计算功能的语言相比,MATLAB具有更为专业的工具包。 MATLAB程序通常包括四部分,下面我们来详细说明。

第一部分:清除主界面和内存空间

MATLAB几十年来一直沿用主界面风格,可以在命令窗口(Command window)上调试某一条语句是否正确,还可以执行输入命令。当程序出现错误时,命令窗口也会出现红色报错提示,想要输出某个变量的结果时,命令窗口也会非常方便地显示运行结果。可见主界面的内容是相当丰富的,但主界面保存的变量并不会自己清空,其历史命令(Command history)及工作空间 (Workspace)的变量自动保存着。 这会使用户弄不清楚哪个是当前程序的执行结果,当程序报错时,也给错误排查带来了困难。因此在程序执行的开始,最好清除主界面现有的内容,这样在本次程序执行之后,方便分析本次程序执行的结果。

在MATLAB中,清除主界面的语句是

clc; 

清空内存变量是  

clear; 

关闭所有图形窗口是

  close all;

建议使用者在程序的开始就使用以上命令,这个习惯对管理程序数据空间很有帮助。 MATLAB的“管辖”的数据空间范围包括内存空间、路径,输入命令,类似这样的超简单的语句:

a=b+1

MATLAB首先寻找变量b的值,如果内存空间已经有该变量的值,该语句在执行的时候就不会出错。但如果变量b在之前的程序中已被赋值,那么,在内存空间中已经存在b值,当前执行的程序当中并没有对b进行赋值,但由于MATLAB在内存空间中有b值就导致a被赋值。

然而,此时程序是错的,因为没有在使用变量之前进行赋值。人们会大呼“程序通过了!”然后,很开心地关机,当下一次打开MATLAB时,MATLAB会再次运行原程序,会发现系统出现错误提示“b没有赋值”,这对一个初学者来讲是相当费解的一件事:程序昨天还好好的,为什么又出现了错误?

现在明白了吧:由于没有使用clear语句清除内存空间,导致最初运行程序时,b变量没有初始化的错误“漏”报。

这样的错误不是每次都会有,但是在算法研究的过程中错误率的确非常高。初学者由于缺乏专业的编程经验,在变量命名时比较随意,常常使用c、A、PP、n等简单的字母变量,在内存空间中留下痕迹。因此,养成一个好习惯至关重要,即在程序的开始使用清除主界面的clc语句,在“视觉”上有一个良好的开始,迎接“干干净净”的主界面;使用clear清除内存空间,使内存空间“干干净净”,程序每次都重新开始。

第二部分

设置问题中交代的因变量,一般是一些已知的数据;

第三部分

需要解决计算问题的结果变量,需要依据题意进行计算;

第四部分

结果输出,有的只需要输出数据,而大多数情况下都需要用图形来表达。这几部分很多MATLAB书籍进行了详细介绍,本书不再赘述。下面使用一段具体的实例进行说明。

假设温度传感器A具有均匀分布测量噪声,噪声的均值为0,方差为2,请模拟当室内温度是20的时候,传感器的输出数据是多少?给出1000个数。

% 清除主界面和内存空间
clc;
clear;
% 设置变量:
m=20;
v=2;

在MATALB中,通过使用randn函数产生随机数。这里,测量值是真实值与测量噪声的叠加。根据测量方差和均值可以模拟出噪声,也就是将randn产生的结果乘以标准差,然后加上期望均值并将其与真实值叠加:

% 室内温度
s1=m+sqrt(v)*randn(1,1000); %这里期望均值为0,所以语句中没有显示均值。

最后,将模拟出的测量噪声如图所示,测量噪声是一个离散序列,所以形式非常简单,使用plot函数就可以实现:

plot(s1)
xlabel(‘采样时刻’)
ylabel(‘测量数据’)

模拟传感器A的测量数据输出

模拟传感器A的测量数据输出

MATLAB画图函数非常丰富,还可以对图设定适当的标注来提高效果图的表达方式和内容,增强可视化效果,比如横坐标、纵坐标的设置,用不同线型来区别不同变量的曲线,或在一张图上画出多个图进行对比分析。详情可查阅MATLAB相关书籍。

下面再看几个类似的例子:

若传感器B的噪声更大些,其噪声的均值为0,方差为8,请模拟当室内温度是20的时候,传感器的输出数据是多少?给出1000个数。 同理,MATLAB程序应该有四大部分,可以给出下面这段程序:

%C2_1
clc;
clear;
m=20; 
v=8; 
s2=m+sqrt(v)*randn(1,1000); 
plot(s2) 
xlabel(‘采样时刻’) 
ylabel(‘测量数据’) 

模拟传感器B的测量数据输出

模拟传感器B的测量数据输出

如果室温在上升,实际的上升曲线是2*t+20,传感器A的输出数据是多少?给出1000个数。

与上面两例不同,本例的实际室温随着时间的变化而变化,为了描述这个关系,需要给出时间t的变化,然后再考虑测量噪声与真值的关系。在实际的仿真中,需要指定时间t的仿真范围,也就是开始时间和结束时间,一般情况下开始时间可以设为从0开始,而结束的时间则可以根据实际情况进行设置。但是题中要求我们给出1000个数据,也就是t要包含1000个数据点。

我们可以用语句t=0:0.01:9.99来表示从0时刻到9.99秒的采样时间,每0.01秒采集的一个数据共获得1000个测量数据。或者使用另外一个语句t=linspace(0,9.99,1000),也能输出1000个结果值。若使用传感器A进行测量,在真值之上需要叠加测量噪声获得测量数据,程序如下

%C2_2 
clc; 
clear; 
t=0:0.01:9.99; 
m=2*t+20; 
v=2; 
s3=m+sqrt(v)*randn(1,1000); 
plot(t,s3) 
xlabel('t') 
ylabel('measurement data')

室内温度变化时模拟传感器A测量数据的输出

室内温度变化时模拟传感器A测量数据的输出

编程知识之二:MATLAB函数文件

本小节对MATLAB函数的知识进行简单介绍。

MATLAB语言除了主程序(如上述编写的这些小程序)之外,还可以编写函数文件。

以下面的小例子来说明函数文件的格式: 1)在MATLAB的新建function文件中,编写如下程序并进行保存:

function s = sumfunc (a,b) s = a+b; 

2)然后在MATLAB的工作空间中调用sumfunc函数,便可完成MATLAB函数的编写目的。

在上述程序中,文件需要有关键字,即文件中第一行。函数文件必须由function开头,然后标明函数的输入输出变量。在函数体中需要表明函数输入输出变量之间的关系,如在上述小例子中,函数的输入输出是简单的求和关系。

在调用函数时可以使用

y=sumfunc (3,4)

语句,会得出y=7的计算结果。

总结一下,本小节介绍了仿真语言的基础知识,以编写仿真程序的四部分步骤为例,简单介绍了MATLAB语言的基本使用方法,以及函数的编写。给出了几个小实例,来说明仿真过程产生的数据方法。如果想要更深入地了解MATLAB语言,可以参阅其它相关书籍。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published