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

时间:2015-03-13 12:11:30

标签: c++ audio oscilloscope

我正在尝试简单过滤输入数据(保存最大和最小选择),例如: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;
    };
};

我做错了什么?另外,一切正常(最大或最小),但是当连接在一起时,结果很糟糕。

我有照片,但我不能在这里粘贴它们。 链接到这篇文章下的图片。

3 个答案:

答案 0 :(得分:0)

要正确计算一组数字的最小值/最大值,您必须正确初始化值。通过将它们设置为0,您会遇到您发现的问题。您基本上有两种方法可以初始化min / max

  1. 将它们设置为大于/小于任何输入数据的值。
  2. 将它们设置为数组中的第一个值。
  3. 对于(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
        }
    }
    

答案 1 :(得分:0)

你真的想看到什么?如果它是音频样本,零意味着安静,你可能想要看到信封 - 存储每个箱子的最小和最大值(这里你的箱子= 1000个计数)并在同一张图片中显示两个。

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

答案 2 :(得分:0)

您在第三个图表中看到的问题是您将存储最小值(约-1)或最大值(约+1)。你存储的两个中的哪一个很随意。

然后连接点时,只要存储了两个最小值或两个最大值,就会看到一个短线段(2个像素)。但是如果你存储一个最小值后跟一个最大值,那么连接两个就会得到一条上坡非常陡的线。最大值后跟最小值会给您一个强大的下坡。

这里真正的问题是你可能没有意识到你想要绘制的内容。您应该有两个数组memory_min[]memory_max[]。不要混淆那两个。