前言

在对信号进行特征提取前,我们不仅需要考虑实际信号中的噪声,还需要考虑我们关注的信号频率特征范围。如果我们直接对原始信号采用特征提取操作,那么提取到的特征在多数情况下是不符合使用要求的。


一、信号滤波方式

信号滤波的数学原理是将原始信号同滤波函数进行卷积操作,以保留期望频率范围。滤波种类分为低通滤波、高通滤波、带通滤波,带阻滤波。滤波器的函数常见的为巴特沃夫、切比雪夫、三角函数等。
在实际中,巴特沃夫带通滤波应用情况较多,因此程序主要利用python实现巴特沃夫带通滤波。

二、使用步骤

1.主要代码

代码如下(示例):

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

def s_add_wn(x:float,snr:float):
    Ps = np.sum(abs(x) ** 2) / len(x)
    Pn = Ps / (10 ** ((snr / 10)))
    noise = np.random.randn(len(x)) * np.sqrt(Pn)
    signal_add_noise = x + noise
    return signal_add_noise

def filter_bp(x,fs,wl,wh):
    fN = 3
    fc = fs/2
    w1c = wl/fc
    w2c = wh/fc
    b, a = signal.butter(fN,[w1c, w2c],'bandpass')
    x_filter = signal.filtfilt(b,a,x)
    return x_filter

2.示例Demo

代码如下(示例):

# !/usr/bin/python3
# -*- coding: utf-8 -*-

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

def s_add_wn(x:float,snr:float):
    Ps = np.sum(abs(x) ** 2) / len(x)
    Pn = Ps / (10 ** ((snr / 10)))
    noise = np.random.randn(len(x)) * np.sqrt(Pn)
    signal_add_noise = x + noise
    return signal_add_noise

def filter_bp(x,fs,wl,wh):
    fN = 3
    fc = fs/2
    w1c = wl/fc
    w2c = wh/fc
    b, a = signal.butter(fN,[w1c, w2c],'bandpass')
    x_filter = signal.filtfilt(b,a,x)
    return x_filter

if __name__ == '__main__':
    w = 5
    z = 30
    fs = 1024
    fsw = 5
    time = 10
    f = w * z
    t = np.linspace(0, time - 1 / fs, int(time * fs))
    x = (1 + 1 * np.sin(2 * np.pi * 20 * t)) * np.sin(2 * np.pi * f * t)
    snr = 1
    xn = s_add_wn(x, snr)
    plt.figure(1)
    plt.plot(t, xn)
    plt.xlabel('time')
    plt.ylabel('Amplitude')
    xf = filter_bp(xn, fs, 100, 200)
    plt.figure(2)
    plt.plot(t, xf)
    plt.xlabel('time')
    plt.ylabel('Amplitude')
    plt.show()

总结

工程软件中一般会有内置好的滤波功能,我们只需要掌握应用方法即可。若自己开发程序来对信号进行滤波处理时,应关注滤波器函数中参数的设置,即使参数之间差值不大,但导致的结果会大不相同,至于参数设计的方法本文不做赘述,可参看相应的技术文档。
信号除了时域滤波方法,还延伸出频域滤波,频域滤波的步骤分为三步:1、信号傅里叶变化;2、频谱与滤波函数点乘;3、滤波后的信号反傅里叶变换。但个人认为,最直接的方法是将特征频率外的频谱值直接设置为0,然后再进行反傅里叶变换,对应的代码可留言获得。
PS:欢迎各位交流,后续有啥想实现的信号处理功能,请在下方评论区留言,或者关注公众号:不说话上代码

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐