2016-08-29 2 views
0

У меня есть данные в виде x-y-z и вы хотите создать спектр мощности вдоль x-y. Вот простой пример, я отправляю, чтобы проверить, где я мог бы идти не так с моим фактическим данным:2d fft numpy/python confusion

import numpy as np 
from matplotlib import pyplot as plt 

fq = 10; N = 20 
x = np.linspace(0,8,N); y = x 
space = x[1] -x[0] 

xx, yy = np.meshgrid(x,y) 
fnc = np.sin(2*np.pi*fq*xx) 
ft = np.fft.fft2(fnc) 
ft = np.fft.fftshift(ft) 

freq_x = np.fft.fftfreq(ft.shape[0], d=space) 
freq_y = np.fft.fftfreq(ft.shape[1], d=space) 
plt.imshow(
    abs(ft), 
    aspect='auto', 
    extent=(freq_x.min(),freq_x.max(),freq_y.min(),freq_y.max()) 
) 
plt.figure() 
plt.imshow(fnc) 

Это приводит к следующим function & frequency цифры с неправильной частотой. Благодарю.

+0

'интерполяции = 'nearest'' сделает ваш результат намного яснее – Eric

ответ

2

Одна из ваших проблем заключается в том, что matplotlib's imshow использует другую систему координат, чтобы вы ожидали. Предоставьте аргумент origin='lower', и пики теперь отображаются на y=0, как и ожидалось.

Еще одна проблема, которую вы имеете, что fftfreq нужно сказать свой временной шаг, который в вашем случае является 8/(N - 1)

import numpy as np 
from matplotlib import pyplot as plt 

fq = 10; N = 20 
x = np.linspace(0,8,N); y = x 
xx, yy = np.meshgrid(x,y) 
fnc = np.sin(2*np.pi*fq*xx) 
ft = np.fft.fft2(fnc) 
ft = np.fft.fftshift(ft) 

freq_x = np.fft.fftfreq(ft.shape[0], d=8/(N - 1)) # this takes an argument for the timestep 
freq_y = np.fft.fftfreq(ft.shape[1], d=8/(N - 1)) 
plt.imshow(
    abs(ft), 
    aspect='auto', 
    extent=(freq_x.min(),freq_x.max(),freq_y.min(),freq_y.max()), 
    origin='lower' ,   # this fixes your problem 
    interpolation='nearest', # this makes it easier to see what is happening 
    cmap='viridis'   # let's use a better color map too 
) 
plt.grid() 
plt.show() 

enter image description here

Вы можете сказать «, но частота 10, а не 0,5 !» Однако, если вы хотите сэмплировать частоту 10, вам нужно пробовать намного быстрее, чем 8/19! теорема Найквиста говорит, что вы должны превышать частоту дискретизации 20, чтобы иметь надежду на всех

+0

получил, спасибо Ou – user6769140

+0

какие-либо идеи, как я могу избавиться от вещей выше Найквиста f, т. е. получить только одну частоту? Благодарю. – user6769140

+0

@ user6769140: Вы уже избавились от этого материала - частота nyquist равна 20, но в графике выше вашего графика достигает ~ 1.2 – Eric