傅里叶变换给出了意想不到的结果:信号反转和共轭

信息处理 fft Python 自相关 共轭
2022-02-17 05:45:49

据我了解数学你可以通过傅里叶变换来反转一个实值信号,取结果的复共轭和傅里叶逆变换,即

(1)f(x)=F1(F(f(x))¯)
在哪里F是傅立叶变换操作,上划线表示复共轭。这一切都是有道理的,从数学的角度来看,这不是很有用。然而,从 DSP 的角度来看,它非常有用,因为信号的自相关可以方便地转换为信号与其自身的时间反转版本的卷积。如果您使用 FFT 卷积,则意味着您只需计算信号的一次 FFT。

当我试图确认等式 (1) 在 python 中有效时,我发现结果偏移了一个样本。这是示例代码:

import numpy as np
from numpy.fft import rfft, irfft
x = np.arange(128)
y = np.sin(2 * np.pi * x / 128 * 4 + np.pi / 3)
y_rev = y[::-1]
y_rev_fft = irfft(conj(rfft(y)))
plt.plot(y, label="Original Signal")
plt.plot(y_rev, label="Straight Reverse")
plt.plot(y_rev_fft, label="FFT Reverse")

FFT 共轭反转

这是预期的结果吗?如果是这样,在我描述的 FFT 相关算法中仍然可以使用共轭吗?

另外,这个问题是否更适合另一个 stackexchange 站点?

1个回答

尝试用点而不是线来绘制信号和正反转信号,您会发现,与通过 FFT 进行反转不同,在整个反转过程中没有一个值保持不变。如果您认为数据是周期为 128 的周期性数据,而不是像通过 FFT 反转那样围绕索引 0(或 64),则直接反转会在索引 63.5 附近或等效地在索引 -0.5 附近翻转 128 长数据。

根据用户大卫霍夫曼的测试

roll(irfft(conj(rfft(y))*rfft(y)), -1)

irfft(rfft(y[::-1])*rfft(y))

为自相关工作,rollnumpy循环移位。