Python 简单DFT系数=>;振幅/频率=>;情节

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

我正在使用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 = 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系数来描述它并接近原始点,您必须使用

  • 更高的采样率,以获取有关更高频率的信息(您应该了解)
  • 更多数据点(样本),因此您可以提取有关信号中频率的更精确信息)这意味着您必须在数组“x”中包含更多项

  • 你也可以试着适应一些简单的信号。你试着在启动时安装一个正弦信号怎么样?生成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]具有相同频率的正弦和余弦分量,它们相加在一起。