我正在使用Matlab过滤心电图数据。数据中有噪音,我尝试过使用Butterfilter。问题是有更高功率的黄油过滤器,任何高于3的数据都会使数据消失。
我查看了Matlab关于过滤器设计的帮助指南,但我不清楚并且仍然对如何实际使用它并实现它感到困惑。
目标:使用零相位失真过滤ECG数据,在1到20 Hz之外过滤所有
我的代码现在:
%takes in one channel of data from the dataMatrix, plots it, filters, and plots again in a new figure
channel = 150;
x = dataMatrix(:,channel);
plot(x)
rawTitle = sprintf('Raw Channel %d ', channel);
title(rawTitle)
figure
[b_pass a_pass] = butter(3, [1/1000 20/1000], 'bandpass');
plot(filtfilt(b_pass, a_pass, x))
channelTitle=sprintf('Filtered Channel %d ', channel);
title(channelTitle)
答案 0 :(得分:1)
让我们从Matlab中设计Butterworth滤波器的基础知识开始。在这里,我们只能使用标准化频率定义滤波器。因此,我们需要知道采样频率fs
以确定标准化频率fn
,如下所示:fn = f/fs
。然后我们需要订单order
和两个截止频率fc1
和fc2
。 butter
的第二个参数从0到1采用“频率”,其中1对应于奈奎斯特速率,它是采样频率fs
的一半。因此,我们必须在第二个参数中将fs
除以2。
[b,a] = butter(order, [fc1,fc2]/(fs/2), 'bandpass');
现在我们可以进入您的代码并应用过滤器。请注意,filtfilt
为零阶段,并且是原始过滤器的顺序的两倍。我们可以从here(fs
假设为500Hz)中获取一些样本数据,看看它是否按预期工作。
% load sample data and assign it to x
load('ecg.mat');
fs = 500;
x = ecg;
% define to use OP's code
channel = 150;
% plot the raw data
figure
plot(x)
rawTitle = sprintf('Raw Channel %d ', channel);
title(rawTitle)
% design filter
[b_pass,a_pass] = butter(3,[1,20]/(fs/2), 'bandpass');
% filter data and plot it
figure
plot(filtfilt(b_pass, a_pass, x))
channelTitle=sprintf('Filtered Channel %d ', channel);
title(channelTitle)
结果如下: