心电信号(ECG)是临床诊断心脏疾病的重要依据,但在实际采集过程中极易受到50Hz工频干扰(国内为50Hz,欧美为60Hz)。这种噪声会掩盖P波、T波等关键特征,直接影响心率变异性分析、ST段测量等诊断指标。本项目针对这一经典问题,采用自适应滤波技术中的NLMS(归一化最小均方)和RLS(递归最小二乘)算法实现陷波滤波器,并基于MIT-BIH心律失常数据库进行效果验证。
关键痛点:常规硬件滤波无法动态跟踪噪声频率漂移,而固定参数的IIR/FIR陷波器会引入相位失真。自适应滤波通过实时调整系数,在消除窄带干扰的同时最大限度保留信号特征。
自适应滤波器包含三个核心模块:
matlab复制% 基本流程伪代码
reference = sin(2*pi*50*t); % 参考噪声
for n = 1:length(ECG)
y(n) = w' * reference; % 滤波输出
e(n) = ECG(n) - y(n); % 误差信号
w = update_weights(w, e, reference); % 权重更新
end
NLMS通过归一化步长提升收敛稳定性:
matlab复制function [w, e] = nlms_filter(d, x, mu, order)
w = zeros(order,1);
for n = order:length(x)
x_vec = x(n:-1:n-order+1);
y = w' * x_vec;
e(n) = d(n) - y;
w = w + mu/(x_vec'*x_vec + eps) * x_vec * e(n);
end
end
参数选择经验:
RLS利用递归计算实现更快收敛:
matlab复制function [w, e] = rls_filter(d, x, lambda, delta, order)
P = delta^-1 * eye(order);
w = zeros(order,1);
for n = order:length(x)
x_vec = x(n:-1:n-order+1);
k = (P * x_vec) / (lambda + x_vec' * P * x_vec);
e(n) = d(n) - w' * x_vec;
w = w + k * e(n);
P = lambda^-1 * (P - k * x_vec' * P);
end
end
关键参数说明:
matlab复制[signal, Fs, tm] = rdsamp('mitdb/100', 1);
| 指标 | NLMS | RLS |
|---|---|---|
| SNR提升(dB) | 15.2±3.1 | 18.7±2.8 |
| 收敛时间(ms) | 120±25 | 35±12 |
| RMS误差(μV) | 8.7±2.4 | 6.1±1.9 |
实测发现:RLS在信号突变时(如室性早搏)会出现短暂失锁,可通过λ动态调整改善
传统方法直接使用理想正弦波,实际建议:
matlab复制% 基于锁相环的动态参考生成
phase = mod(2*pi*50*cumtrapz(1/Fs, ones(size(t))), 2*pi);
reference = sin(phase + phi_est); % phi_est通过PLL估计
matlab复制buffer = zeros(1,order*2);
ptr = 1;
while processing
buffer(ptr) = new_sample;
ptr = mod(ptr, order*2) + 1;
x_vec = buffer([ptr:end 1:ptr+order-1]);
% ...滤波处理...
end
针对12导联ECG,采用分频段处理:
matlab复制for ch = 1:12
% 各导联独立RLS核心
[w_ch, e_ch] = rls_filter(ECG(ch,:), ...);
% 导联间相关性约束
w_ch = w_ch + 0.1*mean(w_all,2);
end
用LSTM预测噪声成分:
matlab复制noise_est = lstmLayer.predict(reference_seq);
e = ECG - (w'*x_vec + noise_est); % 混合误差
项目包含以下关键文件:
main.m:主流程控制nlms_filter.m:NLMS实现rls_filter.m:RLS实现load_mitdb.m:数据加载工具eval_metrics.m:性能评估函数调试技巧:在
dbstop if error模式下运行,配合parfeval实现多参数并行测试