使用 Welch 方法的 PSD 幅度

信息处理 matlab fft 离散信号 功率谱密度
2022-02-17 18:27:15

我在使用 PSD 计算获得一致的结果时遇到了一些麻烦。如果我只取一个基本的正弦波

fs = 20000;
len = 16384;
fsig = 1000;
Sig = 1.5 * sin( (1:len) * 2 * pi * fsig / fs);
fsig = 700;
Sig = Sig + 0.9 * sin( (1:len) * 2 * pi * fsig / fs);

我使用 MATLAB 的以下两个 Welch 函数运行它pwelch

[matWelchD1, matWelchF1] = pwelch(Sig, length(Sig), 0, [], fs);
[matWelchD2, matWelchF2] = pwelch(Sig, ceil(length(Sig/2)), 0, [], fs);

峰值我很想将频率泄漏归咎于频率排列方式,并且对此有一些支持,因为峰值的基数要窄得多,但我在具有宽带频率的 FFT 的实际数据中看到了类似的结果。1 kHz0.650.260.65

任何人都知道为什么这两种实现会有所不同?

1个回答

您的值丢失。假设您在奈奎斯特采样率以上工作(即),我得到以下结果:fsfs>2fsig

fs = 20000;
len = 16384;
fsig = 1000;
Sig = 1.5 * sin( (1:len) * 2 * pi * fsig / fs);
fsig = 700;
Sig = Sig + 0.9 * sin( (1:len) * 2 * pi * fsig / fs);

[matWelchD1, matWelchF1] = pwelch(Sig, length(Sig), 0, [], fs);
[matWelchD2, matWelchF2] = pwelch(Sig, ceil(length(Sig)/2), 0, [], fs);

subplot(2,1,1);
plot(matWelchF1, (matWelchD1), '-o'); grid;

subplot(2,1,2);
plot(matWelchF2, (matWelchD2), '-o'); grid;

df1 = matWelchF1(2) - matWelchF1(1);
df2 = matWelchF2(2) - matWelchF2(1);

df1
df2

输出:

df1 =

    1.2207


df2 =

    2.4414

程序输出

如您所见,两个频率都在图中很好地表示。

关于窗口长度的另一条评论(即 pwelch 的第二个参数):它决定了信号被划分成的部分有多大。每个部分乘以一个汉明窗,然后进行 FFT。之后,将所有 FFT 的值相加,得出 PSD 估计值。

即,将信号长度作为窗口长度,将导致单个部分。对于您的固定信号,这很好,但实际上您可能希望有一个较小的值,或者将参数排除在外(或使用空向量[]),以便可以更准确地估计 PSD。

如您所见,不同的窗口长度会创建不同数量的频率样本:窗口越长,频率样本越多。注意 pwelch 计算功率谱密度,即每赫兹的功率。为了获得频率的能量,您需要乘以每个 bin 的带宽:

>> sum(matWelchD1) * (matWelchF1(2)-matWelchF1(1))

ans =

    1.5300

>> sum(matWelchD2) * (matWelchF2(2)-matWelchF2(1))

ans =

    1.5300

两个 PSD 包含相同的总能量。由于第一个 PSD 中的频率样本彼此更接近,因此 PSD 对于每个频率都有更高的峰值(以提供相同的总功率)。