为什么频率分辨率取决于样本数量?(需要直觉)

信息处理 自由度
2021-12-28 04:51:06

我知道 DFT,我同意公式和一切,但我不明白频率分辨率和样本数量之间的联系。

比如,为什么我会通过在我的 DFT 中采集更多样本来获得更高的频率分辨率?

公式为: 在此处输入图像描述

在这里,我们不是对有限数量的 k 个离散频率求和,我们只是对 N 个样本求和。

这是来自 3Blue1Brown 的精彩视频,它帮助我对傅立叶变换有一个直观的了解: https ://www.youtube.com/watch?v=spUNpyF58BY&t=915s

在这段视频中,我们可以看到我们如何在 exp 函数上评估不同转速下的信号。所以我不明白为什么我们不能用 DFT 评估我们想要多少频点的信号。

这很奇怪,因为我理解为什么我们从离散时间转向离散频率。但我的脑海中没有直觉和视觉表现。

有人能帮帮我吗?

提前谢谢了

安托万

4个回答

这是造成混淆的常见原因。大概你正在考虑这样的问题

给定一个时间序列(sn)n{0..N1}我们知道的形式是

sn=AeiωnN,
我们能找出什么值吗ACωR有?

现在,这是一个可以用傅立叶分析解决的问题,但它并不是最合适的工具。更好的是使用例如Levenberg-Marquardt执行非线性最小二乘拟合,这确实能够获得良好的近似值Aω即使是很短的时间序列。

如果使用傅里叶分析,人们可能会期望它仅通过将 DFT 应用于时间序列来工作,结果将是分解(Sk)k{0..N1}所有的Sk是零,除了在k=ω2π. 但这只有在ω实际上恰好是2π首先。

一般来说,你会得到很多频谱泄漏这可以通过在 DFT 之前应用合适的窗口函数来缓解,但最终你仍然永远不会得到只有一个频率的结果,而是多个 bin 显示一些幅度。而且你的时间序列越短,这些箱子就越宽(因为它们的数量更少)。

如果存在这些问题,我们为什么还要忍受傅立叶分析呢?好吧,因为它解决了一个不同的、更复杂的问题:你从一个包含许多不同组件的信号开始,比如

sn=A0eiω0nN+A1eiω1nN+A2eiω2nN+weird aperiodic signal+noise
在这种情况下,像 Levenberg-Marquard 这样的拟合方法会遇到越来越多的问题,但傅里叶变换只是继续前进,并且仍然可以非常可靠地提取任何正弦分量的幅度。

当你设置你的k=1,你得到最低频率(不是0);所有其他频率箱都是该频率的整数倍,所以这实际上是你的频率“光栅”(如果你愿意,可以称之为分辨率)。

现在,低N,e2iπn/N旋转很快,因为你除以一个小数,所以最低频率已经很高了。带着高N,您的旋转速度要慢得多。

其他视觉上的东西:DFT 仅表示适合其长度观察的整数倍的振荡N(除了常数成分)。因此,可表示的最低频率的周期恰好适合 1 次N. 显然,对于小N,这意味着周期短,因此频率高,因此分辨率“更差”。

这与以下事实有关:具有不同但精确整数的两个正弦曲线(在某个窗口或向量长度内)是正交的,或者作为采样数据,在向量点积下总和为零。

因此,取两个频率略有不同的正弦曲线(如此之小以至于您无法一眼看出它们有什么不同)。延长两者的长度,最终在某个长度上,频率的微小差异将导致一个正弦曲线比另一个正弦曲线多经过一个周期。然后差异将非常明显,因为由于它们之间完整周期数的差异,在某些时候它们将异相 180 度,或幅度完全相反。显然不一样。

因此表明,更长的数据量(相同采样率下的更多样本)提供了更大的区分两个频率的能力。差异越小,获得完整周期差异所需的数据就越多,从而取消点积。

朝相反的方向走,很快两个中等不同的频率正弦曲线将在一些足够短的段上重叠,其差异小于铅笔标记或粉笔线宽度,因此看起来相同。(或与采样器的有限量化噪声相差不大)。导致你误认为两者只是一个。

如果您开窗,您将需要在您的样本数量上存在大约两个整数周期的差异,因为开窗会引入基向量正交性。

如果您将 DFT 视为一个(复杂的)FIR 滤波器,它与具有长度为 N 的内核的输入信号进行卷积,并且您在检查从输入信号之间的全长 N 重叠生成的最终输出之前丢弃 N-1 个输出和滤波器系数。

一个两抽头的 FIR 滤波器不能区分许多频段,而一个 2048 抽头的滤波器可以区分更多的频率,这是否具有直观的意义?

编辑:

使用以下 MATLAB 脚本生成频率扫描,执行长度为 N 个子部分的重叠窗口 FFT,并将幅度绘制为时间和频率的函数

fs = 10*100;
x = chirp(0:(1/fs):(1-1/fs), 0, 1, fs/2);
figidx = 1;
for N = [8 64]
    x_b = buffer(x, N, N-1, "nodelay");
    x_b = x_b.*hann(N);
    W = fft(eye(N));
    X = W*x_b;
    figure(figidx), 
    subplot(2,2,2)
    imagesc(real(W))
    set(gca, 'ydir', 'normal')
    title('Real(W)')
    colormap gray
    xlabel('time [frame]')
    ylabel('frequency [DFT bin]')

    subplot(2,2,3)
    plot(x)
    title('Input chirp')
    subplot(2,2,4)
    imagesc((abs(X)))
    set(gca, 'ydir', 'normal')
    title('Response')
    axis tight
    xlabel('time [frame]')
    ylabel('frequency [DFT bin]')
    figidx = figidx + 1;
end

对于 N = 8(顶部)和 N = 64(底部),我得到这些 2x2 子图,其中输入信号在左下角,DFT 矩阵的实际值在右上角,每个图的右下角显示8/64“车道”,其中上半部分是下半部分的镜像。显然,与 8 点 DFT 相比,64 点 DFT 的频率分辨率更高,因为 64 点的拖尾较少且数量较多。可能,对于这种特殊情况,可以在假设输入是单频的情况下对 8 点 DFT 进行插值,但通常不能假设这是真的。

在此处输入图像描述

这里的要点是,一个 64 个样本的 DFT 行或列包含许多在 fs/2 处给定中心频率的周期。人们会期望与大约该频率的输入很好地(唯一地)耦合。考虑到匹配的过滤器或相关器,具有长的独特模式通常比具有短模式更强大的“关键”。

我们得到从 0 (DC) 到 fs/2 的“频率”的统一部分。如果 N 较大,则每个分区更窄,正如我们所见,它也“更清晰”,这意味着我们可以解析更多的频率细节。

窗户形状的选择也很重要。尝试使用 hann 窗口注释该行并观察会发生什么。