繁体   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