零填充如何影响 DFT 的大小?

信息处理 fft 自由度 零填充 震级
2022-01-08 06:43:02

让我们使用以下 Matlab 代码模拟两个频率的正弦曲线:

fs = 1000;
t = 0 : 1/fs : 1 - 1/fs;
f1 = 3; f2 = 3.5;
x1 = cos(2*pi*f1*t);
x2 = cos(2*pi*f2*t);
L1 = length(x1); L2 = length(x2);

如果我使用以下方法对第一个信号进行 FFT:

X1 = fft(x1);

并使用以下方法绘制生成的幅度谱:

figure; subplot(2, 1, 1); plot(t, x1)
subplot(2, 1, 2); plot([-L1/2 : (L1/2 -1)]*fs/L1, fftshift(abs(X1)))

我发现得到的幅度谱完全符合我的预期(即 ± 3 Hz 的频率的高度为 500 - 这是 3 Hz 分量幅度的 0.5*L1 倍 - 所有其他频率都有一个高度0)。

在此处输入图像描述

当我为 x2 绘制相同的图时,我发现频谱能量已经分布在 3-4 Hz 左右的频率上,导致 3 Hz 处的峰值幅度从 500 降低到 320 左右:

X2 = fft(x2);
figure; subplot(2, 1, 1); plot(t, x2)
subplot(2, 1, 2); plot([-L2/2 : (L2/2 -1)]*fs/L2, fftshift(abs(X2)))

在此处输入图像描述

据我了解,这是由于 DFT 的操作方式:它将在信号长度上具有整数个周期的正弦曲线与信号相关联。由于 x2 在其 1000 个样本中有 3.5 个周期,因此 3 Hz 的正弦波和 4 Hz 的正弦波都不能与信号完全匹配,尽管这两个频率是所有频率中最接近的。因此,我们在这两个频率上都看到了很大的峰值。

但是,如果我用 1000 个额外的零对信号进行零填充,我能够找到一个 3.5 Hz 分量,因为在 2000 个样本中有 7 个周期的正弦曲线(每个样本对应于 1/1000 = 0.001 s)对应于3.5 Hz 正弦曲线(因为我们总是按 fs/L = 1000/2000 = 0.5 缩放 bin;所以 0.5*7 = 3.5 Hz),这与前 1 秒的信号完全匹配。此外,峰值的幅度现在为 500,这与在没有零填充的情况下为 3 Hz 信号找到的峰值幅度相匹配。

x2 = [x2 zeros(1, 1000)];
X2 = fft(x2);
L2 = length(x2);
t_zeropad = [0:L2-1]/fs;
figure; subplot(2, 1, 1); plot(t_zeropad, x2)
subplot(2, 1, 2); plot([-L2/2 : (L2/2 -1)]*fs/L2, fftshift(abs(X2)))

在此处输入图像描述

这导致了几个相关的问题:

  1. 是什么导致了第三个图中的旁瓣?这不是因为 t = 1 处的不连续性,因为当输入信号从余弦变为正弦时效果仍然存在,这使得信号在 t = 1 处连续。
  2. 当您对信号进行零填充时,您按什么因素缩放 FFT 的幅度?我知道对于一个没有被零填充的正弦信号,并且信号长度内正弦波的周期数是一个整数,你将幅度除以 L/2。因此,在第一个示例中,您将 500 除以 (1000/2) 得到 1,这与余弦波的幅度相匹配。补零后,信号的长度现在为 2000,因此 L/2 将为 1000,这意味着幅度图中的峰值幅度将为 0.5。当您进行零填充时,这个比例因子是否应该改变?
  3. 当正弦曲线不均匀地适合被分析的样本数量时,当您处理的是多个正弦曲线的线性组合的信号时,或者当您正在处理更复杂的信号时(例如 e(- t))?
  4. 如果有人只是给你一个信号而没有告诉你是否已经完成了零填充,你怎么能知道通过什么因素来缩放 FFT 的幅度来计算频率分量的幅度?
  5. 最后,我注意到,如果将频率为 3 Hz 的信号 x1 零填充 1000 个样本,并进行 FFT,我们再次看到在 3 Hz 的频率下,幅度为 500;光谱能量分布在 3 Hz 附近;并且存在旁瓣(见下图)。虽然使用原始信号(不是零填充),但我没有这些伪影。这使我相信,从某种意义上说,零填充会增加噪声,因为基于幅度谱,您正在引入实际不存在的频率分量。这是一种明智的思考方式吗?这是否意味着除非你“必须”,否则你不应该零填充,如果是这样,你怎么知道你是否必须?你应该零填充多少?

在此处输入图像描述

2个回答

您看到的所有效果都与窗口化有关。您的信号可以被视为截断(即矩形窗口)正弦曲线。如果 $s[n]$ 是您的信号,而 $w[n]$ 是窗口,那么您分析的信号是s[n] is your signal, and w[n] is the window, the signal you analyze is

(1)s~[n]=w[n]s[n]

离散时间傅里叶变换 (DTFT) 定义为

(2)S(f)=n=s[n]ej2πnf

我们可以重写方程式。$(1)$ 在频域(1) in the frequency domain

(3)S~(f)=W(f)S(f)

其中$\star$ 表示卷积。如果 $s[n]$ 是一个正弦曲线,那么方程。$(3)$ 意味着 $\tilde{S}(f)$ 只是移动到正弦曲线频率的窗口的频谱。 denotes convolution. If s[n] is a sinusoid, then Eq. (3) implies that S~(f) is just the spectrum of the window shifted to the sinusoid's frequency.

这与你在图中看到的有什么关系?如果我们意识到序列的离散傅里叶变换 (DFT) 只是相同(有限长度)序列的 DTFT 的采样版本,那么您所看到的一切都可以通过该采样过程来解释。注意 $\tilde{s}[n]$ 的 DFT 由下式给出s~[n] is given by

(4)S~DFT[k]=n=0N1s[n]ej2πkn/N=S~(2πkN)

零填充意味着在不添加更多信号(即信息)的情况下更改 DFT 长度 $N$,这只会导致对信号的底层 DTFT 进行更密集的采样。所以你可以说旁瓣一直存在,但它们只有通过在更密集的频率网格上采样才能看到,这是通过零填充实现的。零填充绝对不会像您怀疑的那样引入噪音。N without adding more signal (i.e., information), which just results in a denser sampling of the underlying DTFT of the signal. So you could say that the side-lobes have always been there, but they only become visible by sampling on a denser frequency grid, which is achieved by zero-padding. Zero-padding definitely does not introduce noise in the sense you suspect it would do.

由于零填充只是改变频域中的采样间隔,它不会改变任何缩放因子。

另请查看以下相关答案:herehereherehere

  1. 零填充不影响原始 N-DFT 样本的 DFT 幅度。总能量在较长的 DFT 中确实增加了,这是因为我们在 N 点 DFT 之间引入了非零样本。
  2. 零填充不会给 DFT 添加噪声。出现的旁瓣是多项式插值的结果,当我们采用零填充序列的 DFT 时,会发生这种情况。请看下面的解释。
  3. 而且,不,旁瓣并不总是在那里。因为零填充不能以任何方式增加频谱信息。因此,它不能揭示任何 N 点 DFT 没有显示的新信息。
  4. 如果您不知道在进行 DFT 之前添加了多少个零,您可以使用 IDFT 来计算添加了多少个零,因为 IDFT 会给您补零的时域序列。

解释:

在进行离散傅里叶变换之前对 N 长度的序列进行零填充以获得 L 长度的序列,本质上意味着在序列的末尾添加 (LN) 零。现在,任何长度的 N 个序列的最大频率分辨率为并且通过用 (LN) 零填充序列,我们是否将分辨率提高到更精细的2π/N2π/L

答案是否定的。

两个频率分量之间的间隔已减小到,但频率间隔的减小不会揭示 DFT 中任何更精细的细节。当然,它看起来确实显示了更精细的细节,但事实并非如此。为什么?2π/L

因为,取一个 N点 DFT 为的 N 长度序列 }$可以通过以下矩阵乘法来实现:X(L)xX(N)

X(L)=ML,N.X(N),其中是由 L x L DFT 矩阵的共轭相乘,所以,ML,NWLWN

ML,N=WL.WNH,其中是前 N 列的 L×N 矩阵的WLWL

因此,我要说明的重点是,我们不会通过采用零填充序列的 DFT 来添加任何额外的频谱信息。零填充不会添加已经不存在的额外光谱信息。

此外,可以证明N-Length序列的L点DFT实际上是N点DFT样本的拉格朗日多项式插值,因此不存在频谱信息增量。

零填充只是让 DFT 看起来更有吸引力的化妆品。

出现在零填充序列的 DFT 中的旁瓣或 DFT 图肥厚是 N 点 DFT 样本的这种拉格朗日多项式插值的结果。我们可以通过这种多项式插值将任何 N 长度的序列插入到 L 长度,甚至不需要补零和取 L 点 DFT。您可以通过拉格朗日插值获得相同的 L 点 DFT 样本。

并且当您在时域长度 N 序列的末尾增加零时,拉格朗日多项式插值会收敛到 N 点原始 DFT 样本的 Sinc 插值。这可以再次通过将正弦信号补零一个大值然后进行 DFT 来验证,您将看到在正弦频率样本处形成 Sinc 形状。这只是拉格朗日插值收敛到 Sinc 插值的结果。

这回答了您的问题,即零填充是否会影响 DFT 的大小。它只是在原始 N 点 DFT 样本之间引入非零插值样本。任何告诉零填充来增加频率分辨率的人都不是消息灵通的,或者从不太可靠的资源中学到了东西。

您可以阅读 Vetterli 和 Prandoni 的以下书籍,以可靠地理解离散信号处理:[ https://www.sp4comm.org/][1]