二维实函数的相位谱

信息处理 matlab 频谱 阶段
2022-02-03 19:48:57

我正在尝试计算二维函数的相位谱,f(x,y), 在哪里x,y, 和f(x,y)是真实的,使用 MATLAB 的 fft2。因此我的操作是f(x,y)F(kx,ky). 我的功能是这样的kx只有正值和ky有正值和负值。

由于我的功能是真实的,因此我只需要单面光谱。我可以通过将频谱加倍来计算单边幅度谱,其中kx>0. 我得到的结果正是我所期望的。

当涉及到相位谱时,我得到一个不连续的函数。相位似乎以近似的差异跳跃π. 这与相位缠绕有关吗?如何获得正的连续相位图kx?

有关我的图像和代码的更多信息: 数据可以在这里找到

我的信号xy看起来像这样:

figure; contour(y,x,eta_0)
xlabel('y')
ylabel('x')

x 和 y 中的信号

幅度谱如下所示:

dx = mean(gradient(x));
dy = mean(gradient(y));
Nx = 64;
Ny = 32;

Fsy = 1/dy;
Fsx = 1/dx;
kx_fft = 2*pi * Fsx/2 * linspace(0, 1, size(eta_0,1)/2+1);
ky_fft = 2*pi * Fsy/2 * linspace(0, 1, size(eta_0,2)/2+1);
ky_fft = [-fliplr(ky_fft(2:end-1)) ky_fft];

amp_xy = circshift(abs(fftshift(fft2(eta_0)))/Nx/Ny,-1,2);
figure; plot(ky,kx,amp_xy)

幅度谱

我知道我的功能不包含任何负面kx值,因此我可以通过将正值加倍来获取单边幅度谱kx值,得到这个:

amp_xy = 2*amp_xy([Nx/2+1:Nx 1],:);
figure; imagesc(ky_fft,kx_fft,amp_xy);

正 k_x 中的幅度谱

相位谱如下所示:phase_xy = circshift(angle(fftshift(fft2(eta_0))),-1,2); 正 k_x 中的相位谱 这清楚地显示了从零左右(这是我期望我的阶段)到ππ. 为什么会这样,我该如何避免呢?

为了说明我的观点,我可以在y并检查一维幅度和相位谱。一维相位谱显示大部分相位接近于零,最低频率的相位接近于π/π正如我所料(从理论上): 一维相位

现在,如果我要切入 2D 相位谱,其中ky=0,我看到类似的东西,但不是连续的。就好像我需要改变一些阶段π上或下:

从二维相位谱中切割

本质上,问题是:如何获得正值的平滑二维相位谱kx?

atan编辑:如果我使用,而不是计算相位角angle,我会得到一个平滑变化的相位图。这是意料之中的,因为atan将角度限制在ππangle使用atan2,它跨越整个圆圈。

1个回答

相位测量需要参考某个点。

标准 FFT 计算相对于第一个样本或二维原点的样本的圆形相位。对于在 FFT 孔径中不完全是整数周期的数据(通常对于任何矩形窗口数据都是如此),这是在数据向量中的圆形不连续处。因此,结果是 FFT 相位结果的交替以表示该边缘不连续性。

边缘不连续可以用奇函数表示,奇函数出现在该不连续的 DFT 的虚(或正弦)分量中。

您可以通过在执行 FFT 之前执行 fftshift 将这个圆形或边缘不连续性从 FFT 的相位零参考点移开。这会将相位参考点移动到数据的中心,希望不会出现意外的不连续性。这种偏移通常会导致跨窗口数据的 FFT 结果箱的相位谱更加连续。然而,前 fftshift 产生与后翻转所有奇数 FFT 结果箱的相位相同的结果,而没有移位,这可能更容易做到。