import xlwt
import numpy as np
from scipy.fftpack import fft, ifft # FFT库
定义两相电压相位差计算函数“angle_error”
# 获取相位差
def angle_error(phase_A, phase_B):
# 加窗 Hanning
phase_A_window = np.hanning(len(phase_A)) * phase_A
phase_B_window = np.hanning(len(phase_B)) * phase_B
# fft计算
F_phase_A = fft(phase_A_window)
F_phase_B = fft(phase_B_window)
# 角度计算
angle_A = np.angle(F_phase_A, deg=True)
angle_B = np.angle(F_phase_B, deg=True)
# 相位差
Delta_BA = np.subtract(angle_B, angle_A)
Delta_BA = [x + 360 if x < -180 else 360 - x if x > 180 else x for x in Delta_BA]
return Delta_BA
利用“xlwt”创建工作表
# 创建一个工作表
workbook = xlwt.Workbook(encoding='utf-8')
根据频率分辨率“delta_f”创建sheet
# 按名称创建sheet
sheet_names = ["delta_f_5Hz", "delta_f_10Hz", "delta_f_25Hz"]
for name in sheet_names:
sheet = workbook.add_sheet(name)
利用“workbook.get_sheet()”获取各个sheet索引,依次按照sheet索引写入内容
# 为每个sheet写入内容
for sheet_name in sheet_names:
sheet = workbook.get_sheet(sheet_names.index(sheet_name))
# 频谱分辨率
delta_f = [5, 10, 25]
# 初始相位
theta = np.linspace(0, 2 * np.pi, 10)
# 频率刻度
f_axis = np.linspace(1, 10, 10)
# 写入表头
sheet.write(0, 0, "initial phase")
sheet.write(1, 0, "f_axis")
# 写入初始相位刻度
for i, col_name in enumerate(theta):
sheet.write(0, i + 1, col_name)
# 写入频率刻度
for p, z in enumerate(f_axis, start=2):
sheet.write(p, 0, z * delta_f[sheet_names.index(sheet_name)])
# 写入计算获得相位值
# 设定波形频率45Hz
f = 45
x = np.linspace(0, 1 / delta_f[sheet_names.index(sheet_name)], 256)
for j in range(len(theta)):
y_1 = np.sin(2 * np.pi * f * x + theta[j])
y_2 = np.sin(2 * np.pi * f * x + theta[j] + np.pi / 3)
# 转换为半波
# y_1 = [0 if x < 0 else x for x in y_1]
# y_2 = [0 if x < 0 else x for x in y_2]
delta = angle_error(y_1, y_2)
delta = delta[1:11]
# 写入相位差
for k, value in enumerate(delta, start=2):
sheet.write(k, j + 1, value)
# 保存工作表
workbook.save('C:/Users/Chaver/Desktop/task/delta_whole_wave.xls')
输出结果:
经比较发现,频谱分辨率越高,delta_f=5Hz,计算相位差结果较好,但是提高分辨率的同时要注意采样点数的增加也会产生影响。并且全波计算获取得到的相位差结果好于半波计算结果。