来自麦克风的平滑信号 - 心跳

时间:2015-04-14 17:35:26

标签: java android signal-processing microphone

我正在研究使用血氧计的项目。我想让它平滑,所以我可以用它来计算心跳。我正在从麦克风收集原始数据,我把它们放在新数组中,比方说,sData[]

信号非常疯狂,并按预期跳过整个情节,所以我尝试使用移动平均线来平滑它。所以我的主要代码看起来像这样。

writeAudioDataToFile(); 
for (int a = 0; a < sData.length; a++) {  
      tempAvg += Math.abs(sData[a]);
      if (a % numberOfSamplesAveraged == 0) { //Average from x samples
            if (myIndex > SAMPLE_SIZE - 1) {
                myIndex = 0;
            }
            tempAvg = tempAvg / numberOfSamplesAveraged;
            if (tempAvg > 500) {
                newDataArray[myIndex] = 500;
            }else{
                newDataArray[myIndex] = tempAvg;
     } //This is suppose to clear the high peaks.

     Log.d("isRecording - Average from " + numberOfSamplesAveraged + " numbers.", "newDataArray[" + myIndex + "] = " + newDataArray[myIndex]);
     tempAvg = 0;
     myIndex++;
   }
}
notifier.notifyObservers();
Log.d("Notifier", "Notifier Fired!");

Thread.sleep(20); //Still experimenting with this value

它看起来很混乱,但情节(我使用AndroidPlot btw)看起来不错,但它是如此不准确,所以我无法从中计算出心率。它在“高”状态下有如此多的“反弹”。我在互联网上发现某种过滤器(也许是IIR过滤器)可以完成这项工作。所以我只想问你们,我怎样才能获得一张漂亮的平滑图表呢? IIR过滤器的方式是什么?是否有任何免费的applet / lib来平滑它? 这是我的第一个问题,所以如果写得不好,我真的很抱歉。 如果您需要更多信息来帮助我,请询问。 这是我的图表现在的样子。

http://oi62.tinypic.com/2uf7yoy.jpg //不能在这里发布新图片。

但这是一个幸运的。 我需要更顺畅的输出。

1 个答案:

答案 0 :(得分:2)

在测量时出现的噪声具有高频率。你应该过滤你的信号,即你应该保留信号的低频部分并抑制高频部分信号。你可以做到这一点,制作一个低通滤波器。例如,它可以是一阶惯性模型。我建议制作一个通带直到~10 kHz,因为人们会听到2 kHz到20 kHz的声音。然后适当的采样时间是0,0001秒(0.1毫秒)。离散模型具有以下等式:

y[k] = 0.9048*y[k-1] + 0.09516*u[k-1]

其中u是测量矢量(直接来自麦克风,在我们的滤波器中输入), 和y是你想要分析的矢量(所以从我们的过滤器输出)。

如您所见,您可以计算样本编号1,您可以将0分配给样本编号0.毕竟,您可以尝试绘制y矢量。