数值问题开箱二进制数据字符串

5视图(30天)
你好,
我使用“包输入”来接收数据块从一个Arduinoa由于通过串行连接。设备发送一个二进制数据包组成的13个字节,第一个字节的头和其他12个字节代表3的4字节浮点值。
我用下面的matlab函数在一个matlab功能块12个字节进行重新排序,并组成3个值(单值相当于浮点值)。后来我把这一双重处理:
函数singleV = uint8ToSingle (uintArray)
% initilize一些变量来避免匹配大小错误
singleV = 0 (1、3);
uintArray_1 = 0 (1、4);
uintarray_2 = 0 (1、4);
uintarray_3 = 0 (1、4);
% 12字节uint8数据数组分割成4字节数组
uintArray_1 = uintArray (1:4);
uintArray_2 = uintArray (8);
uintArray_3 = uintArray (9:12);
%投4 uint8值一个单一值
uint8Value_1 =定型(uint8 (uintArray_1),“单一”);
uint8Value_2 =定型(uint8 (uintArray_2),“单一”);
uint8Value_3 =定型(uint8 (uintArray_3),“单一”);
%的单一值转换为值的两倍
singleV_1 =双(uint8Value_1);
singleV_2 =双(uint8Value_2);
singleV_3 =双(uint8Value_3);
% 3的值组合到一个数组中
singleV = [singleV_1、singleV_2 singleV_3];
模型万博1manbetx的一个例子是附加到这篇文章。
现在存在的问题:该算法似乎好工作了几乎所有的时间,但有时我提取爆炸的数值范围的~(2,2)> 10 ^ 10的秩序,导致问题的计划:
当你放大:
当你缩小:
有人知道如何删除离群值实时或如何处理这个问题吗?
提前谢谢。
最好的问候,
马克斯

接受的答案

Jan Houska
Jan Houska 2021年8月20日
你好,马克斯,
首先,你可能会丢失的数据包输入块的一个非常有用的功能,允许其输出信号直接为你所需要的数据类型。这是使用来完成的 块输出数据类型 参数。目前,您可能会使用 “13 * uint8” 得到一个向量的13个字节后转换的MATLAB函数。相反,您可以使用 {“uint8”,“3 *单”} 和现在有两个数据块输出端口,第一个返回第一个字节和第二个返回三个单值作为一个向量。这个功能应该可以完全消除MATLAB函数。如果你喜欢有三个独立的输出端口为每个单独的值,您可以使用 {‘uint8’,‘单身’,‘单身’,‘单身’}
作为离群值,这些可能是由于一个未被发现的错误接收的数据或不完整的数据转换。所以他们实际上可以消除或减少使用内置的转换中包块的输入。如果他们不是,解决方案取决于你想做这样一个异常值。例如,如果你很好限制它的范围2 2, 饱和 块将这样做。如果你想要一些其他的处理,比如取而代之的值读前面的步骤,这样做也可以,但需要几个街区。
祝你好运,简
1评论
马克西米利安•贝克
马克西米利安•贝克 2021年8月23日
编辑:马克西米利安•贝克 2021年8月23日
你好,简,
然而,再次感谢你的回答!我觉得有必要至少给你买一杯咖啡一段时间. .特性输出单个值直接确实是有用的,这些错误的orrcurence减少了很多。但不幸的是它完全不能解决我的问题,这就是为什么我需要一些错误处理。我已经想过实现饱和但担心这可能伤害我的系统动力学如果它试图跟踪在一个时间步步骤从2到2。
对你的其他想法取代错误的价值观我还没有解决这个问题。一个合适的算法应该包含两个部分:1)检测错误的值和2)取代错误的值最后合理的一个。关于检测我想到比较每个值和过去十值的平均值,但是这将损坏如果在某种程度上有一个错误的价值,我不知道如何把这样一个虚假的价值从我的数据流。
你有什么想法,可以这样做吗?

登录置评。

答案(1)

Jan Houska
Jan Houska 2021年8月24日
你好,马克斯,
饱和度是迄今为止最简单的方法,虽然我理解它有其局限性。下一个简单的方法是重复前面的值如果当前值的范围。请找到附加一个简单的模型,这是否使用一个启用时,通过其输入输出子系统启用禁用时,其输出。使信号生成根据请求的状态,这个时候的信号范围2 - 2所示。
祝你好运,简
1评论
马克西米利安•贝克
马克西米利安•贝克 2021年8月24日
非常感谢你的帮助,这对我起了作用!
我不知道我将没有你的智慧!

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的