【问题标题】:How to resample an array of n elements into an array of m elements如何将n个元素的数组重新采样为m个元素的数组
【发布时间】:2012-05-20 15:08:07
【问题描述】:

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

虽然 M 是常数,但 N 可以是从几十到几千不等的任何值。 每次我需要显示图表时,我都知道 N 是什么,但是由于 N/M 不能是整数,所以我想以某种方式补偿一个累积的误差。

我正在使用纯 C 语言,无法使用任何数学库。

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

编辑 3: 我正在寻找对任何大于 M 且小于 M 的 N 都足够好的解决方案。

谢谢。

【问题讨论】:

  • 不,它是一个内存限制非常严格的嵌入式设备:-)
  • @IgnacioVazquez-Abrams:“libm”是“plain C”的一部分,是一种托管实现。把它放在 unix 系统上的一个单独的库文件中是一个丑陋的历史文物,仅此而已。另一方面,如果这个嵌入式系统只有一个独立的实现,基本上整个标准库就没有了。

标签: c math approximation


【解决方案1】:

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

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

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

【讨论】:

  • N 可能比 M 小几倍,大几倍,但是由于您的回答,我开始认为最好的方法可能是对这两种情况使用 2 种不同的方法。
  • 是的,这两种情况你肯定需要不同的方法。当N 较小时,两个最近样本之间的线性插值是您将获得的最佳简单解决方案。当N 较大时,平均是最好的简单解决方案。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多