示波器算法,动态数据输入,极限输出数据
Posted
技术标签:
【中文标题】示波器算法,动态数据输入,极限输出数据【英文标题】:Oscilloscope algorithm, dynamic data input, limit output data 【发布时间】:2015-03-13 12:11:30 【问题描述】:我正在尝试做一个简单的过滤传入数据(保存最大和最小选择),例如:每秒44100个样本,但屏幕必须显示1000个。我选择44.1范围内的最大值或最小值样本,并输出屏幕。但是,这个算法不是很准确。在代码中,它看起来像这样:
示例伪算法
float max = 0;
float min = 0;
float filter = 0;
float step = 44100/1000;
for(int i = 0 ; i < 44100; i++)
if(input[i] > 0)
if(max < input[i])
max = input[i];
if(input[i] < 0)
if(min > input[i])
min = input[i];
filter++;
if(filter >= step)
filter = filter - step;
//1st version (bad version)
memory[count] = max + min;
//2nd version (bad version)
if(max > abs(min))
memory[count] = max;
else if(max < abs(min))
memory[count] = min;
//3nd version (only maximum)
memory[count] = max; //work great, but only > 0
//4nd version (only minimum)
memory[count] = min; //work great, but only < 0
max = 0;
min = 0;
count++;
if(count >= 1000)
count = 0;
;
;
我做错了什么?单独地,一切正常(最大或最小),但当连接在一起时,结果很糟糕。
我有图片,但我不能在这里粘贴它们。 这篇文章下的图片链接。
【问题讨论】:
您应该注意,整数除法44100/1000
实际上会产生 44
而不是您所期望的 44.1
。
您确定将 min & max 初始化为 0?
这不是那么重要,传入的数据可以是无限的,我们可以每10个样本取1个。保留最大值和最小值的任务,从中选择......
rghost.ru/8jVDdMqZC/image.pngrghost.ru/8sGsnj4Jt/image.pngrghost.ru/874LyBpqk/image.png
@user3528438:对于典型的交流信号来说,这很好。假设实际信号在 -100 和 +100 之间变化。 min
的值将迅速减小,因为所有负值都小于 0。同样,所有正值都 >0,所以 max
将迅速收敛到 100。
【参考方案1】:
要正确计算一组数字的最小值/最大值,您必须正确初始化这些值。通过将它们设置为0
,您会遇到您发现的问题。你基本上有两种方法来初始化min
/max
:
-
将它们设置为大于/小于任何输入数据的值。
将它们设置为数组中的第一个值。
对于 (1),例如,如果您知道您的数据始终介于 -100 和 +100 之间,您可以这样做:
min = 101;
max = -101;
请注意,如果您的输入可以是类型范围内的任何值,这将不起作用。对于 (2),您可以执行以下操作:
float max = input[0];
float min = input[0];
...
for (int i ... )
...
if (filter >= step)
...
min = input[i + 1]; // Be aware of overflow on the last element if
max = input[i + 1]; // input[] is exactly 44100 elements in size
【讨论】:
为什么要这样初始化变量?轴信号 0。值 -1 到 1。 如果你知道你的输入总是从 -1 到 1 那么你可以这样做:min = 2; max = -2;
这不会改变结果。添加了3张图片。现在如何运作。在顶部的帖子链接下。
错误答案;该部分实际上有效(参见个别图)。输入没有直流分量,因此已知最大值是非负的。您对最大值的初始估计必须是范围的下限,并且最小的非负数确实是 0。
我假设@gotostereo 试图在一个值范围内找到输入的最小值/最大值。如果他试图找到负最小值和正最大值,那么他找到它们的原始代码就可以了。问题可能是如何处理具有非零最小值和最大值的步骤。例如,如果min=-0.5
和max=+0.5
,您希望输出什么(存储在memory[]
)?还是min=-0.5
和max=+0.6
?还是min=-0.6
和max=+0.5
?【参考方案2】:
你真正想看到什么?如果是音频样本,零表示安静,您可能希望查看包络 - 将每个 bin 的最小值和最大值(此处的 bin = 1000 个计数)存储在一起,并将两者显示在同一张图片中。
您的采样率(除法后)为 44 Hz,因此您可以忘记一些漂亮的简化波形(如果是音频)...
【讨论】:
【参考方案3】:您在第三张图中看到的问题是您存储要么 最小值(大约 -1)或最大值(大约 +1)。您存储的两者中的哪一个非常随机。
当您连接这些点时,只要您存储了两个最小值或两个最大值,就会看到一条短线段(2 像素)。但是,如果您先存储最小值,然后存储最大值,则将两者连接起来会得到一条向上倾斜非常陡峭的线。一个最大值后跟一个最小值会给你一个强烈的下降斜率。
这里真正的问题是你可能没有意识到你想画什么。您应该有两个数组,memory_min[]
和 memory_max[]
。并且不要将这两者混为一谈。
【讨论】:
是否可以通过这种方式实现对信号的过滤?信号是一个?和其他人一样吗? 我不知道你想在这里问什么,抱歉。以上是关于示波器算法,动态数据输入,极限输出数据的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法之深入解析“一维数组的动态和”的求解思路与算法示例
数据结构与算法之深入解析“一维数组的动态和”的求解思路与算法示例