[英]Python: How to interpolate 'unstructured' 2D Fourier transform data
我的目標是對函數的離散連續2D傅里葉變換進行插值。 問題似乎在於,每個維度中的頻率都沒有嚴格按升序輸出(請參閱此處 )。
fft.fft2
函數接受一個2D數組,在本例中,該數組(我們將其稱為A
)的結構使得A[i][j] = fun(x[i], y[j])
, fun
為要轉換的功能。 將fft.fft2
應用於A
,輸出的數組F
的尺寸與原始數組的尺寸相同,因此對應於F[i][j]
的頻率坐標為(w_x[i], w_y[j])
,其中w_x = fft.fftfreq(F.shape[0])
和w_y = fft.fftfreq(F.shape[1])
,這兩個都是一維數組,並且不按升序排列。
在wx
和wy
我想對F
(例如對函數finterp
)進行插值finterp(w_x, w_y)
在調用finterp(w_x, w_y)
, w_x
和w_y
在wx
和wy
范圍內時返回插值。 。 我研究了scipy.interpolate提供的各種插值方法 ,但是在我看來,它們中的任何一個都不能處理這種類型的數據結構(坐標軸被定義為無序的一維數組和函數值在2D數組中)。
這有點抽象,因此在這里我組成了一個簡單的示例,其結構與上述類似。 假設我們希望在給定以下數據的情況下y = [-1, 1]
在x = [-1, 1]
和y = [-1, 1]
x = [-1, 1]
的區域上構造一個連續函數f(x, y) = x + y
:
import numpy as np
# note that below z[i][j] corresponds to what we want f(x[i], y[j]) to be
x = np.array([0, 1, -1])
y = np.array([0, 1, -1])
z = np.array([0, 1, -1],[1, 2, 0],[-1, 0, -2])
我們知道z[i][j]
對應於在x[i], y[j]
處求值的函數。 (a)在給定其原始結構的情況下如何直接對該數據進行插值,或者(b)重新排列數據以使x
和y
升序,而排列的z
使得z[i][j]
等於到在重新排列的x[i], y[j]
處求值的函數?
以下代碼顯示如何使用fftshift
更改fft2
和fftfreq
的輸出,從而使頻率軸單調遞增。 應用fftshift
,可以使用數組進行插值。 我添加了數組的顯示,以便您可以驗證數據本身是否不變。 原點從數組的左上角移到數組的中間,將負頻率從右側移到左側。
import numpy as np
import matplotlib.pyplot as pp
x = np.array([0, 1, -1])
y = np.array([0, 1, -1])
z = np.array([[0, 1, -1],[1, 2, 0],[-1, 0, -2]])
f = np.fft.fft2(z)
w_x = np.fft.fftfreq(f.shape[0])
w_y = np.fft.fftfreq(f.shape[1])
pp.figure()
pp.imshow(np.abs(f))
pp.xticks(np.arange(0,len(w_x)), np.round(w_x,2))
pp.yticks(np.arange(0,len(w_y)), np.round(w_y,2))
f = np.fft.fftshift(f)
w_x = np.fft.fftshift(w_x)
w_y = np.fft.fftshift(w_y)
pp.figure()
pp.imshow(np.abs(f))
pp.xticks(np.arange(0,len(w_x)), np.round(w_x,2))
pp.yticks(np.arange(0,len(w_y)), np.round(w_y,2))
pp.show()
一種替代方法是不使用fftfreq
來確定您的頻率,而是手動計算它們。 默認情況下,FFT計算k=[0..N-1]
的DFT。 由於周期性, k
處的DFT等於k+N
和kN
處的DFT時,其輸出通常被解釋為具有k=[N//2...(N-1)//2]
(但排列不同以匹配k=[0..N-1]
); 這是fftfreq
返回的k
(返回k/N
)。
因此,您可以說
N = f.shape[0]
w_x = np.linspace(0, N, N, endpoint=False) / N
現在,您沒有任何負頻率,而是具有[0,N-1]/N
范圍內的頻率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.