利用python的强大函数库,实现波形的小波降噪、带通滤波、时阈分析、FFT波形转换

import math
import matplotlib.pyplot as plt
import pywt
import pandas as pd
import numpy as np
import scipy as signal


def WaveletDeNoising(path):
    xy = pd.read_csv(path, sep=', ')  # 读取CSV文件
    s = []
    for each in list(xy):
        s.append(float(each))
    # 将需要的数据保存在列表s中
    w = pywt.wavedec(s, 'sym7', level=6)  # 小波分解,pywt.wavedec(数据, 小波基, 分解尺度)
    # 分解得到的w是一个列表,w[0]是最大尺度的近似系数,w[1]是最大尺度的细节系数,w[2]是次大尺度的细节系数,以此类推
    n = len(s)
    thr = round(np.sqrt(2 * np.log(n)), 4)  # 阈值获取,方式为sqtwolog
    for i in range(1, len(w)):
        w[i] = pywt.threshold(w[i], thr, mode='soft')
        # 阈值处理函数
    rec_s = pywt.waverec(w, 'sym7')  # 小波重构
    plt.subplot(211)
    plt.plot(s, linewidth=0.5)
    plt.subplot(212)
    plt.plot(rec_s, linewidth=0.5)
    plt.show()
    print(f'Hi, process success!')


def WaveFiltering(path):
    xy = pd.read_csv(path, sep=', ')  # 读取CSV文件
    s = []
    for each in list(xy):
        s.append(float(each))
    b, a = signal.butter(8, [0.01, 0.4], 'bandpass')  # 配置滤波器 8 表示滤波器的阶数
    rec_s = signal.filtfilt(b, a, s)  # data为要过滤的信号
    plt.subplot(211)
    plt.plot(s, linewidth=0.5)
    plt.subplot(212)
    plt.plot(rec_s, linewidth=0.5)
    plt.show()
    print(f'Hi, process success!')


def TimeThresholdAnalysis(path):
    xy = pd.read_csv(path, sep=', ')  # 读取CSV文件
    s = []
    for each in list(xy):
        s.append(float(each))
    df_mean = np.mean(s)   # 均值
    df_var = np.var(s)    # 方差
    df_std = np.std(s)    # 标准差
    df_max = np.max(s)    # 最大值
    df_rms = np.sqrt(pow(df_mean, 2) + pow(df_std, 2))    # 均方根
    df_skew = pd.Series(s).skew()    # 偏度
    df_kurt = pd.Series(s).kurt()    # 峭度
    df_boxing = df_rms / np.abs(s).mean()    # 波形因子
    df_fengzhi = np.max(s) / df_rms    # 峰值因子
    df_maichong = np.max(s) / np.abs(s).mean()    # 脉冲因子
    sum_size = 0
    for i in range(2000):
        sum_size += math.sqrt(abs(s[i]))
    df_yudu = (np.max(s)) / pow((sum_size / 2000), 2)    # 裕度因子
    print(f'峰值因子:%f' % df_fengzhi)
    print(f'波形因子:%f' % df_boxing)
    print(f'脉冲因子:%f' % df_maichong)
    print(f'峭度:%f' % df_kurt)
    print(f'裕度因子:%f' % df_yudu)
    print(f'最大值:%f' % df_max)
    print(f'均值:%f' % df_mean)
    print(f'均方根:%f' % df_rms)
    print(f'偏度:%f' % df_skew)
    print(f'标准差:%f' % df_std)
    print(f'Hi, process success!')

def FFTConversion(path):
    xy = pd.read_csv(path, sep=', ')  # 读取CSV文件
    s = []
    for each in list(xy):
        s.append(float(each))
    data_freq = np.fft.fft(s)
    m_data = np.abs(data_freq)    # magnitude
    # p_data = np.angle(data_freq)  # phase
    plt.subplot(2, 1, 1)
    plt.plot(m_data, linewidth=0.5)
    # plt.subplot(2, 2, 2)
    # plt.plot(p_data, linewidth=0.5)
    plt.show()
    

if __name__ == '__main__':
    WaveletDeNoising('F:/xxxx.txt')           # 小波降噪
    WaveFiltering('F:/xxxx.txt')              # 带通滤波
    TimeThresholdAnalysis('F:/xxxx.txt')      # 时阈分析
    FFTConversion('F:/xxxx.txt')              # FFT波形转换

版权声明:本文为yhj_911原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。