我有一个 1×10000 的双精度矩阵存储在一个名为“fecg.mat”的文件中。该矩阵表示记录的 FECG 信号的幅度。
我已经根据时间(从 0 到 9999)绘制它:
为了去除基线,我想知道是否可以使用高通滤波器。如何设计合适的过滤器?
PS 信号处理不是我的研究领域。我不知道如何过滤离散的时域信号。
我有一个 1×10000 的双精度矩阵存储在一个名为“fecg.mat”的文件中。该矩阵表示记录的 FECG 信号的幅度。
我已经根据时间(从 0 到 9999)绘制它:
为了去除基线,我想知道是否可以使用高通滤波器。如何设计合适的过滤器?
PS 信号处理不是我的研究领域。我不知道如何过滤离散的时域信号。
删除基线最简单的方法是删除平均值:
filtered = original - mean(original);
实际上,平均值是傅里叶变换的第一个系数,所以它实际上是一个非常尖锐的滤波:你正在消除 DC 系数。
如果您想要更经典的过滤,请查看类似butter
和朋友的功能,它们将合成一个 IIR 滤波器,然后用于filter
过滤掉您的信号。
Matlab 还包括一个滤波器设计工具。
MATLAB 有一个称为 fdatool 的滤波器设计工具。在 MATLAB 中运行 fdatool,它为您提供了一个可视 GUI,您可以在其中更改过滤器参数。从那里选择一个高通滤波器并选择一个截止频率。当您对滤波器形状感到满意时,将其导出到 MATLAB 工作区。假设您的过滤器名称是 myFilter,而您的信号名称是 mySignal。然后在 MATLAB 类型中过滤信号:filteredSignal = conv(mySignal,myFilter)。
如果您知道所需信号的频率内容,您可以高通略低于该频率。假设您只对 2 Hz 以上的信号感兴趣并且您的采样率为 100 Hz,那么您可以按如下方式执行此操作:
[b,a] = butter(3,2/(100/2),'high');
outputData = filter(b,a,inputData);
这是使用三阶巴特沃斯高通的具体示例。
使用哪个过滤器实际上取决于特定的应用程序。- 过于粗糙的过滤器可能会删除您正在寻找的信息!
广泛使用的Pan-Tompkins 算法(用于 QRS 检测)指定了一个过滤器,用于去除 ECG 数据中的基线。但是从您提供的有限信息中很难确定此过滤器是否适合您的应用。请详细说明以获得更准确的答案。