Múltiples métodos para rebajar

La función de tendencia elimina la línea de base.

La función de tendencia solo se puede usar para eliminar tendencias lineales y no puede hacer nada por las no lineales.

Expresión de la función: y = scipy.signal.detrend(x): elimina una tendencia lineal de una señal:

x: señal con interferencia de línea base y: señal después de eliminar la interferencia de línea base.

El código de referencia de detrend go muestra:

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()

Visualización de resultados:
inserte la descripción de la imagen aquí
De la figura anterior, podemos ver que el efecto de la tendencia a la tendencia lineal es muy bueno.

función primitiva de ajuste polinomial

Es fácil entender que se trata de ajustar una nueva curva a través de polinomios, para que la curva ajustada sea lo más cercana posible a la imagen original y, al mismo tiempo, puede eliminar factores redundantes como el ruido y la línea base en la imagen. .

El código aparece como:

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()

Los resultados de la pantalla son los siguientes:
inserte la descripción de la imagen aquí

Procesamiento de línea de base BEADS

Para obtener más información, consulte:
https://ww2.mathworks.cn/matlabcentral/fileexchange/49974-beads-baseline-estimation-and-denoising-with-sparsity?s_tid=AO_FX_info

algoritmo wavelet

El algoritmo wavelet elimina el ruido y elimina la línea de base. Primero, el filtro se usa para descomponer la señal original, y el coeficiente D de alta frecuencia descompuesto (parte detallada) y el coeficiente A de baja frecuencia (parte aproximada) se obtienen a través del muestreo descendente. Los componentes de baja frecuencia descompuestos pueden descomponerse aún más. Este proceso se llama descomposición wavelet.

Reconstruir la señal desde la capa inferior de la descomposición, en primer lugar, sobremuestreando, generalmente utilizando el método de interpolación e interpolación cero, es decir, aumentando la cantidad de datos para lograr la misma longitud que la señal original, y luego pasando por el filtro de paso alto reconstruido g y filtro de paso bajo h, finalmente reconstruyen la señal original, si el código está escrito correctamente, entonces la señal reconstruida es exactamente la misma que la señal original.

El proceso de eliminación de ruido de la transformada de wavelet consiste en encontrar la capa donde se encuentra el ruido en los coeficientes descompuestos de cada capa, y procesar los coeficientes de baja frecuencia o los coeficientes de alta frecuencia de la capa, como el procesamiento de umbral suave y duro, y luego reconstruir después del procesamiento, es decir, se puede reconstruir una señal sin ruido.

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()

La clave para eliminar el ruido con la transformada wavelet es encontrar el segmento de frecuencia donde se encuentran el ruido correspondiente y la desviación de la línea de base, y eliminar el segmento de frecuencia correspondiente para generar una nueva señal de línea de base sin ruido.

Descomposición de modo empírico (EMD)

El método EMD considera que cualquier señal se puede descomponer en varias funciones de modo intrínseco diferentes y una cantidad de estado estable residual. Cada función de modo propio refleja las características locales de la señal y el residual refleja la tendencia o la media de la señal. El método EMD utiliza un método de "detección" para separar el residuo de la señal original.

referencia

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

Supongo que te gusta

Origin blog.csdn.net/ximu__l/article/details/128965333
Recomendado
Clasificación