Python 简单DFT系数=>;振幅/频率=>;情节
我正在使用numpy和pyplot在Python中尝试DFT和FFT 我的样本向量是Python 简单DFT系数=>;振幅/频率=>;情节,python,numpy,math,fft,dft,Python,Numpy,Math,Fft,Dft,我正在使用numpy和pyplot在Python中尝试DFT和FFT 我的样本向量是 x = np.array([1,2,4,3] 该向量的DFT系数为 K = [10+0j, -3+1j, 0+0j, -3-1j] 基本上我们有10,-3+i,0和-3-1i作为DFT系数 我现在的问题是得到一个sin和cos的组合来适应所有的4点 假设采样率为1hz 这是我的代码: from matplotlib import pyplot as plt import numpy as np x = n
x = np.array([1,2,4,3]
该向量的DFT系数为
K = [10+0j, -3+1j, 0+0j, -3-1j]
基本上我们有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()
结果我得到了图:
(来源:) 为什么最后的曲线没有碰到任何一点 谢谢你的帮助。谢谢 编辑:
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)
我的情节是这样的:
(来源:)
哪里会失败?您的测试向量x看起来有点像a,因为它线性上升,然后开始下降,但由于数据点太少,很难判断它是什么信号。这有一个无限的FFT序列,这意味着它有很多高次谐波频率成分。因此,要用DTF系数来描述它并接近原始点,您必须使用
你也可以试着适应一些简单的信号。你试着在启动时安装一个正弦信号怎么样?生成1000个低频正弦数据点(1Hz或每1000个样本一个周期),然后在其上运行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()
我相信你的问题与数学比编程更相关。我已经在我的原始帖子中发布了我的python代码。也许是个主意?对不起,我在板条部分没有什么专业知识:/我想如果你把这个问题改成数学堆栈会更好。/不,我知道如何获得频率。但是当我想要绘制它时,我没有得到一个好的结果。让我困惑的是,当我在上面输入我的4个样本时,它会计算出一条适合所有点的曲线。我编辑了下面的代码,并测试了频率为1HZ的sin。请退房。我不知道,也许我在理解上有问题?谢谢。为什么你要用1/4来缩放cos0,用1/2来缩放cos1/sin1?实际上所有的东西都是4:-fft[1]。imag/2实际上是(fft[3]-fft[1])。imag/4。这些系数不是真的用于正弦和余弦,而是用于复指数。fft[1]和fft[3]具有相同频率的正弦和余弦分量,它们相加在一起。