You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

3D FFT后原始信号恢复及傅里叶系数F(n,m,p)求解

3D FFT信号恢复与傅里叶系数求解

1. 如何在执行3D FFT后恢复原始信号?

在MATLAB里,恢复3D FFT后的原始信号非常直接,用ifftn函数就行——它是fftn的逆变换。需要注意的是,MATLAB的fftn默认不做归一化,但ifftn会自动除以信号的总元素数,所以直接调用就能得到原始信号的近似值。

如果你的原始信号是实数(比如示例里的X),可以加上'symmetric'参数,消除数值计算带来的微小虚部,得到纯实数的恢复结果:

% 基于你提供的示例代码
x = (0:19)'; y = 0:19; z = reshape(0:19,[1 1 20]);
X = cos(2*pi*0.01*x) + sin(2*pi*0.02*y) + cos(2*pi*0.03*z);
Y = fftn(X);

% 恢复原始信号
X_recovered = ifftn(Y, 'symmetric');

% 验证恢复精度(误差应该极小,接近机器精度)
max_abs_error = max(abs(X(:) - X_recovered(:)))

运行后你会看到max_abs_error在1e-12量级,说明恢复效果很好。

2. 从fftn结果Y求解傅里叶系数F(n,m,p)、波数k和相位角a

要把X表示为多个余弦分量的和:
$$X2(x,y,z) = \sum_{n,m,p} F(n,m,p) \cdot \cos(k_n x + k_m y + k_p z + a(n,m,p))$$
我们需要结合离散傅里叶变换(DFT)的物理意义来拆解Y的每个元素:

核心原理

Y(n,m,p)是3D DFT的复数结果,每个复数对应一个频率分量的振幅和相位:

  • 复数的模|Y(n,m,p)|对应分量的振幅强度
  • 复数的辐角angle(Y(n,m,p))对应分量的相位偏移
  • 由于X是实数,Y满足共轭对称性:Y(n,m,p) = conj(Y(N_x-n+2, N_y-m+2, N_z-p+2))(其中N_x,N_y,N_z是X三个维度的长度),正频率和负频率分量是共轭的,我们可以利用这一点简化计算。

具体计算步骤

假设X的维度为N_x × N_y × N_z,总元素数N = N_x*N_y*N_z:

(1)计算波数k_n, k_m, k_p

波数是频率的角频率形式,对每个索引(n,m,p):

  • n维度:$k_n = 2\pi \cdot \frac{n-1}{N_x}$(当$n \leq N_x/2+1$,对应正频率);若$n > N_x/2+1$,则$k_n = 2\pi \cdot \frac{n-1-N_x}{N_x}$(对应负频率)
  • 同理,$k_m = 2\pi \cdot \frac{m-1}{N_y}$(正频率)或$2\pi \cdot \frac{m-1-N_y}{N_y}$(负频率)
  • $k_p = 2\pi \cdot \frac{p-1}{N_z}$(正频率)或$2\pi \cdot \frac{p-1-N_z}{N_z}$(负频率)
(2)计算傅里叶系数F(n,m,p)

根据共轭对称性,分三类处理:

  • DC分量(n=1,m=1,p=1):对应信号的直流偏移,$F(1,1,1) = \frac{|Y(1,1,1)|}{N}$
  • 正/负频率共轭对:非DC、非Nyquist频率的分量(即(n,m,p)和它的共轭点不是同一个点),每个对共同组成一个余弦项,因此$F(n,m,p) = \frac{2 \cdot |Y(n,m,p)|}{N}$,且共轭点的F值与当前点相同
  • Nyquist频率分量:当维度长度为偶数时,存在Nyquist频率(比如n=N_x/2+1),这类分量的共轭点是自身,因此$F(n,m,p) = \frac{|Y(n,m,p)|}{N}$
(3)计算相位角a(n,m,p)

相位角直接取复数Y(n,m,p)的辐角:
$$a(n,m,p) = \text{angle}(Y(n,m,p))$$
共轭点的相位角是当前点的相反数:$a(N_x-n+2, N_y-m+2, N_z-p+2) = -a(n,m,p)$,这样两个共轭分量的余弦项相加后结果为实数,符合原始信号的特性。

MATLAB示例代码

基于你的示例,计算F和a的简化代码如下:

Nx = size(X,1); Ny = size(X,2); Nz = size(X,3);
N = Nx*Ny*Nz;

% 初始化F和a数组
F = zeros(Nx, Ny, Nz);
a = angle(Y); % 直接用angle函数计算所有相位

% 处理DC分量
F(1,1,1) = abs(Y(1,1,1))/N;

% 生成网格索引
[n_grid, m_grid, p_grid] = meshgrid(1:Nx, 1:Ny, 1:Nz);
% 计算共轭对称点索引
n_sym = Nx - n_grid + 2;
m_sym = Ny - m_grid + 2;
p_sym = Nz - p_grid + 2;

% 标记非对称、非DC的点(即共轭对的一半)
is_non_sym = (n_grid < n_sym) | (n_grid == n_sym & m_grid < m_sym) | ...
             (n_grid == n_sym & m_grid == m_sym & p_grid < p_sym);
is_non_dc = ~((n_grid == 1) & (m_grid == 1) & (p_grid == 1));

% 计算这些点的F值,并同步到共轭点
F(is_non_sym & is_non_dc) = 2 * abs(Y(is_non_sym & is_non_dc)) / N;
F(n_sym(is_non_sym & is_non_dc), m_sym(is_non_sym & is_non_dc), p_sym(is_non_sym & is_non_dc)) = ...
    F(is_non_sym & is_non_dc);

% 处理对称点(Nyquist分量)
is_sym = (n_grid == n_sym) & (m_grid == m_sym) & (p_grid == p_sym) & is_non_dc;
F(is_sym) = abs(Y(is_sym))/N;

这段代码会生成符合你需求的F和a数组,你可以用它们重构原始信号,验证结果的正确性。


内容的提问来源于stack exchange,提问作者Dpestar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:39:56