簡體   English   中英

Python:如何對“非結構化”二維傅立葉變換數據進行插值

[英]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]) ,這兩個都是一維數組,並且不按升序排列。

wxwy我想對F (例如對函數finterp )進行插值finterp(w_x, w_y)在調用finterp(w_x, w_y)w_xw_ywxwy范圍內時返回插值。 。 我研究了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)重新排列數據以使xy升序,而排列的z使得z[i][j]等於到在重新排列的x[i], y[j]處求值的函數?

以下代碼顯示如何使用fftshift更改fft2fftfreq的輸出,從而使頻率軸單調遞增。 應用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+NkN處的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM