首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Numpy中如何从傅里叶变换中恢复振幅和相移?

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

Stack Overflow用户
提问于 2019-10-20 18:07:08
回答 1查看 3.1K关注 0票数 1

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

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

代码语言:javascript
运行
复制
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秒进入这个视频:continue=106&v=IWQfj05i87g

我用numpy的fft库编写了一个简单的python脚本来尝试重现这个过程,但是尽管我的推导和上面一样,我无法得到振幅和相位,尽管我可以正确地恢复测试正弦波的原始频率。上一篇文章从np.fft计算振幅增加信号长度时FFT不恢复原始幅值的原因指出了同一个问题(其中振幅是2的因子)。具体来说,解决方案是“乘以2(除去一半的光谱,所以能量必须保持)”,但我需要澄清这意味着什么。其次,我没有提到恢复相位变化的问题,而且振幅的计算与这里的情况不同。

代码语言:javascript
运行
复制
# Define amplitude, phase, frequency
_A = 4 # Amplitude
_p = 0 # Phase shift
_f = 8 # Frequency

# Construct a simple signal
t = np.linspace(0, 2*np.pi, 1024 + 1)[:-1]
g = _A * np.sin(_f * t + _p) 

# Apply the fourier transform
ff = np.fft.fft(g)

# Get frequency of original signal
ff_ii = np.where(np.abs(ff) > 1.0)[0][0] # Just get one frequency, the other one is just mirrored freq at negative value
print('frequency of:', ff_ii)

# Get the complex vector at that frequency to retrieve amplitude and phase shift
yy = ff[ff_ii] 

# Calculate the amplitude
T = t.shape[0] # domain of x; which we will divide height to get freq amplitude
A = np.sqrt(yy.real**2 + yy.imag**2)/T 
print('amplitude of:', A) 

# Calculate phase shift
phi = np.arctan(yy.imag/yy.real) 
print('phase change:', phi)

然而,我得到的结果是:

代码语言:javascript
运行
复制
>> frequency of: 8
>> amplitude of: 2.0
>> phase change: 1.5707963267948957

所以频率是准确的,但是当它应该是4的时候,振幅是2,π/2的相位变化,当它应该是零时。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-20 20:34:00

傅里叶将信号分析为exp(i.2.pi.f.t)项之和,因此它将A.sin(2.pi.f1.t)视为:

-i.A/2.exp(i.2.pi.f1.t)+i.A/2.exp(-i.2.pi.f1.t)

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

研究精确的数学,欧拉公式傅里叶变换

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58475809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档