Как я могу исправить ошибку измерения при попытке вычислить и построить коэффициенты Фурье

1

Я пытаюсь вычислить и построить коэффициенты Фурье для некоторого сигнала, и я получаю следующую ошибку:

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)

Как я могу исправить эту ошибку?

  • 2
    Извини, какой у тебя вопрос? также в качестве заметки в следующий раз опубликуйте свой код, выделите код и нажмите ctrl + k
  • 1
    Что вы пытаетесь сделать в своем коде? Что такое n ? Также вы вычисляете X в цикле for. Он будет возвращен для k = 0, 1, 2, но поскольку вы перезаписываете переменную a , a будет содержать значение только для k = 2 .
Показать ещё 1 комментарий
Теги:
fft

2 ответа

3

Ошибка

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()
  • 0
    Wooooow, спасибо!
0

Почему бы не использовать 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()

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню