gpt4 book ai didi

python - numpy.fft.fft() 在 Python 中的实现

转载 作者:行者123 更新时间:2023-12-03 14:38:07 29 4
gpt4 key购买 nike

我正在尝试使用 fft 获取周期信号的频谱功能。然后绘制变换的幅度和相位。幅度图没问题,但相位图完全出乎意料。
例如,我使用了函数 Sin³(t) 和 Cos³(t)。我使用的代码是:

import matplotlib.pyplot as plt
import numpy.fft as nf
import math
import numpy as np
pi = math.pi

N=512

# Sin³(x)
t=np.linspace(-4*pi,4*pi,N+1);t=t[:-1]
y=(np.sin(t))**3
Y=nf.fftshift(nf.fft(y))/N
w=np.linspace(-64,64,N+1);w=w[:-1]

plt.figure("0")
plt.subplot(2,1,1)
plt.plot(w,abs(Y),'ro',lw=2)
plt.xlim((-4,4))
plt.ylabel(r"$|Y|$",size=16)
plt.title("Spectrum of sin\u00B3(t)")
plt.grid(True)
plt.subplot(2,1,2)
ii=np.where(abs(Y)>1e-3)
plt.plot(w[ii],np.angle(Y[ii]),'go',lw=2)
plt.xlim((-4,4))
plt.ylabel(r"Phase of $Y$",size=16)
plt.xlabel(r"$\omega$",size=16)
plt.grid(True)

# Cos³(x)

t=np.linspace(-4*pi,4*pi,N+1);t=t[:-1]
y=(np.cos(t))**3
Y=nf.fftshift(nf.fft(y))/N
w=np.linspace(-64,64,N+1);w=w[:-1]

plt.figure("1")
plt.subplot(2,1,1)
plt.plot(w,abs(Y),'ro',lw=2)
plt.xlim((-4,4))
plt.ylabel(r"$|Y|$",size=16)
plt.title("Spectrum of cos\u00B3(t)")
plt.grid(True)
plt.subplot(2,1,2)
ii=np.where(abs(Y)>1e-3)
plt.plot(w[ii],(np.angle(Y[ii])),'go',lw=2)
plt.xlim((-4,4))
plt.ylabel(r"Phase of $Y$",size=16)
plt.xlabel(r"$\omega$",size=16)
plt.grid(True)

得到的图是:

i) 对于 Sin³(t) -
Magnitude and Phase of Spectrum of Sin³(t)

ii) 对于 Cos³(t) -
Magnitude and Phase of Spectrum of Cos³(t)

正如您在上面的链接中看到的,两个函数的大小都很好。 Sin³(t) 的频谱相位如预期的那样正确。

由于 Cos³(t) 是实数和偶数,并且以复指数形式展开显示系数的相位为 0。但绘制的图形显示了完全不同的答案(参见 2):在 w=-3 时,相位为近 5 弧度。我犯了什么错误,实现 FFT 的正确方法是什么。

最佳答案

np.fft行为符合预期;是你的阴谋造成了困惑。调用 plt.tight_layout()应该有助于为您解决问题:

Spectrum of cos t ^ 3

如果仔细查看 cos³(t) 相位的 y 轴,您会发现这些值都具有 1e-17 前因数。所以在 w = -3 时,相位是 不是 接近 5 弧度,它实际上接近 5e-17 弧度(出于所有意图和目的为零)。

我在研究这个时整理了你的代码:

import matplotlib.pyplot as plt
import numpy.fft as nf
import numpy as np

plt.rcParams['axes.grid'] = True

pi = np.pi
N = 512

t = np.linspace(-4*pi, 4*pi, N+1)[:-1]


def fft_func(x, func, N):
y = func(x) ** 3
Y = nf.fftshift(nf.fft(y)) / N
w = np.linspace(-64, 64, N+1)[:-1]
return y, Y, w


def plot_mag_phase(w, Y, func_name):
fig, ax = plt.subplots(2, 1)

ii = np.where(abs(Y) > 1e-3)

ax[0].plot(w, abs(Y), 'ro', lw=2)
ax[1].plot(w[ii], np.angle(Y[ii]), 'go', lw=2)

ax[0].set_xlim(-4, 4)
ax[1].set_xlim(-4, 4)

ax[0].set_ylabel("$|Y|$", size=16)
ax[1].set_ylabel("Phase of $Y$", size=16)

ax[0].set_title("Spectrum of {}\u00B3(t)".format(func_name))
ax[1].set_xlabel(r'$\omega$', size=16)

fig.tight_layout()

# sin x ^ 3
y, Y, w = fft_func(t, np.sin, N)
plot_mag_phase(w, Y, 'sin')

# cos x ^ 3
y, Y, w = fft_func(t, np.cos, N)
plot_mag_phase(w, Y, 'cos')

关于python - numpy.fft.fft() 在 Python 中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61304860/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com