Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Filter 平滑/过滤数据流的最佳方法_Filter_Stream_Smoothing - Fatal编程技术网

Filter 平滑/过滤数据流的最佳方法

Filter 平滑/过滤数据流的最佳方法,filter,stream,smoothing,Filter,Stream,Smoothing,我有一个整型数据流(随着时间的推移而来的数据),看起来像这样 [46,46,46,47,47,47,47,47,47,46,47,47,47,47,47,47,46,47,47,47,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,100,100,70,100,100] 基本上,它是一个整数流,最后一个整数显示在屏幕上。有时,噪声(一个“坏”整数)会短时间显示,导致屏幕闪烁该整数。我想通过不显示噪音来避免这种闪烁 我想过滤/删除一行中只出现~

我有一个整型数据流(随着时间的推移而来的数据),看起来像这样

[46,46,46,47,47,47,47,47,47,
46
,47,47,47,47,47,47,
46
,47,47,47,47,47,47,47,47,47,47,47,47,
46
,46,46,46,46,46,46,46,100,100,
70
,100,100]

基本上,它是一个整数流,最后一个整数显示在屏幕上。有时,噪声(一个“坏”整数)会短时间显示,导致屏幕闪烁该整数。我想通过不显示噪音来避免这种闪烁

我想过滤/删除一行中只出现~1-2次的数字,因为它们通常是噪声。如果输入一个新的整数,它可能是噪声,也可能不是噪声,这取决于接下来的1-2个整数是否相同

稍微延迟一下就可以了。我希望避免对数据进行平均,因为如果一个数字从40跳到100,我希望它不要钻到100(即40、60、80、100),而是在被视为无噪声的情况下尽快变为100


平滑/过滤此类数据的最佳技术是什么?

首先,我不是信号处理专家,但我有一些基本经验(我们称之为)。另外,我看到了你的其他(可能相关)问题,你在谈论调谐器和音符。假设这与问题有关(?)

简短回答:


您可以使用带中值或模式的本地短缓冲区过滤。在最简单的形式中,根据您所描述的,您可以“安全地”消除超出某个预定义噪声阈值的值,并且这些值在当前缓冲区中只出现一次

长答案:


在统计学中,除了标准和标准之外,还有一种东西叫做:

对于您在问题中给出的整个39个值数组:

主数组\u值\u按\u出现次数=[46=>13次,47=>20次,70=>1次,100=>5次]

average = 54.05 => 54 rounded
median  = 47
mode    = 47
模式和中值函数可以帮助您确定哪个值应该是代表值。从本质上讲,模式类似于按发生次数和值升序排列值,但在多模式分布中,模式的值并不总是明确的

您可以看到,在偶尔出现,特别是较大的峰值的情况下,使用平均值并不是很好

中位数作为比较算法的主要候选者听起来很有吸引力,但您应该使用什么呢?中位数还是模式?这实际上取决于您使用的数据类型及其分布。例如,如果我们正在检测乐器(音符)的音调,并且我们的检测器具有相当高的精度,那么模式方法听起来是一个不错的选择,因为中值可能会产生误导。如果我们的调谐器检测到60%的时间音符A4和40%的时间音符其他音符,“平均”它检测到A4,因为该音调在我们的数据流中占主导地位。更多关于模式用例的信息也在上面的链接中


首先,以一组(例如)5个连续值(任意缓冲区大小或“扫描”间隔:较小的缓冲区意味着较低的效率;较大的缓冲区意味着较低的分辨率和较长的延迟)捕获流,并将其存储在阵列中:

array_1 = [46 (first in) 46 46 47 47 (last in)]
如果希望数据基本保持不变,还可以对它们进行分组(按事件计数)。这将为您提供捕获组的一些起始分析点

array_1_occur = [46 => 3 47 => 2]
然后,您可以使用简单的比较算法连续确定它们之间的相对差异;您可以将这些值和+/-差存储在单独的数组中

array_1_diff = [0 0 0 +1 +1]

在这一阶段,最简单的过滤可能很容易,所有值都超过阈值且出现率较低(谢谢,我添加了一些更多的信息。虽然数据是一个流,但它可以延迟一些时间。你是指
java.util.stream
?不,只是一个一般的
。这意味着,数据是随着时间的推移而来的。介意给我们展示一个输入输出示例吗?我会与上一个值进行比较,如果它是相同的,我会将其包括在内。感谢我的回答很好。我需要一点时间来消化,但这肯定是有帮助的。
array_2 = [46 46 90 47 47]

array_2_min = 46
array_2_max = 90
array_2_avg = (46+46+90+47+47) : 5 = 55.2
array_2_local_avg_ref = round(55.2) = 55 ( <-- useless in this case because median() value 47 is VERY DIFFERENT from average value! => thus we DISCARD it from analysis and mark value of 90 as a major SUSPECT )
array_1_avg = 46
array_1_med = 47 (you order values from lowest to largest and take the middle one as median)
array_1_mod = 46 (not sure 100% about bi-modal or multi-modal cases at least in Excel a value of 46 is returned possibly as the lowest integer with highest occurrence in the ordered list. You can customize that in the event of multi-mode or no mode distribution algorithm fallback to median)