我正在尝试简单过滤输入数据(保存最大和最小选择),例如: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 :(得分:0)
要正确计算一组数字的最小值/最大值,您必须正确初始化值。通过将它们设置为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
}
}
答案 1 :(得分:0)
你真的想看到什么?如果它是音频样本,零意味着安静,你可能想要看到信封 - 存储每个箱子的最小和最大值(这里你的箱子= 1000个计数)并在同一张图片中显示两个。
您的采样率(分频后)为44 Hz,因此您可以忘记一些不错的简化波形(如果是音频)......
答案 2 :(得分:0)
您在第三个图表中看到的问题是您将存储最小值(约-1)或最大值(约+1)。你存储的两个中的哪一个很随意。
然后连接点时,只要存储了两个最小值或两个最大值,就会看到一个短线段(2个像素)。但是如果你存储一个最小值后跟一个最大值,那么连接两个就会得到一条上坡非常陡的线。最大值后跟最小值会给您一个强大的下坡。
这里真正的问题是你可能没有意识到你想要绘制的内容。您应该有两个数组memory_min[]
和memory_max[]
。不要混淆那两个。