在尝试计算和绘制傅立叶系数时如何解决尺寸错误

时间:2018-09-19 21:06:38

标签: python fft

我正在尝试计算和绘制某些信号的傅立叶系数,但出现以下错误:

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 个答案:

答案 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()

enter image description here