零相位小波的相位谱不为零!

信息处理 matlab 阶段
2022-02-17 06:26:03

我将绘制零相位 ricker 小波的相位谱。我计算fft小波的 并使用phaseorangle来计算相位谱,但结果不为零!

我使用以下代码:

Fs = 250;
t = 0:1/Fs:0.5*(Fs-1)/Fs;
f1 = 30;
w = (1-2*pi^2*f1^2.*t.^2) .* exp(-(pi*f1.*t).^2);
X = fft(w);
plot(angle(X));
1个回答

您的矢量w不是对称的,因此不要期望零相位 FFT 结果。只需plot(t,w)看看 FFT 将什么视为其输入。原因是您w只计算了 positive t您需要执行以下操作:

  • 选择奇数个等距的时域点2N+1
  • 为非负计算 Ricker 小波的 N+1 个点t从...开始t0=0
  • 由于小波是对称的,所以N积分t<0N积分t>0
  • 将这些值附加为负数t在要转换的时域向量的末尾:w = [r_0,r_1,...,r_N,r_N,r_{N-1},...,r_1]. 这样做的原因是 DFT/FFT 假定第一个向量条目是t=0. 附加负值t最后简单地反映了由 DFT 转换的所有信号的隐含周期性。

结果将是一个实值 FFT,直至数值误差。

在 Matlab 中,这看起来像这样:

Fs = 250;
N = 50;
t = (0:50)/Fs;
f1 = 30;
w = (1-2*pi^2*f1^2.*t.^2) .* exp(-(pi*f1.*t).^2);
w = [w, w(N+1:-1:2)];
X = fft(w);
max(abs(imag(X)))     % 2.2682e-16 on my machine