C语言中对数字数组进行滤波平滑处理

3

我正在Xcode中编写一个应用程序。它正在收集传感器数据(陀螺仪),然后通过FFTW进行转换。最终,我将结果保存在一个数组中。在应用程序中,我正在绘制图形,但是峰值太多了(请参见红色图形),我希望能够平滑它。

enter image description here

我的数组:

double magnitude[S];
    ...
    magnitude[i]=sqrt((fft_result[i][0])*(fft_result[i][0])+ (fft_result[i][1])*(fft_result[i][1]) );

一个示例数组(30个样本,通常我使用256个样本): “0.9261901713034604”, “2.436272348237486”, “1.618854900218465”, “1.849221286218342”, “0.8495016887742839”, “0.5716796354304043”, “0.4229791869017677”, “0.3731843430827401”, “0.3254446111798023”, “0.2542702545675339”, “0.25237940627189”, “0.2273716541964159”, “0.2012780334451323”, “0.2116151847259499”, “0.1921943719520009”, “0.1982429400169304”, “0.18001770452247”, “0.1982429400169304”, “0.1921943719520009”, “0.2116151847259499”, “0.2012780334451323”, “0.2273716541964159”, “0.25237940627189”, “0.2542702545675339”, “0.3254446111798023”, “0.3731843430827401”, “0.4229791869017677”, “0.5716796354304043”, “0.8495016887742839”, “1.849221286218342”
如何对其进行过滤/平滑?高斯滤波怎么样?有什么开始的想法,甚至是给我一个示例代码?感谢您的帮助!
最好的祝福
约瑟夫
2个回答

1
最简单的想法是取两点的平均值并将它们放入数组中。类似于:
double smooth_array[S];

for (i = 0; i<S-2; i++)
    smooth_array[i]=(magnitude[i] + magnitude[i+1])/2;

smooth_array[S-1]=magnitude[S-1];

这不是最好的方法,但我认为应该可以。

如果您需要科学方法-使用某种近似/逼近算法。例如最小二乘函数逼近或全SE13/SE35等算法。


谢谢Midas,你得到了第一个赞;)。请阅读我在@scott Hunter下的评论。 - josef
1
这不会“移动”样本吗?从某种意义上说,您计算的值应该具有i +(1/2)的索引(如果这些代表时间或位置而不仅仅是序数,则更有意义)。 - Scott Hunter
@ScottHunter 我不明白你的意思,i+(1/2)是什么意思? 你能否编辑你的答案,并写出正确的代码让我可以接受。如果你知道如何使用高斯(如果可能的话)来实现,请也写下来。非常感谢。 - josef
如果数据是一个时间序列,其中每个索引代表特定的时间点,那么通过将时间i处的值与时间i+1处的值求平均值,实际上计算的是时间i处的平滑值,这可以解释为您预期的时间ii+1之间的值(因此,是i+(1/2))。 - Scott Hunter
@ScottHunter 我正在计算FFTW的结果,所以它不再取决于时间,所以我认为我可以使用它,但是要加上:for (i = 0; i<S-1; i++) - josef

1
最简单的平滑方法是用它和其两个邻居的平均值替换每个样本。

高斯呢?它不是更有效率吗? - josef
2
每个样本只需要两次加法和一次除法就可以得到非常高效的计算。高斯模糊可能会提供更好的平滑效果,但可能并不更有效率。 - Scott Hunter
你能为我编写如何使用高斯的代码吗? - josef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接