由于硬件采样电路限制,只能采集得到正弦电压的上半轴波形,本程序致力于基于已有半波还原负半轴波形。
import matplotlib.pyplot as plt
import numpy as np
import xlrd #读取excel库
# 打开采样数据文件
file_name = r'C:\Users\Chaver\Desktop\task\sampled.xlsx'
wb = xlrd.open_workbook(file_name)
# 根据 sheet 名称获取内容
sh1 = wb.sheet_by_name('3V-R-65Hz-data3')
# 读取采集A、B、C 线电压值 (A:Uab,B:Ubc,C:Uca )
phase_A=sh1.col_values(2,1,257) # A相电压
## 上零点
up=[]
for x in range(2,len(phase_A)-1):
if phase_A[x-2]<50 and phase_A[x-1]<50 and phase_A[x]<50 and phase_A[x+1]-phase_A[x]>50:
up.append(x)
print('上零点坐标为:',up)
## 下零点
dw=[]
for x in range(1,len(phase_A)-2):
if phase_A[x+2]<50 and phase_A[x+1]<50 and phase_A[x]<50 and phase_A[x]-phase_A[x-1]<-40:
dw.append(x)
print('下零点坐标为:',dw)
# 准备平移数据,大于50保持,小于50至零
data_1 = phase_A
for x in range(len(data_1)):
if data_1[x] < 50:
data_1[x] = 0
# # case1 第一个是上零点,全部右移半波
if up[0]<dw[0]:
half_length=dw[0]-up[0]
# 生成新列表data_2用来存放平移反转后的列表data_1
data_2=[0]*dw[0]+[None]*(len(data_1)-dw[0])
for x in range(dw[0],len(data_1)):
data_2[x]=data_1[x-half_length]
data_2[x]=-data_2[x]
plt.figure()
plt.subplot(4,1,1)
plt.plot(data_1,color = 'r')
plt.subplot(4,1,2)
plt.plot(data_2,color = 'b')
# 上零点左侧曲线复原,data_3
data_3=[0]*up[0]
for x in range(up[0],2*up[0]):
data_3[x-up[0]]=-data_1[x]
# 将元素逆序呈现
data_3=data_3[::-1]
# 补齐列表长度,添加零元素
data_3=data_3+[0]*(len(data_1)-len(data_3))
plt.subplot(4,1,3)
plt.plot(data_3,color = 'b')
# 合并data_1与data_2
sum_1=np.add(data_1,data_2)
phase_A=np.add(sum_1,data_3)
plt.subplot(4,1,4)
plt.plot(phase_A,color = 'b')
plt.show()
# case2 第一个是下零点,全部右移半波
else:
half_length=up[0]-dw[0]
# 准备平移数据,大于50保持,小于50至零
data_1 = phase_A
for x in range(len(data_1)):
if data_1[x] < 50:
data_1[x] = 0
plt.figure()
plt.subplot(5, 1, 1)
plt.plot(data_1, color='r')
# 生成新列表data_2用来存放平移反转后的列表data_1
data_2=[0]*dw[1]+[None]*(len(data_1)-dw[1])
for x in range(dw[1],len(data_1)):
data_2[x]=data_1[x-half_length]
data_2[x]=-data_2[x]
plt.subplot(5, 1, 2)
plt.plot(data_2)
# 合并data_1和data_2,不知为什么一定要放在data_3的for循环前?
sum_data_1_2=np.add(data_1,data_2)
# 获取完整的第一个半波
def zero(D,up,dw):
for x in range(len(D)):
if x < up or x > dw:
D[x] = 0
return D
data_3=zero(data_1,up[0],dw[1])
plt.subplot(5, 1, 3)
plt.plot(data_3)
# 将第一个半波向左平移half_length反转,得到data_4
data_4=[0]*dw[0]+[0]*(len(data_3)-dw[0])
for x in range(dw[0],up[0]):
data_4[x]=data_3[x+half_length]
data_4[x]=-data_4[x]
print(len(data_4))
plt.subplot(5, 1, 4)
plt.plot(data_4)
# 合并data_1与data_2,data_4
phase_A=np.add(sum_data_1_2,data_4)
plt.subplot(5,1,5)
plt.plot(phase_A)
plt.show()
输出波形结果: