需求
振动台会产生速度信号,在已知信号的采样频率和速度信号串数据进行位移仿真
技术
采用Python的算法库进行编写,前端使用的是JS,后端采用Java接口进行调用,主要的计算内容采用Python进行计算
对照
为了判定Python算法的准确性,采用Matlab的专业信号处理工具和算法进行对照,通过误差计算判断算法的效率和优劣程度
Python的算法
- 此处使用导入TXT文件的数据进行模拟,TXT文件采用真实的数据,并且定义信号的采样频率
n = len(data)
# 过滤直流分量---------------------------------
# -------------------------------------------
# 时间变量
L = np.arange(n)
t = L / f_s
# 创建新位移数组
s_displacement = np.zeros(n)
此处的t_V是给出的速度信号,产生的幅度谱
- 将频率的频率轴定义出来
# 计算频率轴
f = np.arange(n) * f_s / n
- 计算速度的频谱
fft_data = np.fft.fft(data)
- 计算速度幅度谱(转化实际的纵坐标)---------------计算速度幅度,相位(b_powerSpectrum:未被归一化幅度)
amplitude = np.abs(fft_data / (n / 2))
- 计算幅度谱的主频率的最大值
[powerSpectrum_max, max_index] = max(b_powerSpectrum(1:n/2));
- 计算符合条件的数据,value表示数据,index表示下标,遍历计算数据的极值(极大值),返回极大值数据和极大值下标
#极大值数据
extremes = []
index = []
for i in range(1, len(power)//2):
if power[i] > power[i - 1] and power[i] > power[i + 1] and power[i] >= threshold:
extremes.append(power[i])
index.append(i)
# 速度的幅度值
v_amplitude = amplitude[index]
- 速度的频率
v_freq = f[index]
- 计算主频率的速度相位数据
FFTang = np.angle(fft_data)
v_w0 = FFTang[index]
- 位移初始值计算
signalNum = len(v_amplitude)
s_bn = np.zeros(signalNum)
s_w0 = np.zeros(signalNum)
for j in range(signalNum):
s_bn[j] = v_amplitude[j] / (2 * f_s * np.sin(np.pi * v_freq[j] / f_s))
s_w0[j] = v_w0[j] - (0.5 - v_freq[j] / f_s) * np.pi
s_data0 = 0
for k in range(signalNum):
s_data0 += s_bn[k] * np.cos(s_w0[k])
s_displacement[0] = s_data0
- 计算位移信号
for i in range(1, n):
s_displacement[i] = s_displacement[i - 1] + ((data[i] + data[i - 1]) / 2) * (1 / f_s)
# 2次过滤直流分量
s_displacement = dcPassTool(s_displacement, f_s, freq_cutoff)