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

如何使用numpy.fft获得正确的相位值,numpy,fft,Numpy,Fft,我得到了正确的频率和振幅值。但从图中可以看出,相位值不正确。如何从fft中提取相位的正确值?我在相位图中到底看到了什么 我预计频率20和40分别约为3.14和3.14/2 计算阶段有两个问题: 您的输入信号不是整数个周期。如果你重复复制信号,你会发现你实际上有一组不同于你在构建信号时所假设的频率成分(DFT可以被认为是使用无限重复的信号作为输入)。这会使峰值有一定的宽度,也会使相位稍微偏移 您可以通过打开信号窗口或创建信号使其具有整数个周期来解决此问题。后者是: import numpy as

我得到了正确的频率和振幅值。但从图中可以看出,相位值不正确。如何从fft中提取相位的正确值?我在相位图中到底看到了什么


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

计算阶段有两个问题:

  • 您的输入信号不是整数个周期。如果你重复复制信号,你会发现你实际上有一组不同于你在构建信号时所假设的频率成分(DFT可以被认为是使用无限重复的信号作为输入)。这会使峰值有一定的宽度,也会使相位稍微偏移

    您可以通过打开信号窗口或创建信号使其具有整数个周期来解决此问题。后者是:

    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)
    
  • 没有信号的频率(在上述固定之后,除两个频率外,所有频率都是信号),相位将由噪声给出。您可以在此处将相位设置为零:

    T = 3 * np.pi
    t = np.linspace(0, T, n, endpoint=False)
    
    angs[amp<1]=0
    
  • 现在,您的绘图如下所示:


    相位与您预期的不同,因为正弦的相位为-π/2。用
    cos
    而不是
    sin
    重复这个实验,你就会得到你所期望的阶段。

    酷。成功了。><代码>整数周期数如果我不知道我在分析什么信号,如何获得该值?我是否只需添加
    dt=ceil(T/pi)*pi-T来创建新的
    T
    ?或者在这种情况下,窗口是我唯一的选择?(我不知道什么是加窗)。@Pratik:是的,如果你的信号不是合成的,那么唯一合适的方法就是加窗。网上有很多关于它的信息。简而言之,在FFTing之前,只需将信号与Hann窗口相乘。明白了!谢谢@Pratik:。@Pratik:如果我理解正确的话,你把信号长度设为π的倍数。但是如果你不知道信号周期是什么,你就不能这么做。还有:如果信号周期不是采样周期的倍数怎么办?在现实信号中,你不能选择一个窗口长度来实现完美的FFT。开窗是去那里的方法。
    angs[amps < 1] = 0