上一章讲到了如何利用python把时域信号变成频域信号,那么如果要看时频图该怎么办呢?
这里还是以实际应用作为例子,下面让我们来看看如何实现。

采用的是从PAK采集系统收集到的原始振动数据,为在涡轮增压器上面的加速度传感器信号,
导出成txt文件格式,然后利用python进行FFT变换。

首先用pandas导入原始文件

'''Fourtran'''
'''Author:jAEgerrr'''
'''2020-03-06'''
import matplotlib.pyplot as plt
from scipy import signal
import numpy as np
import pandas as pd
from matplotlib import cm

data=pd.read_table('./vibdata.txt',header=None,index_col=0,names=['time','acc'])
1/(data.index[1]-data.index[0])
acc=data['acc']
data.plot()

这里读取原始数据data有两列,左边索引列为时间序列,右边为采集的信号,即加速度。
data
通过区分时间间隔,1/(data.index[1]-data.index[0]),得出信号的采样频率为48000Hz
sampling rate
这里先对原始数据进行plot,得到的时间序列图像如下:
accelrometer
我们看到是一个随时间增加而振幅不断变大的信号,但看不出具体特征,参考意义不大。
接下来要对这个信号进行FFT变换。

rate=48000
Block_size=8192
freqs, times, Sxx = signal.spectrogram(acc, fs=rate, window='hanning',
                                      nperseg=Block_size, noverlap=0.5*Block_size,
                                      detrend=False, scaling='spectrum')
plt.figure()
plt.pcolormesh(times, freqs, 20 * np.log10(Sxx/1e-06), cmap='inferno')
plt.clim(70,150)
plt.ylim(0,3000)
plt.colorbar()
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [s]');

这里用的是scipy模块中的signal函数直接进行FFT变换,它里面有几个参数,解释如下:
这里将acc,fs传入函数,acc就是文件里的振动数据。
rate就是采样频率,通过上面的计算得知采样频率为48000Hz。
hanning就是选择对数据加汉宁窗。
Block_size为区块大小,即在时域上每采样8192个点就算作一个区块,然后对这个区块进行FFT变换。之后再采样下个区块,然后再进行FFT变换。
noverlap是重叠。举个列子,第一个区块是时间序列从0到采集8191个点后进行FFT变换的,然后开始计算第二个区块,这个第二个区块和第一个区块有50%的重叠,即是从第4095个点开始采集,再数8192个点后进行FFT变换。这样做的好处是可以对时域上采集的数据不断进行平均,得出的时频变换结果准确性会更高。

变换后的时频图效果如下:
FFT
图中有一条一开始随着时间上升而频率不断升高的曲线,这个是涡轮增压器的同步噪声频谱图像。
从时域的原始数据上看不出任何特征,而换作频谱分析却有很好的效果,这个就是利用FFT进行分析的意义。

瀑布图的代码和显示效果如下:

X=times
Y=freqs
Z=20*np.log10(Sxx/1e-06)
X,Y=np.meshgrid(X,Y)
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap=cm.plasma,
                       linewidth=0, antialiased=False)
ax.set_zlim(60, 170)
ax.set_xlabel('time')
ax.set_ylabel('freq')
ax.set_zlabel('db')
fig.colorbar(surf, shrink=0.5, aspect=20,)

waterfall

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐