C 如何将n个元素的数组重采样为m个元素的数组

C 如何将n个元素的数组重采样为m个元素的数组,c,math,approximation,C,Math,Approximation,我有一个N个测量值的数组,应该以图形的形式呈现,但是图形只能有M个像素宽,并且只能滚动M个像素 当M是常数时,N可以是从数十到数千的任何值。 每次我需要显示图形时,我都知道N是什么,但是因为N/M可以不是整数,所以有一个累积误差,我想以某种方式进行补偿 我在一个普通的C语言中工作,没有数学库可以使用 编辑2: 数据是相对均匀的,偶尔会出现峰值,我不想在插值时错过这些峰值 编辑3: 我正在寻找的解决方案,将工作足够好的任何N,大于M和小于M 谢谢。一个好的解决方案不是迭代输入样本,而是迭代输出位置

我有一个N个测量值的数组,应该以图形的形式呈现,但是图形只能有M个像素宽,并且只能滚动M个像素

当M是常数时,N可以是从数十到数千的任何值。 每次我需要显示图形时,我都知道N是什么,但是因为N/M可以不是整数,所以有一个累积误差,我想以某种方式进行补偿

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

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

编辑3: 我正在寻找的解决方案,将工作足够好的任何N,大于M和小于M


谢谢。

一个好的解决方案不是迭代输入样本,而是迭代输出位置。也就是说,您将始终精确地绘制
M
像素。要计算
i
th像素的最近采样值,请使用阵列偏移:

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

当然,仅使用最接近的样本将产生非常混淆的结果(在
N
较大的情况下丢弃大部分样本)。如果您确定
N
始终大于
M
,那么一种简单而有效的方法是使用加权平均值对足够多的相邻样本进行平均,这样每个样本的总权重为1(端点的权重在相邻输出像素之间进行分割)。当然,您可以使用更精细的重采样算法,这可能更合适(特别是如果您的数据类似于音频样本,在频域中更有意义),但对于内存和时钟周期要求很高的嵌入式设备,平均值可能是您想要的方法。

否,它是一个具有非常严格内存限制的嵌入式设备:-)@IgnacioVazquez Abrams:“libm”是“plain C”的一部分,是托管实现的一种方式。在unix系统上,将其放在单独的库文件中是一个丑陋的历史产物,仅此而已。另一方面,如果这个嵌入式系统只有一个独立的实现,那么基本上整个标准库都缺失了。N可能比M小几倍,也可能比M大几倍,但是由于你的回答,我开始认为最好的方法可能是在这两种情况下使用两种不同的方法。是的,对于这两种情况,您肯定需要不同的方法。当
N
较小时,两个最近样本之间的线性插值是您将得到的最佳简单解决方案。当
N
较大时,平均值是最好的简单解决方案。