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

时间:2016-03-16 17:17:32

标签: python numpy fft

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

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

enter image description here

不出所料,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的重点,以及它对数据做了什么?为什么使用反移,变换然后移位需要一个仅移位一次的频率分量集,没有反向运算?这种方法是正确的(暂时忽略窗口的问题)。

第二组问题:如果我对数据进行窗口检测,可能会影响结果的幅度和相位(?)。是否有分析方法来校正给定窗口形状的幅度变化?我可以找到一些列出校正因子的表格,但我还没有真正看到一个很好的解释。

在链接的问题中,有人说应该在窗函数的驼峰中心附近测量相位。但由于窗口函数是一个时域函数,我想要一个特定频率的阶段,我不太明白这意味着什么。

任何可以解决问题的事情(可能以参考的形式,因为显然我需要做更多的阅读)将是非常感激。

0 个答案:

没有答案