メモ用に、以下から転載しました。
1. ベースラインドリフトを理解する
1. ベースラインドリフトとは何ですか?
特に低周波数のカーブが元の信号に重畳され、元の信号がゆっくりとわずかに上下に変動する傾向が生じます。以下に示すように:
(参考:信号ベースラインドリフトとは何ですか?)
(参考:ECG信号の読み取り、QRS、P、T波の検出 - 高周波ノイズとベースラインドリフトの除去)
(参考: ECG 信号 - ECG ノイズの発生源)
2. ベースラインドリフトの危険性は何ですか?
ベースライン ドリフト/トレンド アイテムが削除されない場合、トレンド アイテムは収集された元の信号とみなされ、信号の精度とその後のデータ処理結果に影響します。
ベースライン ドリフトが存在すると、FFT解析、相関解析、およびパワー スペクトル密度解析中に歪みが発生し、その結果、低周波数のピークが発生し、さらには主要な周波数成分が沈み込み、精度に重大な影響を及ぼします。以下に示すように:
2. トレンドアイテムの排除方法
ベースライン ドリフトの本質は、元の信号に DC 成分と低周波成分が重畳されていることです。フィルタリング法とフィッティングベースライン法は、最も一般的に使用される 2 つのベースドリフト抑制法です。
1. 最小二乗フィッティング
原理: 最小二乗法はトレンド項目を当てはめ、元のデータからトレンド項目を減算します。
2. ウェーブレット変換
ベースライン ドリフトは主に低周波成分であり、ウェーブレット変換のマルチスケール分解プロセスを通じて、元の信号から差し引くことができる分解された低周波係数で信号のベースライン トレンドを観察できます。
(参考:ベースラインドリフトのいくつかの方法)
3.EMD
EMD 手法では、あらゆる信号がいくつかの異なる固有モード関数 (IMF) と残留定常状態に分解できると考えられます。さまざまな固有モード関数のそれぞれは信号の局所特性を反映し、残差は信号の傾向または平均を反映します。したがって、EMD法では「スクリーニング」という方法で残存量を分離することができます。
(参考:ベースラインドリフトのいくつかの方法)
ベースライン ドリフトを除去するその他の方法には、凸最適化、従来の方法の平滑化、VMD、FIR フィルタリング、メディアン フィルタリング、ローパス フィルタリングなどが含まれます。
(参考:ベースラインドリフトへ)
(参考:デジタル信号処理実験(6)~心電図信号処理・IIR・FIRフィルタリング・総合問題(その2)~)
方法 |
アドバンテージ |
欠点がある |
FIRフィルタリング |
原理はシンプルで累積誤差がなく、リアルタイムの状況に適しています |
振幅周波数歪みは明らかです |
最小二乗フィット |
原理は単純で、Matlab には直接呼び出すことができるライブラリ関数があります。 |
信号のフィッティングでは、トレンド項目の種類(直流成分、線形成分、指数関数、べき乗関数など)を事前に予測する必要があり、トレンド項目の複雑さが増すにつれてフィッティングの難易度も上がり、複雑な実際の信号には適していません。 |
ウェーブレット変換 |
ウェーブレット基底関数の選択とウェーブレット次数の決定は両方とも事前に予測する必要があります |
|
EMD |
信号自体のタイムスケール特性に基づいて、基底関数を選択する必要がなく、非線形および非定常信号の処理に非常に適しており、高い信号対雑音比を備えています。 |
(参考:脳波信号のベースラインドリフトの概要)
(参考:トレンドアイテムの除去方法まとめ)
3. Matlab シミュレーションの観点からトレンド項目の除去を理解する
1. MATLAB コマンド
1. 消除直流分量和线性趋势
- detrend(x):消除时间序列线性趋势项
- detrend(x, 'constant'):消除时间序列均值
- detrend(x, 'linear', bp):分段消除时间序列中的线性趋势项,bp 为分段点向量
2. 消除多项式趋势项(非线性趋势项)
a = polyfit(t, x, order)
xtrend = polyval(a, t)
xdetrend = x - xtrend
(参考:detrend関数の意味)
(参考:時系列トレンド項目抽出(Matlab))
2. MATLAB シミュレーション
%% 去除基线漂移
clear; close all; clc; warning off;
%% 1. 消除直流分量
fs = 100; % 采样频率
L = 10;
t = 1 : 1/fs : L;
f = 10; % 信号频率
consValLis = 2 * ones(1, length(t)); % 直流分量
x1 = consValLis + sin(2 * pi * f * t); % 叠加有直流分量的信号
figure(1);
subplot(4, 1, 1); plot(x1, 'linewidth', 1.5); ylim([-2, 4]); title('叠加有直流分量的原始信号');
subplot(4, 1, 2); plot(x1-mean(x1), 'linewidth', 1.5); ylim([-2, 4]); title('去除直流分量的原始信号(x-mean(s)方法)');
subplot(4, 1, 3); plot(detrend(x1), 'linewidth', 1.5); ylim([-2, 4]); title('去除直流分量的原始信号(detrend去除线性趋势项方法)');
subplot(4, 1, 4); plot(detrend(x1, 'constant'), 'linewidth', 1.5); ylim([-2, 4]); title('去除直流分量的原始信号(detrend去除均值方法)');
%% 2. 去除线性趋势项
linearValLis = t .* ones(1, length(t)); % 线性趋势项
x2 = linearValLis + sin(2 * pi * f * t); % 叠加有线性趋势项的信号
[y2, xtrend2] = polydetrend(x2, fs, 1);
figure(2);
subplot(4, 1, 1); plot(x2, 'linewidth', 1.5); title('叠加有线性趋势项的原始信号');
subplot(4, 1, 2); plot(detrend(x2), 'linewidth', 1.5); ylim([-2, 4]); title('去除线性趋势项的原始信号(detrend去除线性趋势项方法)');
subplot(4, 1, 3); plot(y2, 'linewidth', 1.5); ylim([-2, 4]); title('去除线性趋势项的原始信号(ployfit拟合线性项方法)');
subplot(4, 1, 4); plot(xtrend2, 'linewidth', 1.5); title('线性趋势项');
%% 3. 去除多项式趋势(非线性趋势)
nonLinearValLis = 10 * t .* sin(2 * pi * 0.2 * t); % 非线性趋势项
x3 = nonLinearValLis + sin(2 * pi * f * t); % 叠加有非线性趋势项的信号
[y3, xtrend3] = polydetrend(x3, fs, 20);
figure(3);
subplot(3, 1, 1); plot(x3, 'linewidth', 1.5); title('叠加有非线性趋势项的原始信号');
subplot(3, 1, 2); plot(y3, 'linewidth', 1.5); ylim([-2, 4]); title('去除非线性趋势项的原始信号(ployfit拟合非线性项方法)');
subplot(3, 1, 3); plot(xtrend3, 'linewidth', 1.5); title('非线性趋势项');
%% 最小二乘法拟合趋势项函数
function [y, xtrend] = polydetrend(x, fs, order)
% x:带有趋势项的信号
% fs:信号采样频率
% order:最小二乘法拟合多项式阶数
x = x(:); % 转为列向量
N = length(x);
t = (0: N-1)' / fs;
a = polyfit(t, x, order); % 用最小二乘法拟合x的多项式系数a
xtrend = polyval(a, t); % 构成趋势项
y = x - xtrend; % 去除趋势项
操作結果:
注: 最小二乗法を使用してトレンド アイテムを当てはめるには、適切な多項式次数を選択する必要があります。次数が高すぎたり低すぎたりすると、理想的なトレンド アイテムを当てはめることができなくなります。以下に示すように:
上の図からわかるように、5 と 10 の次数ではトレンド項目を完全に除去することはできませんが、40 と 80 の次数では過学習による信号の歪みが発生します。
(参考: MATLAB ECG 信号データからのトレンド項の除去)
(参考:ベースライン調整 - 多項式トレンド項の最小二乗消去)
(参考:データの直線トレンドの除去)