DFT 中泄漏现象的基础及其与 sinc 函数的逼近

信息处理 自由度
2022-02-20 05:36:48

我试图了解使用 DFT 时的泄漏现象。下面我指的是里昂:了解数字信号处理(第 2 版),第 69-71 页。

具有实值余弦N样本作为输入,N 点 DFT 的幅度响应可以近似为(根据 bin 索引m)

|Y(m)|N2sinc(km),

在哪里k是内部的循环数N样品。

如果k是一个整数,只有 1 个 bin 非零。否则会发生频谱泄漏。到现在为止还挺好。

现在我想使用以下代码在 Matlab 中复制它。

N = 32;                % No of samples
fs = 32000;            % sampling frequency
m = linspace(0,N-1,N);
k = 8.5;               % No of cycles within N samples
X = sin(2*pi*k/N*m);   % cosine signal
Y = fft(X);
f = linspace(0,fs*(N-1)/N,N);
stem(f,abs(Y));hold on

k作为整数,没有泄漏。

但是,使用k=8.5在 8 kHz 和 9 kHz 处产生峰值,尽管幅度略有不同(|Y((8kHz)/fs)|=10.15|Y((9kHz)/fs)|=10.25)。在我的参考书中给出了 10.17 号。

我的问题是:

  1. 两个峰不应该完全一样吗?为什么他们不是?

  2. 另外,我已经绘制了函数|Y(m)|与“连续”m. 原始光谱的 bin 应该正好在得到的 sinc 函数上。然而,我们离 8.5 kHz 越远,差异越大。DFT bin 不只是底层连续光谱的“未覆盖”部分吗?

2个回答

不,两个峰不需要相同。离散时间傅里叶变换 (DTFT)(其样本由 DFT 计算)对于正弦曲线的频率也不是对称的(如 Robert 的评论中所述)。如果您计算截断正弦曲线的 DTFT

x[n]=sin(ω0n)(u[n]u[nN])

你得到

X(ejω)=12j(ej(ωω0)N12sin((ωω0)N2)sin(ωω02)ej(ω+ω0)N12sin((ω+ω0)N2)sin(ω+ω02))

括号中的第一项的主要贡献是ω=ω0,而第二项有它ω=ω0. 请注意,这两个函数不是 sinc 函数;只为ω很接近ω0(或者ω0) 可以用 sinc 函数来近似。这仍然没有考虑到它们的重叠。

所以你的结果是正确的,下图显示了你在 DTFT 之上的 DFT,如上计算:

在此处输入图像描述

这是 DTFT 图的 Matlab/Octave 代码:

N = 32;
k = 8.5;
fs = 32000;
w = 2 * pi * linspace(0,1,500);
w0 = 2*pi*k/N;
X = exp(-1i*(w-w0)*(N-1)/2) .* sin(N/2*(w-w0))./sin((w-w0)/2);
X = X - exp(-1i*(w+w0)*(N-1)/2) .* sin(N/2*(w+w0))./sin((w+w0)/2);
X = X/(2*1i);
绘图(w*fs/(2*pi),abs(X))

对于严格采样的真实数据,Sinc 函数将在无限频谱上周期性重复(这是允许欠采样起作用的原因)(称为 Dirichlet 核的总和),并且无限系列的 Sinc 函数将被共轭镜像(需要抵消真实数据中的任何虚部)。

来自共轭镜像 Sinc(具有假定对称 Sinc 的形状)的“干扰”对于 DC 和 Fs/2 附近的频率峰值特别大,其中 2 个 Sinc 的较高部分重叠。(因此,在 Fs/4 附近,共轭镜像干涉会更小,如果您想看到对称性,请使用该频率)。