为什么 DFT 频率桶需要除以采样周期?

信息处理 matlab fft 自由度
2022-02-24 02:59:58

编辑:这是我在这个社区的第一篇文章。我确信我的反对者有充分的理由这样做,但是有人可以发表评论并告诉我如何更好地格式化我的问题吗?

--

我有一个几乎有意义的 DFT 算法。问题是当我去绘制频率响应时。出于某种原因,频率响应会乘以采样周期(参见第一张图片)。

了解这一点后,我可以通过将频率响应 X 轴除以采样周期来修复它(参见第二张图片),但我不明白为什么这是一个问题。

代码发布在下面 - 谁能解释我错过了什么?(示例使用 1 Hz 正弦波)

以下是我认为它应该如何工作: 在此处输入图像描述

但这是我实际上必须做的才能让它工作: 在此处输入图像描述

x_t = sin( 2 * pi * t);     % Input: 1 Hz Sinusoid
s_f = zeros(N,length(x_t)); % Output: Freq spectrum      

%%%% init params
    T    = 4;     % (sec) time window
    dt   = 0.1;   % (sec) sample time

%%%% init comp
        N = T / dt;          % (ct) num samples
        n = 0 : N - 1;       % (ct) bucket index vector
        t = 0 : dt : T - dt; % (sec) time vector
smpl_freq = 1 / dt;          % (Hz) sampling frequency
 freq_res = smpl_freq / N;   % (Hz) frequency resolution
        f = n * freq_res;    % (Hz) freq. bucket vector
        b = 2*pi*(f/N) .* n.';

    anlyz_fn = cos(-b) + i * sin(-b);

%%%% run DFT
for k = 1 : N
    val = 2 * sum(anlyz_fn(k,:) * x_t.');
    s_f(k) = val;
end

%%%% Plot Results
subplot(2,1,1);
plot(t, x_t);

subplot(2,1,2);
stem(f(1:N)/T , abs(s_f(1:N))/N);
1个回答

我不知道你为什么被否决。这实际上是一个与规范化约定有关的非常相关的问题。

最传统的 DFT 公式是这样的:

X[k]=n=0N1x[n]ei2πNnk

1/N规范化形式是

X[k]=1Nn=0N1x[n]ei2πNnk

1/N规范化形式是

X[k]=1Nn=0N1x[n]ei2πNnk

非常喜欢使用1/N标准化版本。这使得 bin 值按您预期的方式工作。它还使整个整数频率 bin 计数的预期 bin 值保持不变,并且泄漏值具有可比性。

如果您不申请1/N在正向 DFT 中,您需要在反向 DFT 中获取原始信号。如果你把1/N在 DFT 上,则逆不需要重新缩放(并且 bin 值用作连续傅立叶级数的系数)。

1/N是“正确的数学”,因为它进行正向和反向 DFT 酉矩阵乘法。是的,没有人这样做。

归根结底,我认为1/N规范化应该是标准约定,我使用该定义编写所有博客文章。

顺便说一句,你会得到一个数量级1/2对于纯整数音调1/N归一化的 DFT。另一半在圆的另一边。