基于Python将任意频率的半波正弦还原为整波

由于硬件采样电路限制,只能采集得到正弦电压的上半轴波形,本程序致力于基于已有半波还原负半轴波形。

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()

输出波形结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值