数字信号处理(一)
时频域信号转换与时域滤波
现在有这样一个项目需求:在传感器端只能获取到时域信号相关振动数据(速度、加速度等),要针对振动信号进行故障分析,而要实现它,第一步就是要实现时频域信号间的互相转换,并叠加时域滤波。
FFT快速傅里叶变换
了解FFT相关基础可以参考以下知乎大佬的文章:
要实现时频域信号间的高效转换,就要用到FFT快速傅里叶变换,通过python的第三方scipy库中的fft函数就能快速实现需求。
scipy中有两个模块scipy.fft和scipy.fftpack都可以实现FFT,这两个模块非常相似,但scipy.fft模块较新,应优先于scipy.fftpack使用。
import numpy as np
import matplotlib.pyplot as plt
from scipy import fft, signal
时域图像展示
利用with open() as f方法导入时域信号数据后,可以利用以下代码展示时域图像:
def timeWave(SAMPLE_RATE, DURATION, Slist):
# 计算采样的点数
N = int(SAMPLE_RATE * DURATION)
t = np.linspace(0, DURATION, N, endpoint=False)
plt.plot(t, Slist)
plt.xlabel('时间(s)')
plt.ylabel('振动幅值')
plt.title('时域波形图')
plt.show()
其中涉及到一个公式采样点数=采样频率*采样时间
这是我生成的图像:
转化为频域信号
通过scipy.fft转化为频域信号
# 对数组数据进行傅里叶变换
yf = fft.fft(Slist)
# 计算频率的中心,用来绘制x轴的数值
xf = fft.fftfreq(N, 1 / SAMPLE_RATE)
yf = np.abs(yf)
# 归一化
yf1 = yf / len(yf)
时域滤波
利用巴特沃斯滤波器进行时域滤波
def butter_filter(s1, s2, SAMPLE_RATE, Slist):
# 构造巴特沃斯滤波器
# 我们假设采样频率为12800hz,信号本身最大的频率为6400hz,要滤除100hz以上频率成分,即截至频率为100hz,则wn=2*100/12800=0.2
s1 = 4 * s1 / SAMPLE_RATE
s2 = 4 * s2 / SAMPLE_RATE
b, a = butter(N = 7, Wn = [s1, s2], btype = 'bandpass') # 带通滤波:配置滤波器N表示滤波器的阶数
# 使用滤波函数进行滤波操作
filtedData = signal.filtfilt(b, a, Slist) # 要过滤的信号
return filtedData