如何从Numpy中的傅里叶变换恢复振幅和相移?

如何从Numpy中的傅里叶变换恢复振幅和相移?,numpy,fft,amplitude,Numpy,Fft,Amplitude,我正试图编写一个简单的python脚本,从傅立叶变换中恢复正弦波的振幅和相位 我应该能够通过计算给定频率下傅里叶变换的实数和虚数定义的向量的大小和方向来实现这一点,即: Amplitude_at_freq = sqrt(real_component_at_freq^2 + imag_component_at_freq^2) Phase = arctan(imag_component_at_freq/real_component_at_freq) 参考:本视频播放1分45秒: 我已经使用nump

我正试图编写一个简单的python脚本,从傅立叶变换中恢复正弦波的振幅和相位

我应该能够通过计算给定频率下傅里叶变换的实数和虚数定义的向量的大小和方向来实现这一点,即:

Amplitude_at_freq = sqrt(real_component_at_freq^2 + imag_component_at_freq^2)
Phase = arctan(imag_component_at_freq/real_component_at_freq)
参考:本视频播放1分45秒:

我已经使用numpy的fft库编写了一个简单的python脚本来尝试并再现这个结果,但是尽管我完全按照上面的方式写出了我的推导,我还是无法获得振幅和相位,尽管我可以正确地恢复测试正弦波的原始频率。上一篇文章和这篇文章指出了同一个问题(其中振幅为2倍)。具体来说,解决方案是“乘以2(光谱的一半被移除,因此必须保留能量)”,但我需要澄清这意味着什么。其次,没有提到我关于恢复相位变化的问题,振幅的计算与我这里的不同

定义振幅、相位、频率 _A=4#振幅 _p=0#相移 _f=8#频率 #构造一个简单的信号 t=np.linspace(0,2*np.pi,1024+1)[:-1] g=_A*np.sin(_f*t+_p) #应用傅里叶变换 ff=np.fft.fft(g) #获取原始信号的频率 ff_ii=np.where(np.abs(ff)>1.0)[0][0]#仅获取一个频率,另一个频率仅为负值的镜像频率 打印(“频率:”,ff_ii) #获取该频率处的复向量,以检索振幅和相移 yy=ff[ff_ii] #计算振幅 T=T.shape[0]#x的域;我们将除以高度得到频率振幅 A=np.sqrt(yy.real**2+yy.imag**2)/T 打印('振幅:',A) #计算相移 φ=np.arctan(yy.imag/yy.real) 打印('相变:',φ) 然而,我得到的结果是:

>频率:8
>>振幅:2.0
>>相变:1.5707963267948957
所以频率是准确的,但我得到的振幅是2,当它应该是4,相位变化是π/2,当它应该是零


是我的数学错误,还是我对numpy fft实现的理解不正确?

傅里叶分析信号作为exp(i.2.pi.f.t)项的和,因此它可以看到
A.sin(2.pi.f1.t)
as:
-i.A/2.exp(i.2.pi.f1.t)+i.A/2.exp(-i.2.pi.f1.t)

这在数学上是相等的。因此,用傅里叶级数表示,正频率f1和负频率f1分别具有复数
-A/2.i
A/2.i
。所以每个“边”只有一半的振幅,但是如果你把它们加在一起(在傅里叶逆变换中),你会得到振幅A。如果你只看光谱的一个(正或负)边,正和负频率的分裂就是缺失因子2的地方。这通常在实践中是这样做的,因为对于真实信号,另一半对于导出给定信号来说是微不足道的


仔细研究精确的数学和。

傅立叶将信号分析为
exp(i.2.pi.f.t)
项的总和,因此它可以看到
A.sin(2.pi.f1.t)
as:
-i.A/2.exp(i.2.pi.f1.t)+i.A/2.exp(-i.2.pi.f1.t)

这在数学上是相等的。因此,用傅里叶级数表示,正频率f1和负频率f1分别具有复数
-A/2.i
A/2.i
。所以每个“边”只有一半的振幅,但是如果你把它们加在一起(在傅里叶逆变换中),你会得到振幅A。如果你只看光谱的一个(正或负)边,正和负频率的分裂就是缺失因子2的地方。这通常在实践中是这样做的,因为对于真实信号,另一半对于导出给定信号来说是微不足道的


仔细研究一下精确的数学问题。

谢谢Koen G.,它完美地澄清了问题。谢谢Koen G.,它完美地澄清了问题。