.wav 文件中的心率 (BPM) 计算

Posted

技术标签:

【中文标题】.wav 文件中的心率 (BPM) 计算【英文标题】:Heart rate(BPM) calculation from .wav file 【发布时间】:2021-12-12 02:44:35 【问题描述】:

我有一个数字听诊器,我可以用安卓手机轻松录制人的心音,而且很清晰,我可以从录制的文件中清晰地听到 lub-dub(s1-S2)。

我想计算录制音频的心率,有什么方法可以从音频文件中计算 BPM?

我已经在 Kotlin 和 java 中编写了一些 android 应用程序。

提前致谢

【问题讨论】:

对库的请求与主题无关。但我推荐 Noise 使用 FFT。您必须阅读 FFT 的数学知识,才能知道您在寻找什么来找到热节拍。 除非心脏在振荡(在这种情况下与您的患者交谈)我不确定傅立叶变换会告诉您很多信息。对于 bpm,您需要检测峰值并找到它们之间的距离。使用 wav,您将知道采样率,因此可以推断峰值之间的持续时间。您可能希望有一个读数的移动平均窗口以保持一定的稳定性。如果这是出于医疗目的,请咨询大学,而不是互联网。无论如何,遗憾的是,这不是一个适合 SO 的问题。 所有声音都在振荡。 FFT 可用于滤除您不关心的声音频率和一般噪声,因此您可以对峰值进行更清晰的信号采样。当然,这可能没有必要。我从未使用过心跳音频。 你能上传一个或几个音频文件吗? @JonNordby 我无法与您共享该文件 【参考方案1】:

首先,获取数据的 PCM 值流(例如,如果您的数据是 16 位,则浮点数范围为 -1 到 1,或者可能是 -32768 到 32767 的短值)。我假设是签名的 PCM。

其次,对数据应用 RMS(均方根)函数,以获得数据过程中音量的相对功率,并寻找峰值。我假设每个“重击”都是一个相对响度的点,并且“重击”之间的音频音量会较小。

第三,计算峰值之间的帧数。使用您的采样率,您可以从中得出时间值。

IDK 详细了解 Android/Kotlin 系统如何提供对 PCM 的访问。很可能它将采用根据音频格式编码的字节流的形式。例如,单声道、44100 fps、16 位、小端。使用 Java,可能会涉及到 TargetDataLine

SO 有一些问题解释了如何将字节转换为 PCM。

SO 还有关于如何将 RMS 函数应用于 PCM 的问题。这涉及到一些聚合,因为它涉及计算移动平均线。

我不知道频率分析工具是否有用。心跳的频率非常低,例如每秒 1 或 2 次。我们甚至听不到每秒 20 以下的频率。但也有可能在这么低的频率范围内工作的工具。

【讨论】:

以上是关于.wav 文件中的心率 (BPM) 计算的主要内容,如果未能解决你的问题,请参考以下文章

心脏 BPM 标准化 - Matlab

iOS HealthKit 如何保存心率(bpm)值?迅速

iOS HealthKit 如何保存心率(bpm)值?迅速

从计算机的文件中播放 Java 中的 .wav 文件

在没有 iPhone 的情况下获取实时心率 watchOS 4

在没有 iPhone 的情况下获取实时心率 watchOS 4