如何自动识别和消除基频及其所有谐波?

信息处理 过滤器 频谱
2021-12-23 04:27:35

我有一些显微镜数据被我想移除的心跳伪影污染。数据由以约 60Hz 捕获的大量时间序列图像组成。

这是一个 GIF 格式的小示例剪辑:

gif

我采用了一段时间内的平均像素强度,并使用 Welch 的方法计算了周期图:

在此处输入图像描述

如您所见,在 ~1.8Hz 处有一个尖峰,可能对应于心率(~108 次/分钟)。在 1.8Hz 的整数倍处还有一堆谐波峰值。确切的心率可能因数据集而异,但我可以指定一个生物学上合理的范围,如周期图上的阴影区域所示。

我想做的是:

  1. 自动检测与心跳对应的基频及其所有谐波
  2. 过滤数据以去除基波和所有谐波。

目前我可以通过在周期图中找到最大峰值来非常粗略地解决第 1 点,然后将其乘以,其中是谐波峰值的估计数,但我确信必须是比这个 hack 更好的方法。1,2,...,NN

关于第 2 点,我遇到了这个问题,其中提到使用梳状滤波器去除基波及其所有谐波。这是最好的使用方法吗?一个重要的考虑因素是我必须将过滤器应用于大型阵列中的每个像素时间序列,因此非常需要一种计算效率高的方法。

示例数据

4个回答

您的方法对于第一次尝试来说还不错。

但是,以下方法往往效果更好:

  1. 搜索局部最大值
  2. 检查接近的最大值(2 或 3 个 bin 间距)并将它们合并
  3. 创建一些关于基频的假设。您目前假设最高峰是基频,这是一种假设。您还应该检查最高峰是一次谐波的可能性,即在主峰频率的一半处有一个较小的峰值。您可能还需要考虑其他情况,利用您对手头问题的了解(干扰?心跳不规则?)。
  4. 假设这些假设中的每一个,通过将抛物线拟合到每个谐波峰值来找到地面频率。由于噪声,每个峰值都会产生略微不同的估计,但这些误差是不相关的并且是平均的。其中一个假设将导致更好的拟合,选择该假设预测的地面频率。
  5. 使用您在步骤 4 中找到的地面频率作为给定值,重新拟合每个峰值周围的抛物线以估计峰值的高度。请注意,峰值可能位于两个箱之间。
  6. 您现在有了基波及其谐波的位置和强度,但没有相位。找到基波的相位,减去它,找到一次谐波的相位等可能是最容易的。

这样做效果更好的核心原因是第 4 步。当您试图在预测的谐波位置附近拟合峰值时,任何关于接地频率的错误假设都会严重失败。假设您在 2 Hz 处有一个峰值。这可以是接地频率或一次谐波。当您测试“一次谐波假设”时,即地面频率是否实际上是 1 Hz,您将抛物线拟合到 1、2、3、4、5 ... Hz 附近的数据。如果这个假设是错误的,你会在 1,3,5 Hz 左右得到垃圾。如果正确,您可能会在 1.1 Hz、2.2、3.3、4.4 和 5.6 附近发现峰值——这表明实际地面频率为 1.12 Hz。

您正在寻找迭代谱减法这是Alexander Lerch的内容分析书中的一些一般信息。

我建议对您的周期图进行自相关。您可以根据相关性产生的基频的倍数构建陷波或负峰化滤波器。

这段代码帮助我创建了一个很好的自相关图(倒谱是另一种很好的方法,当谐波的功率大于基波时) http://note.sonots.com/SciSoftware/Pitch.html

1. Automatically detect the fundamental frequency corresponding to the heartbeat, and all of its harmonics

您可以通过 DFT 取局部平均值来查找心跳。如果该组中的某个点大于threshold并且在其周围某个范围内的最大值,则它是心跳或谐波。

2. Filter the data so as to remove the fundamental and all harmonics.

您可以只使用先前定位的心跳索引并线性缝合它们。如果这对你来说不是太粗糙的话。

这部分操作的目的是什么?这是一种需要没有心跳来寻找其他(可能)隐藏数据的医学分析吗?还是这个标准只是为了美观?

我想梳状滤波器会有点无法控制。这将需要仔细调整反馈参数。它可能是可行的。

编辑:您需要音高检测算法吗?几年前,我通过忽略(接近)DC 项并找到第一个局部最大值来写其中一个。然后使用任一侧的箱,我可以使用二次插值并找到最大频率的位置,比箱本身的频率所允许的分辨率更准确。

使用谐波会更准确吗?它可能只会增加出错的机会。尽管您可以尝试使用此方法获取基本值,并在双倍、三倍等处找到最大值,然后使用与以前类似的方法:

  1. 找到局部最大值 2. 二次插值以找到频率的 bin 间值。

如果您否决二次步骤并仅采用局部最大值,您将无法获得准确的频率,并且向上移动谐波会有所帮助。