将FFT绘制为python中的一组正弦波吗?

问题描述 投票:0回答:1

我在演示中看到有人这样做,但是我很难重现他的能力。这是他的演讲的幻灯片:

Sinewave decomposition via FFT

非常酷。他使用FFT分解了一个数据集,然后绘制了FFT指定的适当正弦波。

因此,为了重新创建他所做的工作,我创建了一系列与两个正弦波组合相对应的点:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.arange(0, 10, 0.01)
x2 = np.arange(0, 20, 0.02)
sin1 = np.sin(x)
sin2 = np.sin(x2)
x2 /= 2
sin3 = sin1 + sin2
plt.plot(x, sin3)
plt.show()

Composed wave

现在,我想将此波(或更确切地说,这些点所暗示的波)分解回原来的两个正弦波:

# goal: sin3 -> sin1, sin2
# sin3 
array([ 0.00000000e+00,  2.99985000e-02,  ... 3.68998236e-01])
# sin1 
array([ 0.        ,  0.00999983,  0.01999867,  ... -0.53560333])
# sin2 
array([ 0.        ,  0.01999867,  0.03998933, ... 0.90460157])

我首先导入numpy并获得fftsin3

import numpy as np
fft3 = np.fft.fft(sin3)

好的,就我所知。现在,我得到了一个包含复数的数组:

array([ 2.13316069e+02+0.00000000e+00j,  3.36520138e+02+4.05677438e+01j,...])

如果我天真地将其绘制,我会看到:

plt.plot(fft3)
plt.show()

fft naively plotted

好吧,不确定该怎么办。

我想从这里转到看起来像sin1和sin2的数据集:

plt.plot(sin1)
plt.show()

sin1 data plotted

plt.plot(sin2)
plt.show()

sin2 data plotted

[我了解fft3数据集中复数的实部和虚部,只是不确定如何处理它们以从中导出sin1sin2数据集。

我知道这与编程的关系较小,而与数学的关系较大,但是有人可以在这里给我一个提示吗?

python fft np sine-wave
1个回答
0
投票

离散傅立叶变换存在一些问题,从与连续傅里叶变换的比较中不能立即看出来。一方面,输入的周期性应与数据范围相匹配,因此使用以下命令会更加容易:

x = np.linspace(0, 4*np.pi, 200)

然后您可以遵循您的原始想法:

sin1 = np.sin(x)
sin2 = np.sin(2*x)
sin3 = sin1 + sin2
fft3 = np.fft.fft(sin3)

由于在FFT sin中直接进入虚部,因此您可以尝试仅绘制虚部:

plt.plot(fft3.imag)
plt.show()

您将看到的是与原始正弦波分量相对应的,以x=2x=4为中心的峰值,其频率为“每个信号2个”(sin(x)从0到4 pi)和“ 4个每个信号”(sin(2x)从0到4 pi)。

要绘制所有单个组件,可以使用:

for i in range(1,100):
  plt.plot(x, fft3.imag[i] * np.sin(i*x)/100)
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.