【发布时间】:2016-07-01 08:11:10
【问题描述】:
我正在尝试使用快速傅立叶变换来提取单个正弦函数的相移。我知道在纸面上,如果我们将函数的变换表示为 T,那么我们有以下关系:
但是,我发现虽然我能够准确地捕获余弦波的频率,但除非我以极高的速率进行采样,否则相位是不准确的。例如:
import numpy as np
import pylab as pl
num_t = 100000
t = np.linspace(0,1,num_t)
dt = 1.0/num_t
w = 2.0*np.pi*30.0
phase = np.pi/2.0
amp = np.fft.rfft(np.cos(w*t+phase))
freqs = np.fft.rfftfreq(t.shape[-1],dt)
print (np.arctan2(amp.imag,amp.real))[30]
pl.subplot(211)
pl.plot(freqs[:60],np.sqrt(amp.real**2+amp.imag**2)[:60])
pl.subplot(212)
pl.plot(freqs[:60],(np.arctan2(amp.imag,amp.real))[:60])
pl.show()
使用 num=100000 点,我得到的相位为 1.57173880459。
使用 num=10000 点,我得到的相位为 1.58022110476。
使用 num=1000 点,我得到的相位为 1.6650441064。
怎么了?即使有 1000 分,我每个周期也有 33 分,这应该足以解决它。有没有办法增加计算频率点的数量?有没有办法用“低”点数做到这一点?
编辑:从进一步的实验来看,我似乎每个周期需要约 1000 个点才能准确地提取相位。为什么?!
编辑 2:进一步的实验表明,准确性与每个周期的点数有关,而不是与绝对数有关。增加每个周期的采样点数会使相位更准确,但如果信号频率和采样点数都增加相同的倍数,则精度保持不变。
【问题讨论】:
-
如果增加点数会怎样? 1,000,000?一千万?相位是否逐渐接近 pi/2?
-
我不是专家,但是随着采样率的降低,FFT 频率和相位结果中的噪声(不可避免地)会增加。较低的采样率 - 这表现为频率分量幅度和偏移的扩散在主成分阶段。随着其他分量的增加,您还会看到结果中的主频率幅度减小。
-
是的,随着点数的增加,相位会变得任意准确。我应该补充一点,似乎重要的不是绝对的点数,而是每周期的点数使它更准确。以 1kHz 采样 30Hz 信号 10 秒与以 1kHz 采样 1 秒的精度相同,但以 1kHz 采样 3Hz 波 1 秒与以 10kHz 采样 30Hz 波 1 秒的精度相同。
-
当你添加量化时会发生什么,例如样本中有 8 位还是 12 位?
-
我不确定我是否理解。量化...位是什么意思?