Я пытаюсь использовать DFT и FFT в Python с помощью numpy и pyplot.
Мой образец вектора
x = np.array([1,2,4,3]
Коэффициенты ДПФ для этого вектора равны
K = [10+0j, -3+1j, 0+0j, -3-1j]
поэтому в основном у нас есть 10, -3+i, 0 и -3-1i в качестве коэффициентов ДПФ.
Теперь моя проблема состоит в том, чтобы получить комбинацию sin и cos, соответствующую всем 4 пунктам.
Предположим, у нас есть частота дискретизации 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([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)
где я терплю неудачу?
sin,cos
... (как иatan2(im,re)
) для каждой частоты Найквиста... - person Spektre   schedule 12.08.2018amplitude*sin(2*PI*t*f + phase0)
, гдеt
- время,f
соответствует Частота Найквиста иphase0=atan2(im,re)
иamplitude=sqrt(re*re + im*im)
... - person Spektre   schedule 12.08.20180.125
для второго вывода DFT,0.25
для третьего и т. д. ... Вы должны добавить 7 синусоид + смещение постоянного тока вместе, чтобы получить свой график ... кстати, добавьте@nick
к вашему комментарию, чтобы пользовательnick
сайт уведомляет - person Spektre   schedule 12.08.2018