java - .wav 文件中的心率 (BPM) 计算
问题描述
我有一个数字听诊器,我可以用安卓手机轻松录制人的心音,而且很清楚,我可以从录制的文件中清楚地听到 lub-dub(s1-S2)。
我想计算录制音频的心率,有没有办法从音频文件计算 BPM?
我在 Kotlin 中编写了 Android 应用程序,并在 java 中编写了一些部分。
提前致谢
解决方案
首先,获取数据的 PCM 值流(例如,从 -1 到 1 的浮点数,或者如果您的数据是 16 位,则可能是从 -32768 到 32767 的短整数)。我假设签署了 PCM。
其次,对数据应用 RMS(均方根)函数,以获得数据过程中体积的相对功率,并寻找峰值。我假设每个“重击”都是一个相对响度的点,并且“重击”之间的音频音量较小。
第三,计算峰值之间的帧数。使用您的采样率,您可以从中得出时间值。
IDK Android/Kotlin 系统如何提供对 PCM 的访问的细节。很可能它将采用根据音频格式编码的字节流的形式。例如,单声道、44100 fps、16 位、小端。使用 Java,TargetDataLine
可能会涉及到 a。
SO 有解释如何将字节转换为 PCM 的问题。
SO 也有关于如何将 RMS 函数应用于 PCM 的问题。涉及一些聚合,因为它涉及计算移动平均线。
我不知道频率分析工具是否有用。心跳的频率非常低,例如每秒 1 或 2 次。我们甚至听不到每秒 20 以下的频率。但是有可能的工具可以在这么低的频率范围内工作。
推荐阅读
- html - 如何在 Html / Bootstrap 中控制容器的大小?
- oracle - Jenkins Oracle 身份验证
- logic - 将引理应用于合取分支而不在 coq 中拆分
- dataframe - 在 DataFrame 中操作数据:如何计算列的平方
- javascript - 基于映射数组字段的 React Native 条件样式
- ios - 带有 UIViewRepresantable 的 UITableView 的某些单元格位置错误
- pyspark - 使用 regexp_replace 在 pypsark 上循环出现错误消息
- php - 从保存在数据库中的树枝模板中提取变量。树枝, PHP/Symfony
- javascript - 在 VueJS 中重用现有的 AngularJS 服务
- node.js - 如何使用angular 8以任何格式从mongodb搜索电话号码