-2

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

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

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

4

3 回答 3

0

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

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

于 2015-03-13T12:34:09.190 回答
0

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

  1. 将它们设置为大于/小于任何输入数据的值。
  2. 将它们设置为数组中的第一个值。

例如,对于 (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
    }
}
于 2015-03-13T12:25:49.317 回答
0

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

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

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

于 2015-03-13T15:59:15.320 回答