【问题标题】:Get frequency of a noisy sample vector获取噪声样本向量的频率
【发布时间】:2012-06-10 16:40:34
【问题描述】:

我主要需要一个通用算法,然后将其移植到我的系统(Arduino 板)上,但我很高兴得到继续研究其他方向的提示;

我有一组大约 650 个样本,覆盖 5 秒,代表一个周期信号,但噪声很大;样本来自TAOS230光传感器,信号是基于血流的人体皮肤透明度。

我需要主要/主要信号的频率,这实际上是人类的脉搏。 示例看起来类似于此https://www.dropbox.com/s/fw196r6yf1awhrh/untitled2.bmp

这里有一个包含大约 5k 个样本的转储 https://www.dropbox.com/s/efwvyn5oec7ixgg/samples.txt

谢谢,

亚历克斯

【问题讨论】:

  • 计算功率谱并寻找 0.5 Hz - 3 Hz 范围内的最大峰值?
  • FFT 对于 arduino 来说太难了。改用自相关是一种旧算法,但很有用。见:arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1143061795
  • @Eudaid:在如此低的采样率下,Arduino 应该可以毫无问题地实时运行基于 FFT 的算法,并有足够的计算带宽可供使用。

标签: filtering arduino frequency noise-reduction


【解决方案1】:

我经常为 arduino 做的事情是使用一个平均输入数据的函数 喜欢

newx 包含新的样本数据

 x = (9 * x +newx ) /10

这会抑制信号, 另请注意,焊接不良也与高噪音水平有关,请检查一下。

下一步是定义实际平均值,然后您可能会计算您高于/低于多少次以检索频率,我会通过将其定义为 -n below 或 +n above 来做到这一点。这是一个有点模糊的实现,但会起作用。 (否则,如果你不使用与平均值的距离 n,你会在平均值上得到许多误报。

使函数只计算状态变化 在伪代码中:

#// counting state changes
if ( state > avg_state + n ) and (oldstate = -1)  {statecount++ : oldstate = +1 } 
if ( state < avg_state - n ) and (oldstate = +1)  {statecount-- : oldstate = -1 }

它可能有点简单(没有 FFT),但通常简单的东西效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多