单片机在C语言中利用斜率进行峰值检测

单片机在C语言中利用斜率进行峰值检测,c,detection,microcontroller,C,Detection,Microcontroller,我正在用一个LED和一个接收器制作一个手指体积描记器(FP)。传感器产生一个模拟脉冲波形,该波形经过滤波、放大并馈送至微控制器输入端,范围为3.3-0V。该信号被转换成数字形式 采样率为8MHz,处理器频率为26MHz,精度为10或8位 我在提出一种稳健的峰值检测方法时遇到了问题。我希望能够通过手指容积描记器检测到心脏脉冲。我成功地用阈值法对心率进行了精确测量。然而,FP对运动极为敏感,信号的偏移量可根据运动而变化。然而,信号的峰值仍将显示,但电压偏移会发生变化 因此,我建议使用斜率来检测峰值的

我正在用一个LED和一个接收器制作一个手指体积描记器(FP)。传感器产生一个模拟脉冲波形,该波形经过滤波、放大并馈送至微控制器输入端,范围为3.3-0V。该信号被转换成数字形式

采样率为8MHz,处理器频率为26MHz,精度为10或8位

我在提出一种稳健的峰值检测方法时遇到了问题。我希望能够通过手指容积描记器检测到心脏脉冲。我成功地用阈值法对心率进行了精确测量。然而,FP对运动极为敏感,信号的偏移量可根据运动而变化。然而,信号的峰值仍将显示,但电压偏移会发生变化

因此,我建议使用斜率来检测峰值的峰值检测方法。例如,如果产生峰值,最大点前后的斜率将分别为正和负


你认为这种方法有多可行?使用微控制器进行峰值检测是否有更简单的方法?

移动设备时,仍然可以引入假峰值检测。无论您是对平均峰值持续时间计时,还是应用FFT(快速傅立叶变换),都会出现这种情况

使用FFT,您应该能够忽略您正在考虑的频率范围之外的峰值(例如<30 bpm和>300 bpm)


正如肯尼所说,8MHz可能会压倒26MHz芯片。如此高的采样率有什么特别的原因吗?

像一些评论一样,我也建议降低采样率,因为您现在只关心脉搏(即心率)。因此,假设你要观察静息心率,你将处于亚1Hz到2Hz的范围内(60 BPM=1Hz),这取决于受试者的健康状况、年龄等

为了隔离感兴趣的频率范围,我还建议使用一种简单的低阶数字滤波器。如果您可以访问Matlab,则可以使用其滤波器设计和分析工具()进行数字滤波器设计。您会发现,数字滤波()在计算上并不昂贵,因为它是一个乘法和加法的问题

要回答您问题的检测部分,是的,在微控制器内对体积描记器波形实施峰值检测肯定是可行的。以您的示例为例,基于斜率的峰值检测算法将对波形数据进行操作,搜索斜率的变化,基本上就是斜率波形过零的位置

这里有一些关于你的应用程序需要考虑的事情:

  • 计算坡度可以有一个“排列”(即,您是否找到相邻样本之间的坡度,或者找到相隔几个样本的样本之间的坡度?)
  • 如果您的峰值检测算法定位的峰值在生理意义上太近或太远,该怎么办
  • 脉搏血氧计()通常使用发光二极管,发光二极管发出红光和红外光。LED的频率如何影响体积描记器?(提示:这可能并不重要,但我相信你会发现一个波长在你感兴趣的频率范围内产生更大的振幅。)

当然,如果你进行文献搜索,你会发现各种可能的算法,但我认为基于斜率的检测非常简单。希望有帮助。

如果你能通过过零检测周期,即使是在10倍10 Hz的过采样下,你也可以使用quick-n-dirty-edge的直线拟合来找到准确的周期,然后将该周期内新波的采样与前一个周期相减,得到直流偏移。周期测量将具有采样率的精度。对时间和振幅标准化数据进行操作将容易得多


与仍然需要额外数据处理的FFT相比,这个想法在计算上很简单。

你认为你有处理简单有限脉冲响应滤波器的能力吗。即使使用简单的-10-1模式进行过滤也可能会有很大帮助。我不确定,我想避免升级到更强大的ucontroller,因为我目前的ucontroller具有低成本和低功耗的功能。建议的简单过滤器可以简单到3个加法/减法。降低我的重采样率是什么意思?en.wikipedia.org/wiki/Nyquist_frequency。CDs在44kHz下采样,以再现20kHz。因此,您应该考虑采样频率为12-30Hz,而不是8MHz。您认为微控制器能够对信号执行实时FFT吗?@maknelly计时单峰需要1s,但假设为10,则会减少约10%的误差。多花点时间,或者做一次FFT。不会超过10秒。哦,在回答你们的问题时,它给了我奇怪的信号数据点和跳过峰值。我将降低频率并进行调查,但感谢您的输入。简单的斜率检测是可以的,但要去除噪声,您最好在FFT中使用26MHz。