我正在尝试计算和绘制某些信号的傅立叶系数,但出现以下错误:
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)
如何解决该错误?
答案 0 :(得分:3)
错误
#This works, but is there a different way? left_join(x, x %>% unnest(links) %>% count(links), by = c("move" = "links"))
在尝试使用x and y must have same first dimension, but have shapes (1000,) and (1,)
绘制结果时会出现变化。在您的特定情况下,plt.plot(x, a)
是1000个值的数组,而x
是标量。您的意图可能是获取数组而不是标量,所以让我们深入研究您的a
实现。
您似乎正在尝试计算Discrete Fourier Transform的前几个系数。为此,您需要将不同的系数分配给结果数组fourier
中的不同索引。同样,总和应该在整个向量表达式X
上进行。通过对y*np.exp(-2j*np.pi*t*(k/n))
的不同值进行循环,可以计算出t
的元素总和,该元素的总和按某个因子进行缩放(y
的每个值都有不同的因子,但是对于t
的每个不同值,将相同的因子应用于整个数组y
。
将所有内容放在一起,您将获得以下实现:
t
要绘制结果,必须沿x轴使用与y轴相同的点数。由于我们计算了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轴点的数量限制为kmax
。最后,由于这些系数是复数,因此在绘制之前必须将结果减少为一组实数值。常见的应用是使用kmax
获得系数的大小。
np.abs
答案 1 :(得分:0)
为什么不使用scipy fft包?您可以分别绘制相位和幅度频谱。下面是一个例子
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()