您的值丢失。假设您在奈奎斯特采样率以上工作(即),我得到以下结果:fsfs>2∗fsig
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 对于每个频率都有更高的峰值(以提供相同的总功率)。