我正在尝试使用Imshow绘制我的数据的二维傅立叶变换。但是,Imshow会根据数组中的索引绘制数据。我想针对一组数组绘制数据,这些数组包含对应的频率值(每个暗淡对应一个数组),但不知道如何。
我有一个二维数据数组(高斯脉冲信号),我用np.fft.fft2进行了傅里叶变换。这一切都很好。然后,我使用np.fft.fftfreq(len(data))* sampling_rate获取每个维度的相应频率仓。我无法弄清楚如何使用imshow针对这些频率绘制数据。一维等效于我尝试使用plt.plot(x,y)而不是仅仅使用plt.plot(y)。
我的第一个尝试是使用imshows“ extent”标志,但是据我所知,只是改变了轴限制,而不是实际的bin。
我的下一个解决方案是使用np.fft.fftshift按数字顺序排列数据,然后使用以下答案简单地重新缩放轴:Change the axis scale of imshow。但是,频点的索引并不是纯比例因子,通常还存在恒定的偏移量。
我的尝试是使用2d hist而不是imshow,但这不起作用,因为2dhist绘制了订单对出现的次数,而我想绘制与特定订单对相对应的标量值(即特定频率组合的信号)。
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
f = 200
st = 2500
x = np.linspace(-1,1,2*st)
y = signal.gausspulse(x, fc=f, bw=0.05)
data = np.outer(np.ones(len(y)),y) # A simple example with constant y
Fdata = np.abs(np.fft.fft2(data))**2
freqx = np.fft.fftfreq(len(x))*st # What I want to plot my data against
freqy = np.fft.fftfreq(len(y))*st
plt.imshow(Fdata)
我应该在(200,0)处看到一个与信号频率相对应的峰值(与带宽相对应的附近会出现一些下降),但是我的最大值出现在某个随机位置,该位置与我的数据中的频率索引相对应数组。如果有人有任何想法,修补程序或其他要使用的功能,我将不胜感激!
答案 0 :(得分:0)
我无法运行您的代码,但是我认为您正在寻找extent=
argument to imshow()
。有关更多信息,请参见the page on origin
and extent
。
像这样的事情可能有用吗?
plt.imshow(Fdata, extent=(freqx[0],freqx[-1],freqy[0],freqy[-1]))