如何在matlab中设计1到20 Hz的零相带通滤波器?

时间:2015-07-09 18:31:17

标签: matlab filter

我正在使用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)

1 个答案:

答案 0 :(得分:1)

设计过滤器

让我们从Matlab中设计Butterworth滤波器的基础知识开始。在这里,我们只能使用标准化频率定义滤波器。因此,我们需要知道采样频率fs以确定标准化频率fn,如下所示:fn = f/fs。然后我们需要订单order和两个截止频率fc1fc2butter的第二个参数从0到1采用“频率”,其中1对应于奈奎斯特速率,它是采样频率fs的一半。因此,我们必须在第二个参数中将fs除以2。

[b,a] = butter(order, [fc1,fc2]/(fs/2), 'bandpass');

应用

现在我们可以进入您的代码并应用过滤器。请注意,filtfilt为零阶段,并且是原始过滤器的顺序的两倍。我们可以从herefs假设为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)

结果如下:

result