Python 后续:从FFT中提取相位信息-正确使用频移和窗口

Python 后续:从FFT中提取相位信息-正确使用频移和窗口,python,numpy,fft,Python,Numpy,Fft,这是我根据@hotpaw2给出答案后的聊天提出的后续问题。我有一个信号,它是一个单余弦波,有一个相位偏移。我的任务是提取(需要非常高的精度)这个单一频率分量的振幅和相位 在纸上,假设适当归一化的傅里叶变换T,以下关系成立: 毫不奇怪,DFT比简单地进行变换并提取相关组件要复杂得多。特别是,讨论向我提出,我不完全清楚测量相位偏移的内容,如果数据窗口设置不当,会产生严重的边缘效应,从而破坏结果的准确性 我一直在谷歌上搜索,但大部分讨论都是相当技术性的,并且都是关于示例的,所以我希望有人能对一些事情

这是我根据@hotpaw2给出答案后的聊天提出的后续问题。我有一个信号,它是一个单余弦波,有一个相位偏移。我的任务是提取(需要非常高的精度)这个单一频率分量的振幅和相位

在纸上,假设适当归一化的傅里叶变换T,以下关系成立:

毫不奇怪,DFT比简单地进行变换并提取相关组件要复杂得多。特别是,讨论向我提出,我不完全清楚测量相位偏移的内容,如果数据窗口设置不当,会产生严重的边缘效应,从而破坏结果的准确性

我一直在谷歌上搜索,但大部分讨论都是相当技术性的,并且都是关于示例的,所以我希望有人能对一些事情有所帮助。特别是,我遇到了一个例子,它建议我不做简单的转换,而应该先移动它:

import numpy as np
import pylab as pl



f = 30.0
w = 2.0*np.pi*f
phase = np.pi/2
num_t = 10*f
t, dt = np.linspace(0, 1, num_t, endpoint=False, retstep=True)

signal = np.cos(w*t+phase)#+np.random.normal(0,0.25,len(t))

amp = np.fft.fftshift(np.fft.rfft(np.fft.ifftshift(signal)))
freqs = np.fft.fftshift(np.fft.rfftfreq(t.shape[-1],dt))

index = np.where(freqs==30)
print index[0][0]
print(np.angle(amp))[index[0][0]]
print (np.abs(amp))[index[0][0]]*(2.0/len(t))

pl.subplot(211)
pl.semilogy(freqs,np.abs(amp))
pl.subplot(212)
pl.plot(freqs,(np.angle(amp)))
pl.show()
那么:第一组问题:有人能解释一下使用fftshift的意义吗?它到底对数据做了什么?为什么使用逆移位、变换和再移位需要一个频率分量集,该频率分量集只移位一次,没有逆操作?这种方法是否正确(暂时忽略窗口问题)

第二组问题:如果我打开数据窗口,可能会影响结果的振幅和相位(?)。是否有一种分析方法来校正给定窗口形状的振幅变化?我可以找到一些列出修正系数的表格,但我还没有看到一个好的解释

在相关问题中,有人指出相位应在窗口功能的驼峰中心附近测量。但是因为窗函数是一个时域函数,我想要一个特定频率的相位,我不太明白这意味着什么


如果您能对这件事有所了解(可能是以参考资料的形式,因为我显然需要更多阅读),我们将不胜感激。

这个问题可能更适合dsp.stackexchange.com,因为它更多地是关于信号处理理论,而不是关于python(或matlab)编码。您可能是对的。什么是适当的礼仪?因此,我删除了这一个,并在DSP或cross post中发布,并保持这一个完整?这个问题可能更适合DSP.stackexchange.com,因为它更多地涉及信号处理理论,而不是python(或matlab)编码。你可能是对的。什么是适当的礼仪?所以我删除了这一个,并在DSP中发布,或者交叉发布,并保持这一个完整?