2012-05-20 25 views
3

我有一个N个测量值的数组,我应该以图形的形式呈现,但图形只能有M个像素宽,而且只能滚动M个像素。如何将n个元素的数组重新取样为m个元素的数组

虽然M是恒定的,但N可以是几十到几千之间的任何值。每次当我需要显示图表时,我知道N是什么,但是因为N/M不能是整数,所以我想要以某种方式补偿累积的错误。

我工作在一个普通的C,没有数学库可以使用。

编辑2: 数据相对均匀,偶尔出现峰值,我不想在插值时错过这些峰值。

编辑3: 我要寻找的解决方案,将工作配不上任何N,大于M和较小的比M

感谢。

+0

甚至没有'libm'? –

+2

http://en.wikipedia.org/wiki/Interpolation –

+0

不,它是一个非常严格的内存限制的嵌入式设备:-) – Flot2011

回答

4

一个好的解决方案不是迭代你的输入样本,而是遍历你的输出位置。也就是说,你总是会画出M像素。计算用于i个像素最近的采样值,可以使用阵列的偏移:

[(i*N+M/2)/M] 

当然仅使用最接近样品将给出非常别名结果(丢弃大部分的样品的情况下N很大)。如果您确定N将始终大于M,但一个好的但简单的方法是对具有加权平均值的足够相邻样本进行平均,使得每个样本获得总权重1(使端点的权重在相邻输出像素之间分割) 。当然,您可以使用更复杂的重采样算法,这可能更合适(尤其是如果您的数据类似于频域中更有意义的音频采样),但是对于内存和时钟周期要求严格的嵌入式设备,平均很可能是你想要的方法。

+0

N可能比M小一倍,但是由于你的回答,我开始认为最好的方法是对这两种情况使用2种不同的方法。 – Flot2011

+0

是的,你肯定需要不同的方法来处理这两种情况。当“N”较小时,两个最接近的样本之间的线性插值是您将得到的最简单的解决方案。当“N”较大时,求平均值是最简单的解决方案。 –

相关问题