我尝试在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()
结果我得到了一个情节:
(来源: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)
我的情节是:
(来源:heeser-it.de)
我在哪里失败?在
测试向量x看起来有点像sawtooth,因为它线性上升,然后开始下降,但是只有那么少的数据点,很难分辨出它是什么信号。这是一个无限的FFT序列,这意味着它有很多高的谐波频率分量。所以要用DTF系数描述它,并接近原始点,您必须使用
你也可以尝试适应一些更简单的信号。你试着为开始安装正弦信号怎么样?生成1000个低频正弦数据点(每1000个样本1 Hz或一个周期),然后在其上运行DTF以检查代码是否工作。
有几个错误:
这一个有效:
相关问题 更多 >
编程相关推荐