比较频谱分辨率、初始相位对FFT相位差计算结果的影响

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,计算相位差结果较好,但是提高分辨率的同时要注意采样点数的增加也会产生影响。并且全波计算获取得到的相位差结果好于半波计算结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值