Я пытаюсь использовать Imshow для построения двумерного преобразования Фурье моих данных. Тем не менее, Imshow строит данные относительно их индекса в массиве. Я хотел бы построить данные для набора массивов, в которых содержатся соответствующие значения частоты (один массив для каждого значения яркости), но не могу понять, как.
У меня есть двумерный массив данных (импульсный гауссов сигнал), который я преобразую Фурье с помощью np.fft.fft2. Это все отлично работает. Затем я получаю соответствующие частотные интервалы для каждого измерения с помощью np.fft.fftfreq (len (data)) * sampling_rate. Я не могу понять, как использовать imshow для отображения данных по этим частотам. 1D эквивалент того, что я пытаюсь сделать, используя plt.plot (x, y), а не просто plt.plot (y).
Моя первая попытка состояла в том, чтобы использовать флаг "экстента" в imshows, но, насколько я могу судить, это лишь изменяет пределы оси, а не фактические ячейки.
Моим следующим решением было использовать np.fft.fftshift, чтобы упорядочить данные в числовом порядке, а затем просто изменить масштаб оси, используя следующий ответ: Изменить масштаб оси 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), соответствующий частоте моего сигнала (с некоторым падением вокруг него, соответствующим ширине полосы), но вместо этого мой максимум возникает в некоторой случайной позиции, соответствующей индексу частоты в моих данных массив. Если у кого-то есть идеи, исправления или другие функции, которые я могу использовать, я буду очень признателен!