主要内容

pwelch

韦尔奇的功率谱密度估计

说明

pxx = pwelch(x) 返回使用韦尔奇交叠分段平均法估计器找到的输入信号 x 的功率谱密度 (PSD) 估计值 pxx。如果 x 是向量,则它被视为单通道。如果 x 是矩阵,则会针对每列独立计算 PSD 并将其存储在 pxx 的对应列中。如果 x 是实数值,则 pxx 是单边 PSD 估计值。如果 x 是复数值,则 pxx 是双边 PSD 估计值。默认情况下,x 被分成尽可能长的段,以获得接近但不超出 8 个重叠率为 50% 的段。对每段使用一个汉明窗进行加窗处理。对各个修正周期图求平均值以获得 PSD 估计值。如果您无法将 x 的长度精确地分成重叠率为 50% 的整数段数,x 会相应地截断。

示例

pxx = pwelch(x,window) 使用输入向量或整数 window 将信号分成若干段。如果 window 是向量,则 pwelch 将信号分成与 window 长度相等的若干段。修正周期图是使用信号段乘以向量 window 来计算的。如果 window 是整数,则信号分成长度为 window 的若干段。修正周期图是使用长度为 window 的汉明窗来计算的。

示例

pxx = pwelch(x,window,noverlap) 在段之间重叠 noverlap 个采样。如果 window 是整数,则 noverlap 必须为小于 window 的正整数。如果 window 是向量,则 noverlap 必须为小于 window 长度的正整数。如果您不指定 noverlap,或将 noverlap 指定为空,则默认重叠采样数为窗长度的 50%。

示例

pxx = pwelch(x,window,noverlap,nfft) 指定要在 PSD 估计值中使用的离散傅里叶变换 (DFT) 的点数。默认 nfft 是 256 或大于段长度的下一个 2 的幂,取两者的较大者。

示例

[pxx,w] = pwelch(___) 返回归一化频率向量 w。如果 pxx 是单边 PSD 估计值,则 wnfft 为偶数时跨区间 [0,π],在 nfft 为奇数时跨区间 [0,π)。如果 pxx 是双边 PSD 估计值,则 w 跨区间 [0,2π)。

[pxx,f] = pwelch(___,fs) 返回频率向量 f,单位为每单位时间的周期数。采样率 fs 是单位时间内的采样数。如果时间单位是秒,则 f 的单位是周期/秒 (Hz)。对于实数值信号,fnfft 为偶数时跨区间 [0,fs/2],在 nfft 为奇数时跨区间 [0,fs/2)。对于复数值信号,f 跨区间 [0,fs)。fs 必须为 pwelch 的第五个输入。要输入采样率并仍使用前面可选参量的默认值,请将这些参量指定为空,即 []

示例

[pxx,w] = pwelch(x,window,noverlap,w) 返回在向量 w 中指定的归一化频率处的双边韦尔奇 PSD 估计值。向量 w 必须包含至少两个元素,否则该函数会将其解释为 nfft

[pxx,f] = pwelch(x,window,noverlap,f,fs) 返回在向量 f 中指定的频率处的双边韦尔奇 PSD 估计值。向量 f 必须包含至少两个元素,否则该函数会将其解释为 nfftf 中频率的单位为每单位时间的周期数。采样率 fs 是单位时间内的采样数。如果时间单位是秒,则 f 的单位是周期/秒 (Hz)。

[___] = pwelch(x,window,___,freqrange) 返回在 freqrange 指定的频率范围内的韦尔奇 PSD 估计值。freqrange 的有效选项是:'onesided''twosided''centered'

示例

[___] = pwelch(x,window,___,trace)trace 指定为 'maxhold' 时返回最大值保持频谱估计值,在 trace 指定为 'minhold' 时返回最小值保持频谱估计值。

示例

[___,pxxc] = pwelch(___,'ConfidenceLevel',probability)pxxc 中返回 PSD 估计值的 probability × 100% 置信区间。

示例

[___] = pwelch(___,spectrumtype)spectrumtype 指定为 'psd' 时返回 PSD 估计值,在 spectrumtype 指定为 'power' 时返回功率谱。

示例

不带输出参量的 pwelch(___) 在当前图窗窗口中绘制韦尔奇 PSD 估计值。

示例

示例

全部折叠

获取一个输入信号的韦尔奇 PSD 估计值,该输入信号由角频率为 π/4 弧度/采样点的离散时间正弦信号和加性 N(0,1) 白噪声组成。

创建一个角频率为 π/4 弧度/采样点并具有加性 N(0,1) 白噪声的正弦波。重置随机数生成器以获得可重现的结果。信号的长度为 Nx=320 个采样。

rng default

n = 0:319;
x = cos(pi/4*n)+randn(size(n));

使用默认汉明窗和 DFT 长度获取韦尔奇 PSD 估计值。默认段长度为 71 个采样,DFT 长度为 256 个点,产生 2π/256 弧度/采样点的频率分辨率。由于信号是实数值信号,周期图为单边型并且有 256/2+1 个点。绘制韦尔奇 PSD 估计值。

pxx = pwelch(x);

pwelch(x)

Figure contains an axes object. The axes object with title Welch Power Spectral Density Estimate, xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Power/frequency (dB/(rad/sample)) contains an object of type line.

重复该计算。

  • 将信号分成长度为 nsc=Nx/4.5 的若干段。此操作等效于将信号分成尽可能长的段,以获得接近但不超出 8 个叠加率为 50% 的段。

  • 使用汉明窗对这些段进行加窗处理。

  • 指定连续段之间的重叠率为 50%

  • 为了计算 FFT,请使用 max(256,2p) 个点,其中 p=log2nsc

验证这两种方法是否给出相同的结果。

Nx = length(x);
nsc = floor(Nx/4.5);
nov = floor(nsc/2);
nff = max(256,2^nextpow2(nsc));

t = pwelch(x,hamming(nsc),nov,nff);

maxerr = max(abs(abs(t(:))-abs(pxx(:))))
maxerr = 
0

将信号分成 8 个等长的段,段之间的重叠率为 50%。指定与上一步相同的 FFT 长度。计算韦尔奇 PSD 估计值,并验证它是否与前两个过程的结果相同。

ns = 8;
ov = 0.5;
lsc = floor(Nx/(ns-(ns-1)*ov));

t = pwelch(x,lsc,floor(ov*lsc),nff);

maxerr = max(abs(abs(t(:))-abs(pxx(:))))
maxerr = 
0

获取一个输入信号的韦尔奇 PSD 估计值,该输入信号由角频率为 π/3 弧度/采样点的离散时间正弦信号和加性 N(0,1) 白噪声组成。

创建一个角频率为 π/3 弧度/采样点并具有加性 N(0,1) 白噪声的正弦波。重置随机数生成器以获得可重现的结果。信号有 512 个采样。

rng default

n = 0:511;
x = cos(pi/3*n)+randn(size(n));

通过将信号分成长度为 132 个采样的段来获取韦尔奇 PSD 估计值。信号段乘以长度为 132 个采样的汉明窗。未指定重叠采样数,因此设置为 132/2 = 66。DFT 长度为 256 个点,产生 2π/256 弧度/采样点的频率分辨率。由于信号是实数值信号,PSD 估计值为单边型并且有 256/2+1 = 129 个点。将 PSD 绘制为归一化频率的函数。

segmentLength = 132;
[pxx,w] = pwelch(x,segmentLength);

plot(w/pi,10*log10(pxx))
xlabel('\omega / \pi')

Figure contains an axes object. The axes object with xlabel omega blank / blank pi contains an object of type line.

获取一个输入信号的韦尔奇 PSD 估计值,该输入信号由角频率为 π/4 弧度/采样点的离散时间正弦信号和加性 N(0,1) 白噪声组成。

创建一个角频率为 π/4 弧度/采样点并具有加性 N(0,1) 白噪声的正弦波。重置随机数生成器以获得可重现的结果。信号长度为 320 个采样。

rng default

n = 0:319;
x = cos(pi/4*n)+randn(size(n));

通过将信号分成长度为 100 个采样的段来获取韦尔奇 PSD 估计值。信号段乘以长度为 100 个采样的汉明窗。重叠采样数为 25。DFT 长度为 256 个点,产生 2π/256 弧度/采样点的频率分辨率。由于信号是实数值信号,PSD 估计值为单边型并且有 256/2+1 个点。

segmentLength = 100;
noverlap = 25;
pxx = pwelch(x,segmentLength,noverlap);

plot(10*log10(pxx))

Figure contains an axes object. The axes object contains an object of type line.

获取一个输入信号的韦尔奇 PSD 估计值,该输入信号由角频率为 π/4 弧度/采样点的离散时间正弦信号和加性 N(0,1) 白噪声组成。

创建一个角频率为 π/4 弧度/采样点并具有加性 N(0,1) 白噪声的正弦波。重置随机数生成器以获得可重现的结果。信号长度为 320 个采样。

rng default

n = 0:319;
x = cos(pi/4*n) + randn(size(n));

通过将信号分成长度为 100 个采样的段来获取韦尔奇 PSD 估计值。使用默认重叠率 50%。指定 DFT 长度为 640 个点,以使 π/4 弧度/采样点的频率对应于一个 DFT bin (bin 81)。由于信号是实数值信号,PSD 估计值为单边型并且有 640/2+1 个点。

segmentLength = 100;
nfft = 640;
pxx = pwelch(x,segmentLength,[],nfft);

plot(10*log10(pxx))
xlabel('rad/sample')
ylabel('dB / (rad/sample)')

Figure contains an axes object. The axes object with xlabel rad/sample, ylabel dB / (rad/sample) contains an object of type line.

创建一个信号,该信号包含在加性 N(0,1) 白噪声中的一个 100 Hz 正弦波。重置随机数生成器以获得可重现的结果。采样率为 1 kHz,信号持续时间为 5 秒。

rng default

fs = 1000;
t = 0:1/fs:5-1/fs;
x = cos(2*pi*100*t) + randn(size(t));

获取上述信号的韦尔奇交叠分段平均法 PSD 估计值。使用一个长度为 500 个采样的段,其中有 300 个重叠采样。使用 500 个 DFT 点,以使 100 Hz 恰好位于一个 DFT bin 上。输入采样率以输出以 Hz 为单位的频率向量。绘制结果。

[pxx,f] = pwelch(x,500,300,500,fs);

plot(f,10*log10(pxx))

xlabel('Frequency (Hz)')
ylabel('PSD (dB/Hz)')

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel PSD (dB/Hz) contains an object of type line.

创建一个信号,该信号由三个含噪正弦波和一个以 200 kHz 进行 0.1 秒采样的啁啾组成。这些正弦波的频率分别为 1 kHz、10 kHz 和 20 kHz。这些正弦波具有不同振幅和噪声电平。无噪声啁啾的频率从 20 kHz 开始,并在采样期间线性增大到 30 kHz。

Fs = 200e3; 
Fc = [1 10 20]'*1e3; 
Ns = 0.1*Fs;

t = (0:Ns-1)/Fs;
x = [1 1/10 10]*sin(2*pi*Fc*t)+[1/200 1/2000 1/20]*randn(3,Ns);
x = x+chirp(t,20e3,t(end),30e3);

计算信号的韦尔奇 PSD 估计值以及最大值保持和最小值保持频谱。绘制结果。

[pxx,f] = pwelch(x,[],[],[],Fs);
pmax = pwelch(x,[],[],[],Fs,'maxhold');
pmin = pwelch(x,[],[],[],Fs,'minhold');

plot(f,pow2db(pxx))
hold on
plot(f,pow2db([pmax pmin]),':')
hold off
xlabel('Frequency (Hz)')
ylabel('PSD (dB/Hz)')
legend('pwelch','maxhold','minhold')

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel PSD (dB/Hz) contains 3 objects of type line. These objects represent pwelch, maxhold, minhold.

重复此过程,这次计算中心化功率谱估计值。

[pxx,f] = pwelch(x,[],[],[],Fs,'centered','power');
pmax = pwelch(x,[],[],[],Fs,'maxhold','centered','power');
pmin = pwelch(x,[],[],[],Fs,'minhold','centered','power');

plot(f,pow2db(pxx))
hold on
plot(f,pow2db([pmax pmin]),':')
hold off
xlabel('Frequency (Hz)')
ylabel('Power (dB)')
legend('pwelch','maxhold','minhold')

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Power (dB) contains 3 objects of type line. These objects represent pwelch, maxhold, minhold.

此示例说明置信边界与韦尔奇交叠分段平均法 (WOSA) PSD 估计值的用法。在韦尔奇估计值中,如果某个频率的置信边界下限超出周围 PSD 估计值的置信边界上限,则清楚地表明时间序列中存在显著的振荡,虽然这不是统计意义的必要条件。

创建一个信号,该信号包含在加性白 N(0,1) 噪声中叠加的 100 Hz 和 150 Hz 正弦波。这两个正弦波的振幅为 1。采样率为 1 kHz。重置随机数生成器以获得可重现的结果。

rng default
fs = 1000;
t = 0:1/fs:1-1/fs;
x = cos(2*pi*100*t)+sin(2*pi*150*t)+randn(size(t));

获取具有 95% 置信边界的 WOSA 估计值。将段长度设置为 200 个采样,并使段重叠 50%(100 个采样)。绘制 WOSA PSD 估计值以及置信区间,并放大在 100 Hz 和 150 Hz 附近的感兴趣频率区域。

L = 200;
noverlap = 100;
[pxx,f,pxxc] = pwelch(x,hamming(L),noverlap,200,fs,...
    'ConfidenceLevel',0.95);

plot(f,10*log10(pxx))
hold on
plot(f,10*log10(pxxc),'-.')
hold off

xlim([25 250])
xlabel('Frequency (Hz)')
ylabel('PSD (dB/Hz)')
title('Welch Estimate with 95%-Confidence Bounds')

Figure contains an axes object. The axes object with title Welch Estimate with 95%-Confidence Bounds, xlabel Frequency (Hz), ylabel PSD (dB/Hz) contains 3 objects of type line.

紧靠 100 Hz 和 150 Hz 的置信边界下限显著高于 100 Hz 和 150 Hz 以外的置信边界上限。

创建一个信号,该信号包含在加性 N(0,1/4) 白噪声中的一个 100 Hz 正弦波。重置随机数生成器以获得可重现的结果。采样率为 1 kHz,信号持续时间为 5 秒。

rng default

fs = 1000;
t = 0:1/fs:5-1/fs;

noisevar = 1/4;
x = cos(2*pi*100*t)+sqrt(noisevar)*randn(size(t));

使用韦尔奇方法获取以 DC 为中心的功率谱。使用 500 个采样(具有 300 个重叠采样)的段长度和 500 个点的 DFT 长度。绘制结果。

[pxx,f] = pwelch(x,500,300,500,fs,'centered','power');

plot(f,10*log10(pxx))
xlabel('Frequency (Hz)')
ylabel('Magnitude (dB)')
grid

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Magnitude (dB) contains an object of type line.

您可以看到在 -100 Hz 和 100 Hz 处的功率接近于 1/4 的预期功率,这是振幅为 1 的实数值正弦波的功率。与 1/4 的偏差是加性噪声造成的。

生成一个多通道信号的 1024 个采样,该信号包含在加性 N(0,1) 高斯白噪声中叠加的三个正弦波。这些正弦波的频率为 π/2π/3π/4 弧度/采样点。使用韦尔奇方法估计信号的 PSD 并对其绘图。

N = 1024;
n = 0:N-1;

w = pi./[2;3;4];
x = cos(w*n)' + randn(length(n),3);

pwelch(x)

Figure contains an axes object. The axes object with title Welch Power Spectral Density Estimate, xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Power/frequency (dB/(rad/sample)) contains 3 objects of type line.

输入参数

全部折叠

输入信号,指定为行向量或列向量,或指定为矩阵。如果 x 是矩阵,则其列被视为独立通道。

示例: cos(pi/4*(0:159))+randn(1,160) 是单通道行向量信号。

示例: cos(pi./[4;2]*(0:159))'+randn(160,2) 是双通道信号。

数据类型: single | double
复数支持:

窗,指定为行向量或列向量或整数。如果 window 是向量,则 pwelchx 分成与 window 长度相等的重叠段,然后将每个信号段与在 window 中指定的向量相乘。如果 window 是整数,则 pwelch 分成长度等于整数值的若干段,并使用相同长度的汉明窗。如果 x 的长度无法精确地分成具有 noverlap 个重叠采样的整数段,x 会相应地截断。如果您将 window 指定为空,则使用默认汉明窗来获得 x 的 8 个段,这些段之间具有 noverlap 个重叠采样。

注意

默认汉明窗具有 42.5 dB 的旁瓣衰减,这可能会遮挡低于此值的频谱成分(相对于峰值频谱成分)。选择不同窗使您能够在分辨率(例如使用矩形窗)和旁瓣衰减(例如使用汉宁窗)之间进行权衡。有关更多详细信息,请参阅窗设计器

数据类型: single | double

重叠采样的数量,指定为小于 window 长度的正整数。如果您省略 noverlap 或将 noverlap 指定为空,则使用一个值来获得段之间 50% 的重叠率。

DFT 点数,指定为正整数。对于实数值输入信号 x,如果 nfft 是偶数,PSD 估计值 pxx 的长度为 (nfft/2 + 1);如果 nfft 是奇数,则为 (nfft + 1)/2。对于复数值输入信号 x,PSD 估计值的长度始终为 nfft。如果 nfft 指定为空,则使用默认 nfft

如果 nfft 大于段长度,则数据用零填充。如果 nfft 小于段长度,则使用 datawrap 对段进行绕回处理以使长度等于 nfft

数据类型: single | double

采样率,指定为正标量。采样率是单位时间内的采样数。如果时间单位是秒,则采样率的单位是赫兹。

归一化频率,指定为包含至少两个元素的行向量或列向量。归一化频率的单位为弧度/采样点。

示例: w = [pi/4 pi/2]

数据类型: double | single

频率,指定为包含至少两个元素的行向量或列向量。频率的单位为每单位时间的周期数。单位时间由采样率 fs 指定。如果 fs 的单位是采样/秒,则 f 的单位是 Hz。

示例: fs = 1000; f = [100 200]

数据类型: double | single

PSD 估计值的频率范围,指定为 'onesided''twosided''centered'。对于实数值信号,默认值为 'onesided';对于复数值信号,默认值为 'twosided'。每个选项对应的频率范围为:

  • 'onesided' - 返回实数值输入信号 x 的单边 PSD 估计值。如果 nfft 是偶数,则 pxx 的长度为 nfft/2 + 1,并在区间 [0,π] 弧度/采样点上计算。如果 nfft 是奇数,则 pxx 的长度为 (nfft + 1)/2,区间为 [0,π) 弧度/采样点。当 fs 为可选指定时,如果长度 nfft 为偶数,则对应的区间为 [0,fs/2] 周期/单位时间;如果为奇数,则为 [0,fs/2) 周期/单位时间。

    函数在所有频率(除了 0 和奈奎斯特频率)上将功率乘以 2 以保持总功率。

  • 'twosided' - 对于实数值或复数值输入 x,返回双边 PSD 估计值。在这种情况下,pxx 具有长度 nfft,并在区间 [0,2π) 弧度/采样点上计算。如果选择指定 fs,则区间为 [0,fs) 周期/单位时间。

  • 'centered' - 对于实数值或复数值输入 x,返回中心化双边 PSD 估计值。在这种情况下,pxx 具有长度 nfft,对于偶数长度 nfft,在区间 (–π,π] 弧度/采样点上计算;对于奇数长度 nfft,在 (–π,π) 弧度/采样点上计算。如果选择指定 fs,则当长度 nfft 为偶数时,对应的区间为 (–fs/2, fs/2] 周期/单位时间;当长度为奇数时,则为 (–fs/2, fs/2) 周期/单位时间。

如果您指定频率向量 wf 以及 freqrange 作为输入,则 pwelch 会忽略 freqrange

数据类型: char | string

功率谱缩放,指定为 'psd''power' 之一。省略 spectrumtype 或指定 'psd' 会返回功率谱密度。指定 'power' 会按窗的等效噪声带宽对每个 PSD 估计值进行缩放。使用 'power' 选项可获得每个频率上的功率估计值。

跟踪模式,指定为 'mean''maxhold''minhold' 之一。默认值为 'mean'

  • 'mean' - 返回每个输入通道的韦尔奇频谱估计值。pwelch 通过对所有段的功率谱估计值求平均值来计算每个频率 bin 的韦尔奇频谱估计值。

  • 'maxhold' - 返回每个输入通道的最大值保持频谱。pwelch 通过保留所有段的功率谱估计值中的最大值来计算每个频率 bin 上的最大值保持频谱。

  • 'minhold' - 返回每个输入通道的最小值保持频谱。pwelch 通过保留所有段的功率谱估计值中的最小值来计算每个频率 bin 上的最小值保持频谱。

真实 PSD 的覆盖概率,指定为范围 (0,1) 内的标量。输出 pxxc 包含真实 PSD 的 probability × 100% 区间估计值的下界和上界。

输出参量

全部折叠

PSD 估计值,以实数值非负列向量或矩阵形式返回。pxx 的每列是 x 的对应列的 PSD 估计值。PSD 估计值的单位是每单位频率的时间序列数据的平方幅值单位。例如,如果输入数据的单位是伏特,则 PSD 估计值的单位是每单位频率的平方伏特的单位。对于以伏特为单位的时间序列,如果您假设电阻为 1 Ω 并以赫兹为单位指定采样率,则 PSD 估计值的单位是瓦特/赫兹。

归一化频率,以实数值列向量形式返回。如果 pxx 是单边 PSD 估计值,则 wnfft 为偶数时跨区间 [0,π],在 nfft 为奇数时跨区间 [0,π)。如果 pxx 是双边 PSD 估计值,则 w 跨区间 [0,2π)。对于以 DC 为中心的 PSD 估计值,wnfft 为偶数时跨区间 (–π,π],在 nfft 为奇数时跨区间 (–π,π)

周期性频率,以实数值列向量形式返回。对于单边 PSD 估计值,fnfft 为偶数时跨区间 [0,fs/2],在 nfft 为奇数时跨区间 [0,fs/2)。对于双边 PSD 估计值,f 跨区间 [0,fs)。对于以 DC 为中心的 PSD 估计值,对于偶数长度 nfftf 跨区间 (–fs/2, fs/2] 周期/单位时间;对于奇数长度 nfft,跨 (–fs/2, fs/2) 周期/单位时间。

置信边界,以具有实数值元素的矩阵形式返回。矩阵的行大小等于 PSD 估计值 pxx 的长度。pxxc 的列数是 pxx 的两倍。奇数列包含置信区间的下界,偶数列包含上界。因此,pxxc(m,2*n-1) 是下置信边界,pxxc(m,2*n) 是对应于估计值 pxx(m,n) 的置信边界上限。置信区间的覆盖概率由 probability 输入的值确定。

数据类型: single | double

详细信息

全部折叠

参考

[1] Hayes, Monson H. Statistical Digital Signal Processing and Modeling. New York: John Wiley & Sons, 1996.

[2] Stoica, Petre, and Randolph Moses. Spectral Analysis of Signals. Upper Saddle River, NJ: Prentice Hall, 2005.

扩展功能

全部展开

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2006a 之前推出

全部展开