来自麦克风的平滑信号 - 心跳
Smoothing signal from microphone - Hearthbeat
我正在使用 oximeter.I 进行项目工作,希望对其进行平滑处理,以便我可以使用它来计算心跳。我从麦克风收集原始数据,我把它们放在新数组中,比方说,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)看起来不错,但是它太不准确了,所以我无法从中计算出心率。它有这么多 "Bounce" 处于 "high" 状态。我在互联网上发现某种过滤器(也许是 IIR 过滤器)可以完成这项工作。所以我只想问你们我怎样才能得到一个漂亮的平滑图表? IIR 滤波器是可行的方法吗?有没有免费的 applet/lib 来平滑它?
这是我在这里的第一个问题,所以如果写得不好,我真的很抱歉。
如果您需要更多信息来帮助我,请尽管询问。
这是我的图表现在的样子。
http://oi62.tinypic.com/2uf7yoy.jpg // 无法 post 图片是新的。
虽然这是幸运的。
我需要更流畅的输出。
测量时出现的噪声频率很高。你应该过滤你的信号,也就是说你应该保留信号的低频部分并抑制信号的高频部分。你可以做到,制作一个低通滤波器。例如,它可以是一阶惯性模型。我建议将通带设为 ~~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 向量。
我正在使用 oximeter.I 进行项目工作,希望对其进行平滑处理,以便我可以使用它来计算心跳。我从麦克风收集原始数据,我把它们放在新数组中,比方说,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)看起来不错,但是它太不准确了,所以我无法从中计算出心率。它有这么多 "Bounce" 处于 "high" 状态。我在互联网上发现某种过滤器(也许是 IIR 过滤器)可以完成这项工作。所以我只想问你们我怎样才能得到一个漂亮的平滑图表? IIR 滤波器是可行的方法吗?有没有免费的 applet/lib 来平滑它? 这是我在这里的第一个问题,所以如果写得不好,我真的很抱歉。 如果您需要更多信息来帮助我,请尽管询问。 这是我的图表现在的样子。
http://oi62.tinypic.com/2uf7yoy.jpg // 无法 post 图片是新的。
虽然这是幸运的。 我需要更流畅的输出。
测量时出现的噪声频率很高。你应该过滤你的信号,也就是说你应该保留信号的低频部分并抑制信号的高频部分。你可以做到,制作一个低通滤波器。例如,它可以是一阶惯性模型。我建议将通带设为 ~~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 向量。