2015-03-13 48 views
-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; 
    }; 
}; 

我在做什么错?另外,一切工作正常(最大或最小),但当连接在一起,结果不好。

我有图片,但是我无法在这里粘贴它们。 该帖子下的图片链接。

+0

您应该注意,整数除法44100/1000'实际上会产生44,而不是44.1。 – 2015-03-13 12:13:58

+0

你确定你初始化min&max为0? – user3528438 2015-03-13 12:18:31

+0

这并不重要,传入的数据可以是无限的,例如每10个样本我们可以取1。保存最大值和最小值的任务,从... – gotostereo 2015-03-13 12:27:36

回答

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 
    } 
} 
+0

为什么初始化变量?轴信号0.值-1到1. – gotostereo 2015-03-13 13:09:36

+0

如果你知道你的输入总是从-1到1,那么你可以这样做:'min = 2; max = -2;' – uesp 2015-03-13 13:26:25

+0

这不会改变结果。添加了3张图片。它现在如何工作。在顶部帖子链接下。 – gotostereo 2015-03-13 13:41:03

0

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

你的采样率(分割后的)是44赫兹,所以你可以忘记一些不错的简化波形(如果是音频)...

+0

44 Hz是的,但图形显示不正确。 – gotostereo 2015-03-13 13:06:34

0

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

当您连接点时,无论何时存储两个最小值或两个最大值,都会看到一条短线段(2个像素)。但是如果你存储了最小值和最大值,那么连接这两个值会得到一条非常陡峭的向上斜坡。最大值和最小值会给您一个强烈的下降斜率。

这里真正的问题是,你可能没有意识到你想绘制什么。你应该有两个阵列,memory_min[]memory_max[]。不要混合这两个。

+0

是否可以通过这种方式实现信号过滤?信号是一个吗?像其他人一样实施? – gotostereo 2015-03-13 18:36:35

+0

我不知道你想要问什么,对不起。 – MSalters 2015-03-14 15:33:28