简单DFT系数=>振幅/频率=>P

2024-09-30 16:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Python中使用numpy和pyplot进行DFT和FFT。在

我的样本向量是

x = np.array([1,2,4,3]

该向量的DFT系数为

^{pr2}$

所以基本上我们有10,-3+i,0和-3-1i作为DFT系数。在

我现在的问题是得到一个sin和cos的组合来拟合所有4个点。在

假设采样率为1hz。在

这是我的代码:

from matplotlib import pyplot as plt
import numpy as np

x = np.array([1,2,4,3])

fft = np.fft.fft(x)

space = np.linspace(0,4,50)
values = np.array([1,2,3,4])

cos0 = fft[0].real * np.cos(0 * space)

cos1 = fft[1].real * np.cos(1/4 * np.pi * space)
sin1 = fft[1].imag * np.sin(1/4 * np.pi * space)

res = cos0 + cos1 + sin1

plt.scatter(values, x, label="original")
plt.plot(space, cos0, label="cos0")
plt.plot(space, cos1, label="cos1")
plt.plot(space, sin1, label="sin1")
plt.plot(space, res, label="combined")

plt.legend()

结果我得到了一个情节:

img
(来源:heeser-it.de

为什么最后的曲线没有碰到任何点?在

谢谢你的帮助。谢谢!在

编辑:

N = 1000
dataPoints = np.linspace(0, np.pi, N)
function = np.sin(dataPoints)
fft = np.fft.fft(function)

F = np.zeros((N,))
for i in range(0, N):
    F[i] = (2 * np.pi * i) / N
F_sin = np.zeros((N,N))
F_cos = np.zeros((N,N))

res = 0
for i in range(0, N):
    F_sin[i] = fft[i].imag / 500 * np.sin(dataPoints * F[i])
    F_cos[i] = fft[i].real / 500* np.cos(dataPoints * F[i])
    res = res + F_sin[i] + F_cos[i] 
plt.plot(dataPoints, function)
plt.plot(dataPoints, res)

我的情节是:

img
(来源:heeser-it.de

我在哪里失败?在


Tags: fftplotnppirespltspacesin
2条回答

测试向量x看起来有点像sawtooth,因为它线性上升,然后开始下降,但是只有那么少的数据点,很难分辨出它是什么信号。这是一个无限的FFT序列,这意味着它有很多高的谐波频率分量。所以要用DTF系数描述它,并接近原始点,您必须使用

  1. 更高的采样率,以获取有关更高频率的信息(您应该了解nyquist theorem
  2. 更多数据点(示例),这样您就可以提取信号中频率的更精确信息),这意味着您必须在阵列“x”中包含更多项。

你也可以尝试适应一些更简单的信号。你试着为开始安装正弦信号怎么样?生成1000个低频正弦数据点(每1000个样本1 Hz或一个周期),然后在其上运行DTF以检查代码是否工作。

有几个错误:

  • 您分配给原始值的x值将被1关闭
  • 指定给fft[1]的频率不正确
  • 系数比例不正确

这一个有效:

from matplotlib import pyplot as plt
import numpy as np

x = np.array([1,2,4,3])

fft = np.fft.fft(x)

space = np.linspace(0,4,50)
values = np.array([0,1,2,3])

cos0 = fft[0].real * np.cos(0 * space)/4

cos1 = fft[1].real * np.cos(1/2 * np.pi * space)/2
sin1 = -fft[1].imag * np.sin(1/2 * np.pi * space)/2

res = cos0 + cos1 + sin1

plt.scatter(values, x, label="original")
plt.plot(space, cos0, label="cos0")
plt.plot(space, cos1, label="cos1")
plt.plot(space, sin1, label="sin1")
plt.plot(space, res, label="combined")

plt.legend()
plt.show()

相关问题 更多 >