首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB:滤波含噪EKG信号

MATLAB:滤波含噪EKG信号
EN

Stack Overflow用户
提问于 2009-11-20 22:04:45
回答 2查看 30.6K关注 0票数 7

用matlab从心电图信号中去除噪声的最佳滤波器是什么?

EN

回答 2

Stack Overflow用户

发布于 2009-11-20 23:22:01

如果您可以访问信号处理工具箱,那么请检查Savitzky-Golay滤波器,即函数sgolay。这里有一个附带的演示,只需运行sgolaydemo

下面是一个示例,说明您可以将滤波和去噪应用于信号的各种方法。注意,其中一些函数需要有特定的工具箱:

代码语言:javascript
复制
% load ecg: simulate noisy ECG
Fs=500;
x = repmat(ecg(Fs), 1, 8);
x = x + randn(1,length(x)).*0.18;

% plot noisy signal
figure
subplot(911), plot(x), set(gca, 'YLim', [-1 1], 'xtick',[])
title('noisy')

% sgolay filter
frame = 15;
degree = 0;
y = sgolayfilt(x, degree, frame);
subplot(912), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[])
title('sgolayfilt')

% smooth
window = 30;
%y = smooth(x, window, 'moving');
%y = smooth(x, window/length(x), 'sgolay', 2);
y = smooth(x, window/length(x), 'rloess');
subplot(913), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[])
title('smooth')

% moving average filter
window = 15;
h = ones(window,1)/window;
y = filter(h, 1, x);
subplot(914), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[])
title('moving average')

% moving weighted window
window = 7;
h = gausswin(2*window+1)./window;
y = zeros(size(x));
for i=1:length(x)
    for j=-window:window;
        if j>-i && j<(length(x)-i+1) 
            %y(i) = y(i) + x(i+j) * (1-(j/window)^2)/window;
            y(i) = y(i) + x(i+j) * h(j+window+1);
        end
    end
end
subplot(915), plot( y ), set(gca, 'YLim', [-1 1], 'xtick',[])
title('weighted window')

% gaussian
window = 7;
h = normpdf( -window:window, 0, fix((2*window+1)/6) );
y = filter(h, 1, x);
subplot(916), plot( y ), set(gca, 'YLim', [-1 1], 'xtick',[])
title('gaussian')

% median filter
window = 15;
y = medfilt1(x, window);
subplot(917), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[])
title('median')

% filter
order = 15;
h = fir1(order, 0.1, rectwin(order+1));
y = filter(h, 1, x);
subplot(918), plot( y ), set(gca, 'YLim', [-1 1], 'xtick',[])
title('fir1')

% lowpass Butterworth filter
fNorm = 25 / (Fs/2);               % normalized cutoff frequency
[b,a] = butter(10, fNorm, 'low');  % 10th order filter
y = filtfilt(b, a, x);
subplot(919), plot(y), set(gca, 'YLim', [-1 1])
title('butterworth')

票数 16
EN

Stack Overflow用户

发布于 2009-11-20 23:51:00

您可能需要查看的两个筛选器设计工具/演示:

  • FDATool信号处理工具箱中(如果您可以访问它)。
  • 模拟滤波器设计工具箱詹姆斯·斯奎尔带来的MathWorks文件交换。似乎对工具箱中包含的EKG数据进行了装配模拟。

这些应该让您有机会尝试不同的滤波器和滤波器参数,看看它们如何处理EKG/ECG数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1773542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档