如何使用numpy.fft获得正确的相位值

How to get correct phase values using numpy.fft(如何使用numpy.fft获得正确的相位值)
本文介绍了如何使用numpy.fft获得正确的相位值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

import numpy as np 
import matplotlib.pyplot as plt 

n = 500
T = 10
dw = 2 * np.pi / T

t = np.linspace(0, T, n)
x = 5 * np.sin(20 * t + np.pi)  + 10 * np.sin( 40 * t + np.pi/2)

fftx = np.fft.rfft(x)
freq = np.fft.rfftfreq(n) * n * dw

amps = np.abs(fftx) * 2 /  n
angs = np.angle(fftx) 


_, ax = plt.subplots(3, 1)
ax[0].plot(t, x)
ax[1].plot(freq, amps)
ax[2].plot(freq, angs)

我得到了正确的频率和幅值。但从曲线图上看,相位值是不正确的。如何从FFT中提取正确的相位值?我在相图中看到的到底是什么?

我预计频率20和40分别约为3.14和3.14/2。

推荐答案

计算阶段有两个问题:

  1. 您的输入信号不是整数个周期。如果你重复地复制信号,你会发现你实际上有一组与你在构造信号时假设的不同的频率成分(DFT可以想象为使用无限重复的信号作为输入)。这会导致峰值有一定的宽度,还会导致相位略有移动。

    您可以通过对信号设置窗口或创建信号以使其具有整数个周期来修复此问题。后者为:

    T = 3 * np.pi
    t = np.linspace(0, T, n, endpoint=False)
    
  2. 无信号的频率(以上修正后除两个频率外,其余均为),相位由噪声给出。您可以在此处将阶段设置为零:

    angs[amps < 1] = 0
    

现在您的曲线图如下所示:

相位与您预期的不同,因为正弦的相位为-&pi;/2。使用cos而不是sin重复实验,您会得到预期的相位。

这篇关于如何使用numpy.fft获得正确的相位值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Elementwise multiplication of several arrays in Python Numpy(几个数组在Python Numpy中的元素乘法)
Getting the last element of a level in a multiindex(获取多索引中某个级别的最后一个元素)
Create triangular mesh from vertex coordinates(从顶点坐标创建三角网格)
Python h5py - Why do I get a broadcast error?(Python h5py-为什么我收到广播错误?)
h5py: how to use keys() loop over HDF5 Groups and Datasets(H5py:如何在HDF5组和数据集上使用key()循环)
Why does h5py throw an error when adding 3 variable length strings to a dataset?(为什么h5py在向数据集中添加3个可变长度的字符串时会抛出错误?)