Я пытаюсь вычислить и построить коэффициенты Фурье для некоторого сигнала, и я получаю следующую ошибку:
x and y must have same first dimension, but have shapes (1000,) and (1,)
используя следующий код:
x=np.linspace(0,6, 1000)
y=np.cos(x**2)
#Areglo de 0 a 2pi con la cantida p k=n
def fourier(y):
for k in range (0,3):
for t in range(0, n - 1):
X = np.sum(y*np.exp(-2j*np.pi*t*(k/n)))
return X
a=fourier(y)
plt.plot(x,a)
Как я могу исправить эту ошибку?
Ошибка
x and y must have same first dimension, but have shapes (1000,) and (1,)
возникает, когда вы пытаетесь построить результаты с помощью plt.plot(x, a)
. В вашем конкретном случае x
представляет собой массив из 1000 значений, а a
- скаляр. Ваше намерение было возможно получить массив, а не скаляр, так что погружение в ваши fourier
реализации.
Похоже, вы пытаетесь вычислить первые несколько коэффициентов дискретного преобразования Фурье. Для этого вам необходимо присвоить разные коэффициенты различным индексам в массиве результатов X
Также сумма должна выполняться по всему векторному выражению y*np.exp(-2j*np.pi*t*(k/n))
. Запустив цикл по различным значениям t
, вы вычисляете сумму элементов y
масштабированных некоторым фактором (другой коэффициент для каждого значения t
, но тот же самый коэффициент, применяемый ко всему массиву y
для каждого разного значения от t
).
Объединив все это, вы должны выполнить следующую реализацию:
def fourier(y, kmax):
n = len(y)
X = np.zeros(kmax, dtype=np.complex)
for k in range (0,kmax):
t = np.arange(0, n)
X[k] = np.sum(y*np.exp(-2j*np.pi*t*(k/n)))
return X
kmax = 3
a=fourier(y,kmax)
Чтобы построить результаты, вы должны использовать одинаковое количество точек вдоль оси x, чем вдоль оси y. Поскольку мы вычислили коэффициенты kmax
, мы также должны ограничить число точек оси x до kmax
. Наконец, поскольку эти коэффициенты являются комплексными числами, вам нужно будет свести результаты к набору чисел с вещественными значениями перед построением графика. Общим приложением является получение величины коэффициентов с np.abs
.
plt.plot(x[0:kmax],np.abs(a))
plt.show()
Почему бы не использовать scipy fft package? Вы можете рассчитать спектр фазы и амплитуды отдельно. ниже приведен пример
import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
x=np.linspace(0,6, 1000)
y=np.cos(x**2)
best_len = fftpack.helper.next_fast_len(len(y))
yf = fftpack.fft(y, best_len)
xf = fftpack.fftfreq(best_len, np.diff(x)[0])
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
ax[0].plot(xf[0:best_len//2], 2.0/best_len*np.abs(yf[0:best_len//2]))
ax[1].plot(xf[0:best_len//2], 2.0/best_len*np.angle(yf[0:best_len//2]))
ax[0].set_title('Amplitude spcetrum')
ax[1].set_title('Phase spcetrum')
plt.show()
ctrl
+k
n
? Также вы вычисляетеX
в цикле for. Он будет возвращен для k = 0, 1, 2, но поскольку вы перезаписываете переменнуюa
,a
будет содержать значение только дляk = 2
.