ベースラインを解除するための複数の方法

detrend 関数はベースラインを削除します

detrend 関数は線形トレンドを削除するためにのみ使用でき、非線形トレンドに対しては何もできません。

関数式: y = scipy.signal.detrend(x): 信号から線形トレンドを削除します。

x: ベースライン干渉のある信号; y: ベースライン干渉を除去した後の信号。

detrend go のベースライン コードは次のようになります。

from scipy import signal
import matplotlib.pyplot as plt
import numpy as np

t = np.linspace(0, 5, 100)
# normal是产生一个高斯分布
x = t + np.random.normal(size=100)
plt.subplot(2, 1, 1)
plt.plot(t, x, linewidth=3)
plt.subplot(2, 1, 2)
plt.plot(t, signal.detrend(x), linewidth=3)
plt.show()

結果の表示:
ここに画像の説明を挿入
上の図から、線形トレンドに対するディトレンドの効果が非常に優れていることがわかります。

多項式フィッティング原始関数

多項式を介して新しい曲線をフィッティングすることで、フィッティングされた曲線が元の画像にできるだけ近くなると同時に、画像内のノイズやベースラインなどの冗長な要素を除去することが容易に理解できます。 。

コードは次のようになります。

import os
import matplotlib.pyplot as plt
import scipy.signal
import numpy as np

def main():
    # 项目目录
    dir = "D:\\a_user_file\\8_data"
    filename = 's1_run.csv'
    path = os.path.join(dir, filename)
    with open(path, "r") as fname:
        data = fname.read()
        lines = data.split("\n")
        raw_data = []
        for i in range(len(lines)):
            line_i = lines[i].split(",")
            raw_data.append(int(line_i[4]))
    sig = raw_data
    tmp_smooth1 = scipy.signal.savgol_filter(sig, 53, 9)
    tmp_smooth2 = scipy.signal.savgol_filter(sig, 53, 3)
    plt.subplot(3,1,1)
    plt.plot(sig)
    plt.subplot(3,1,2)
    plt.plot(tmp_smooth1 * 0.5, label='mic'+ '拟合曲线-21', color='red')
    plt.subplot(3,1,3)
    plt.plot(tmp_smooth2 * 0.5, label='mic'+ '拟合曲线-53', color='green')
    plt.show()

main()

表示結果は以下の通りです。
ここに画像の説明を挿入

BEADS ベースライン処理

詳細については、https:
//ww2.mathworks.cn/matlabcentral/fileexchange/49974-beads-baseline-estimation-and-denoising-with-sparsity ?s_tid=AO_FX_info を参照してください。

ウェーブレットアルゴリズム

ウェーブレット アルゴリズムでは、ノイズを除去してベースラインを除去します。まず、フィルターを使用して元の信号を分解し、分解された高周波係数 D (詳細部分) と低周波係数 A (近似部分) をダウンサンプリングによって取得します。分解された低周波成分はさらに分解することができます。このプロセスはウェーブレット分解と呼ばれます。

分解の最下層から信号を再構築します。まず、通常は補間とゼロ補間の方法を使用してアップサンプリングします。つまり、元の信号と同じ長さになるようにデータ量を増やしてから、再構築されたハイパス フィルター g、およびローパス フィルター h、最後に元の信号を再構築します。コードが正しく記述されていれば、再構築された信号は元の信号とまったく同じになります。

ウェーブレット変換ノイズ除去処理は、分解された各層の係数からノイズが存在する層を見つけ、その層の低周波係数または高周波係数をソフト閾値処理およびハード閾値処理などの処理を行って再構成することです。処理後、つまりノイズが除去された信号を再構築できます。

import numpy as np
import matplotlib.pyplot as plt
import pywt
import os


def signal():
    # 项目目录
    dir = "D:\\a_user_file\\8_data"
    filename = '1.csv'
    path = os.path.join(dir, filename)
    with open(path, "r") as fname:
        data = fname.read()
        lines = data.split("\n")
        raw_data = []
        for i in range(len(lines)):
            line_i = lines[i].split(",")
            raw_data.append(int(line_i[0]))
    return raw_data

data = signal()
x = range(0, len(data))
w = pywt.Wavelet('db8') # 选用Daubechies8小波
maxlev = pywt.dwt_max_level(len(data), w.dec_len)
print("maximum level is " + str(maxlev))
threshold = 0.5 # Threshold for filtering
# Decompose into wavelet components, to the level selected:
coeffs = pywt.wavedec(data, 'db8', level=maxlev) # 将信号进行小波分解
for i in range(1, len(coeffs)):
    coeffs[i] = pywt.threshold(coeffs[i], threshold*max(coeffs[i])) # 将噪声滤波
datarec = pywt.waverec(coeffs, 'db8')

plt.subplot(2,1,1)
plt.plot(data, color="black", linewidth=2.0, linestyle="solid")
plt.subplot(2,1,2)
plt.plot(datarec, color="red", linewidth=2.0, linestyle="solid")
plt.show()

ウェーブレット変換によるノイズ除去の鍵は、対応するノイズとベースライン ドリフトが存在する周波数セグメントを見つけ、対応する周波数セグメントを除去して新しいノイズ除去されたベースライン信号を生成することです。

経験的モード分解 (EMD)

EMD 法では、あらゆる信号をいくつかの異なる固有モード関数と残留定常状態量に分解できると考えています。各固有モード関数は信号の局所特性を反映し、残差は信号の傾向または平均を反映します。EMD 法では、「スクリーニング」法を使用して、元の信号から残差を分離します。

参考

https://ww2.mathworks.cn/matlabcentral/fileexchange/49974-beads-baseline-estimation-and-denoising-with-sparsity?s_tid=AO_FX_info
https://blog.csdn.net/qq_41620350/article/details/115981740
https://blog.csdn.net/u010565765/article/details/69397415

おすすめ

転載: blog.csdn.net/ximu__l/article/details/128965333