如果我将零放在输入序列的末尾,并采用 fft,然后通过将零填充到 fft 输出来获取加器长度的 ifft,输入序列的零会反映在最终的 ifft 输出上吗? 我尝试在 MATLAB 中执行此操作,在原始数据中没有任何零头的情况下,最终 IFFT 输出的最后一部分似乎偏离了接近零。在输入序列开头不添加零的 IFFT 输出 但是,当我在数据开头添加零时,数据的最后部分似乎几乎为零。 谁能对此给出任何数学解释?
我尝试在 MATLAB 中执行此操作,在原始数据中没有任何零头的情况下,最终 IFFT 输出的最后一部分似乎偏离了接近零。 但是,当我在数据开头添加零时,数据的最后部分似乎几乎为零。 IFFT 输出在输入序列的开头带有零 谁能对此给出任何数学解释?
当您将零填充到信号末尾,然后通过对 FFT 输出进行零填充来进行 FFT 和“较长”长度信号的 iFFT 时,零会影响最终的 iFFT 结果。
我们知道信号的 FFT 将其从时域变换到频域。正确的? iFFT 将其变换回时域。如果我们在时域中进行补零,它会增加频域中的“分辨率”,但不会“从根本上”改变原始信号的频率内容。
当您在计算 FFT 之前对信号进行零填充时,就会增加信号的长度。这提高了频率分辨率,但原始信号中的实际值保持不变。然而,序列末尾的零填充可能会在填充开始的边界处引入“不连续性”,从而影响 iFFT 输出。
FFT 隐含地假设“循环卷积”。如果信号突然结束(末尾没有补零)而不是平滑结束,则循环卷积假设会导致 iFFT 输出回绕,从而导致信号末尾出现不连续性和偏离零的情况。
import numpy as np
import matplotlib.pyplot as plt
def pad_end(size, pad):
np.random.seed(42)
x = np.random.randn(size)
x_padded_end = np.concatenate((x, np.zeros(pad)))
X_padded_end = np.fft.fft(x_padded_end)
x_ifft_end = np.fft.ifft(np.concatenate((X_padded_end, np.zeros(pad))))
return x_ifft_end
def pad_both(size, pad):
np.random.seed(42)
x = np.random.randn(512)
x_padded_both = np.concatenate((np.zeros(pad), x, np.zeros(pad)))
X_padded_both = np.fft.fft(x_padded_both)
x_ifft_both = np.fft.ifft(np.concatenate((X_padded_both, np.zeros(pad))))
return x_ifft_both
end = pad_end(512, 64)
both = pad_both(512, 64)
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(np.real(end), label='Real')
plt.plot(np.imag(end), label='Imaginary')
plt.title('iFFT with Zero-padding at the End')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(np.real(both), label='Real')
plt.plot(np.imag(both), label='Imaginary')
plt.title('iFFT with Zero-Padding at the Start')
plt.legend()
plt.tight_layout()
plt.show()
信号开始和结束处的零填充有助于减轻由于 FFT/iFFT 中的“循环卷积”而产生的边界效应,这会导致“更平滑”的 iFFT,如果您愿意的话,它在结尾。 这就是为什么当您在信号开头添加零时,您会看到 iFFT 输出的差异。
参见循环卷积