Python 信号分析——带通滤波
在对信号进行特征提取前,我们不仅需要考虑实际信号中的噪声,还需要考虑我们关注的信号频率特征范围。如果我们直接对原始信号采用特征提取操作,那么提取到的特征在多数情况下是不符合使用要求的。工程软件中一般会有内置好的滤波功能,我们只需要掌握应用方法即可。若自己开发程序来对信号进行滤波处理时,应关注滤波器函数中参数的设置,即使参数之间差值不大,但导致的结果会大不相同,至于参数设计的方法本文不做赘述,可参看
前言
在对信号进行特征提取前,我们不仅需要考虑实际信号中的噪声,还需要考虑我们关注的信号频率特征范围。如果我们直接对原始信号采用特征提取操作,那么提取到的特征在多数情况下是不符合使用要求的。
一、信号滤波方式
信号滤波的数学原理是将原始信号同滤波函数进行卷积操作,以保留期望频率范围。滤波种类分为低通滤波、高通滤波、带通滤波,带阻滤波。滤波器的函数常见的为巴特沃夫、切比雪夫、三角函数等。
在实际中,巴特沃夫带通滤波应用情况较多,因此程序主要利用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:欢迎各位交流,后续有啥想实现的信号处理功能,请在下方评论区留言,或者关注公众号:不说话上代码
更多推荐
所有评论(0)