示波器算法,动态数据输入,极限输出数据

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.5max=+0.5,您希望输出什么(存储在memory[])?还是min=-0.5max=+0.6?还是min=-0.6max=+0.5【参考方案2】:

你真正想看到什么?如果是音频样本,零表示安静,您可能希望查看包络 - 将每个 bin 的最小值和最大值(此处的 bin = 1000 个计数)存储在一起,并将两者显示在同一张图片中。

您的采样率(除法后)为 44 Hz,因此您可以忘记一些漂亮的简化波形(如果是音频)...

【讨论】:

【参考方案3】:

您在第三张图中看到的问题是您存储要么 最小值(大约 -1)或最大值(大约 +1)。您存储的两者中的哪一个非常随机。

当您连接这些点时,只要您存储了两个最小值或两个最大值,就会看到一条短线段(2 像素)。但是,如果您先存储最小值,然后存储最大值,则将两者连接起来会得到一条向上倾斜非常陡峭的线。一个最大值后跟一个最小值会给你一个强烈的下降斜率。

这里真正的问题是你可能没有意识到你想画什么。您应该有两个数组,memory_min[]memory_max[]。并且不要将这两者混为一谈。

【讨论】:

是否可以通过这种方式实现对信号的过滤?信号是一个?和其他人一样吗? 我不知道你想在这里问什么,抱歉。

以上是关于示波器算法,动态数据输入,极限输出数据的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法 (01)数组

数据结构与算法之深入解析“一维数组的动态和”的求解思路与算法示例

数据结构与算法之深入解析“一维数组的动态和”的求解思路与算法示例

数据结构与算法动态规划——最长回文子串

视频时间序列分类方法:动态时间规整算法DTW和R语言实现|附代码数据

数据结构与算法动态规划——不同路径Ⅰ&Ⅱ