pwelch
韦尔奇的功率谱密度估计
语法
说明
[___] = pwelch(___, 还为上述任一语法指定频率范围、频谱类型和跟踪模式。您可以指定这些输入参量的任意组合。freqRange,spectrumType,trace)
不带输出参量的 pwelch(___) 在当前图窗窗口中绘制韦尔奇 PSD 估计值或功率谱。
示例
获取一个输入信号的韦尔奇 PSD 估计值,该输入信号由角频率为 弧度/采样点的离散时间正弦信号和加性 白噪声组成。
创建一个角频率为 弧度/采样点并具有加性 白噪声的正弦波。重置随机数生成器以获得可重现的结果。信号的长度为 个采样。
rng("default")
n = 0:319;
x = cos(pi/4*n) + randn(size(n));使用默认汉明窗和 DFT 长度获取韦尔奇 PSD 估计值。默认段长度为 71 个采样,DFT 长度为 256 个点,产生 弧度/采样点的频率分辨率。由于信号是实数值信号,周期图为单边型并且有 256/2+1 个点。绘制韦尔奇 PSD 估计值。
pxx = pwelch(x); pwelch(x)

重复该计算。
将信号分成长度为 的若干段。此操作等效于将信号分成尽可能长的段,以获得接近但不超出 8 个叠加率为 50% 的段。
使用汉明窗对这些段进行加窗处理。
指定连续段之间的重叠率为 50%
为了计算 FFT,请使用 个点,其中 。
验证这两种方法是否给出相同的结果。
Nx = length(x); nsc = floor(Nx/4.5); nov = floor(nsc/2); nff = max(256,2^nextpow2(nsc)); pxxt = pwelch(x,hamming(nsc),nov,nff); maxerr = max(abs(abs(pxxt(:)) - abs(pxx(:))))
maxerr = 0
将信号分成 8 个等长的段,段之间的重叠率为 50%。指定与上一步相同的 FFT 长度。计算韦尔奇 PSD 估计值,并验证它是否与前两个过程的结果相同。
ns = 8; ov = 0.5; lsc = floor(Nx/(ns-(ns-1)*ov)); pxxt8 = pwelch(x,lsc,floor(ov*lsc),nff); maxerr8 = max(abs(abs(pxxt8(:)) - abs(pxx(:))))
maxerr8 = 0
获取一个输入信号的韦尔奇 PSD 估计值,该输入信号由角频率为 弧度/采样点的离散时间正弦信号和加性 白噪声组成。
创建一个角频率为 弧度/采样点并具有加性 白噪声的正弦波。重置随机数生成器以获得可重现的结果。信号有 512 个采样。
rng("default")
n = 0:511;
x = cos(pi/3*n) + randn(size(n));通过将信号分成长度为 132 个采样的段来获取韦尔奇 PSD 估计值。信号段乘以长度为 132 个采样的汉明窗。未指定重叠采样数,因此设置为 132/2 = 66。DFT 长度为 256 个点,产生 弧度/采样点的频率分辨率。由于信号是实数值信号,PSD 估计值为单边型并且有 256/2+1 = 129 个点。绘制 PSD 随归一化频率变化的图。
segmentLength = 132; [pxx,w] = pwelch(x,segmentLength); plot(w/pi,pow2db(pxx)) xlabel("Normalized Frequency (\times \pi rad/sample)") title("Welch Power Spectral Density Estimate")

获取一个输入信号的韦尔奇 PSD 估计值,该输入信号由角频率为 弧度/采样点的离散时间正弦信号和加性 白噪声组成。
创建一个角频率为 弧度/采样点并具有加性 白噪声的正弦波。重置随机数生成器以获得可重现的结果。信号长度为 320 个采样。
rng("default")
n = 0:319;
x = cos(pi/4*n) + randn(size(n));通过将信号分成长度为 100 个采样的段来获取韦尔奇 PSD 估计值。信号段乘以长度为 100 个采样的汉明窗。重叠采样数为 25。DFT 长度为 256 个点,产生 弧度/采样点的频率分辨率。由于信号是实数值信号,PSD 估计值为单边型并且有 256/2+1 个点。
segmentLength = 100; noverlap = 25; pxx = pwelch(x,segmentLength,noverlap); plot(pow2db(pxx)) xlabel("Frequency Samples") title("Welch Power Spectral Density Estimate")

获取一个输入信号的韦尔奇 PSD 估计值,该输入信号由角频率为 弧度/采样点的离散时间正弦信号和加性 白噪声组成。
创建一个角频率为 弧度/采样点并具有加性 白噪声的正弦波。重置随机数生成器以获得可重现的结果。信号长度为 320 个采样。
rng("default")
n = 0:319;
x = cos(pi/4*n) + randn(size(n));通过将信号分成长度为 100 个采样的段来获取韦尔奇 PSD 估计值。使用默认重叠率 50%。指定 DFT 长度为 640 个点,以使 弧度/采样点的频率对应于一个 DFT bin (bin 81)。由于信号是实数值信号,PSD 估计值为单边型并且有 640/2+1 个点。
segmentLength = 100; nfft = 640; pxx = pwelch(x,segmentLength,[],nfft); plot(pow2db(pxx)) xlabel("Frequency Points") title("Welch Power Spectral Density Estimate")

创建一个信号,该信号包含在加性 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,pow2db(pxx)) xlabel("Frequency (Hz)") ylabel("PSD (dB/Hz)")

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

重复此过程,这次计算中心化功率谱估计值。
[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"])

此示例说明置信边界与韦尔奇交叠分段平均法 (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 个采样)。
L = 200; win = hamming(L); nOverlap = 100; [pxx,f,pxxc] = pwelch(x,win,nOverlap,200,Fs,ConfidenceLevel=0.95);
绘制 WOSA PSD 估计值以及置信区间,并放大在 100 Hz 和 150 Hz 附近的感兴趣频率区域。紧靠 100 Hz 和 150 Hz 的置信边界下限显著高于 100 Hz 和 150 Hz 以外的置信边界上限。
plot(f,pow2db(pxx)) hold on plot(f,pow2db(pxxc),"-.",Color=[0.866 0.329 0]) hold off xlim([25 250]) xlabel("Frequency (Hz)") ylabel("PSD (dB/Hz)") title("Welch Estimate with 95%-Confidence Bounds")

创建一个信号,该信号包含在加性 白噪声中的一个 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");
绘制结果。在 -100 Hz 和 100 Hz 处的功率接近于 1/4 的预期功率,这是振幅为 1 的实数值正弦波的功率。与 1/4 的偏差是加性噪声造成的。
plot(f,pow2db(pxx)) xlabel("Frequency (Hz)") ylabel("Magnitude (dB)") grid

生成一个多通道信号的 1024 个采样,该信号包含在加性 高斯白噪声中叠加的三个正弦波。这些正弦波的频率为 、 和 弧度/采样点。使用韦尔奇方法估计信号的 PSD 并对其绘图。
N = 1024;
n = 0:N-1;
w = pi./[2;3;4];
rng("default")
x = cos(w*n)' + randn(length(n),3);
pwelch(x)
自 R2026a 起
在指定的目标坐标区和面板容器中绘制四个信号的韦尔奇功率谱密度 (PSD) 估计值和韦尔奇功率谱。
创建四个振荡信号,采样率为 10 kHz,持续三秒。
Fs = 10e3;
t = 0:1/Fs:3;
x1 = sinc(Fs/2.5*(t-mean(t)));
x2 = sum(cos(2*pi*600*[1 3 5 7]'.*t),1) + randn(size(t))/1e4;
x3 = exp(1j*pi*sin(4*t)*Fs/10);
x4 = chirp(t,Fs/10,t(end),Fs/2.5,"quadratic");在目标坐标区中绘制韦尔奇 PSD 估计值和功率谱
在新图窗窗口的西南角和东北角创建两个坐标区。
fig = figure; ax1 = axes(fig,Position=[0.09 0.1 0.52 0.45]); ax2 = axes(fig,Position=[0.55 0.7 0.42 0.25]);
分别在图窗的西南和东北坐标区中绘制信号 x1 和 x2 的韦尔奇 PSD 估计值和韦尔奇功率谱。使用包含 256 个采样的凯塞窗、长度为 220 个采样的重叠和 512 个 DFT 点。
g = kaiser(256,5);
ol = 220;
nfft = 512;
pwelch(x1,g,ol,nfft,Fs,Parent=ax1)
pwelch(x2,g,ol,nfft,Fs,"power",Parent=ax2)
在目标 UI 坐标区中绘制韦尔奇 PSD 估计值
在新 UI 图窗窗口的西北角创建一个坐标区。
uif = uifigure(Position=[100 100 720 540]); ax3 = uiaxes(uif,Position=[5 305 300 200]);
在图窗坐标区上绘制信号 x3 的韦尔奇 PSD 估计值。以 0 kHz 为中心显示频率。
pwelch(x3,g,ol,nfft,Fs,"centered",Parent=ax3) title(ax3,"Welch PSD in UI Axes")

在目标面板容器中绘制韦尔奇 PSD 估计值
在 UI 图窗窗口的东南角添加一个面板容器。
p = uipanel(uif,Position=[300 5 400 325], ... Title="Welch PSD in Panel Container", ... BackgroundColor="white");
在该面板容器上绘制信号 x4 的韦尔奇 PSD 估计值。将置信水平设置为 90%。
pwelch(x4,g,ol,nfft,Fs,ConfidenceLevel=0.9,Parent=p)

输入参数
输入信号,指定为向量或矩阵。如果将 x 指定为矩阵,则 pwelch 将其列视为独立通道。
示例: cos(pi/4*(0:159))+randn(1,160) 是单通道行向量信号。
示例: cos(pi./[4;2]*(0:159))'+randn(160,2) 是双通道信号。
数据类型: single | double
复数支持: 是
窗,指定为空数组 ([])、正整数或向量。
pwelch 函数将输入信号 x 分段,并使用窗计算段采样与窗值的逐元素乘积。窗值取决于您如何指定此参量。
空数组 (
[]) -pwelch使用汉明窗,其长度使得x分成八个段,段之间具有nOverlap个重叠采样。正整数 -
pwelch将x分成长度为win的段,并使用该长度的汉明窗。向量 -
pwelch将x分成与向量win长度相同的段,并使用在win中指定的窗。
如果 x 的长度无法整除分成具有 nOverlap 个重叠采样的整数段,则 pwelch 会相应地截断 x。
有关可用窗的列表,请参阅加窗法。
注意
默认汉明窗具有 42.5 dB 的旁瓣衰减,这可能会遮挡低于此值的频谱成分(相对于峰值频谱成分)。选择不同窗使您能够在分辨率(例如,使用矩形窗)和旁瓣衰减(例如,使用汉宁窗)之间进行权衡。有关更多详细信息,请参阅窗设计器。
示例: hann(N+1) 和 (1-cos(2*pi*(0:N)'/N))/2 都指定长度为 N + 1 的汉宁窗。
数据类型: single | double
重叠采样的数量,指定为空数组 ([]) 或非负整数。
空数组 (
[]) -pwelch使用生成段之间有 50% 重叠的数。如果未指定段长度,则函数将
nOverlap设置为 ⌊Nx / 4.5⌋,其中 Nx 是输入信号的长度,⌊ ⌋ 符号表示向下取整函数。此操作等效于将信号分成尽可能长的段,以获得接近但不超出 8 个重叠率为 50% 的段。非负整数 -
pwelch使用此参量中指定的采样数重叠相邻段。如果
win是标量,则nOverlap必须小于win。如果
win是向量,则nOverlap必须小于win的长度。
频率设定,指定为以下值之一:
空值
[]-pwelch使用 256 或大于等于窗长度的下一个 2 的幂中的较大者作为 DFT 点数来计算频谱估计值。正整数 -
pwelch使用在此参量中指定的 DFT 点数来计算频谱估计值。如果
freqSpec大于段长度,则pwelch用零填充段数据。如果
freqSpec小于段长度,则pwelch按freqSpec对对段进行模分区并对生成的段帧求和。
包含至少两个元素的向量 -
pwelch在freqSpec中指定的频率处计算频谱估计值。如果指定采样率
Fs,则pwelch假定freqSpec是与Fs单位相同的周期性频率。如果未指定
Fs,则pwelch假定freqSpec是以弧度/采样点为单位的归一化频率。
示例: freqSpec = 512 指定 512 个 DFT 点。
示例: freqSpec = pi./[8 4 2] 指定一个包含三个归一化频率的向量。
数据类型: single | double
采样率,指定为正标量。采样率是单位时间内的采样数。如果时间单位是秒,则采样率的单位是赫兹。
如果将
Fs指定为空数组[],则pwelch假定输入信号x的采样率为 1 Hz。如果未指定
Fs,则pwelch假定输入信号x的采样率为 2π 弧度/采样点。
PSD 估计值或功率谱的频率范围,指定为 "onesided"、"twosided" 或 "centered"。
pwelch 函数返回的 pxx 的行数和频率区间取决于在 freqRange 中指定的值,无论 DFT 点数 freqSpec 是偶数还是奇数,以及是否指定 Fs。
freqRange | freqSpec | pxx 中的行数 |
| |
|---|---|---|---|---|
|
| |||
"onesided"(如果 x 是实数值,则为默认值) | 偶数 | freqSpec/2 + 1 | [0,π] 弧度/采样点 | [0,Fs/2] 周期/单位时间 |
| 奇数 | (freqSpec + 1)/2 | [0,π) 弧度/采样点 | [0,Fs/2) 周期/单位时间 | |
"twosided"(如果 x 是复数值,则为默认值) | 偶数或奇数 | freqSpec | [0,2π) 弧度/采样点 | [0,Fs) 周期/单位时间 |
"centered" | 偶数 | freqSpec | (–π,π] 弧度/采样点 | (–Fs/2,Fs/2] 周期/单位时间 |
| 奇数 | (–π,π) 弧度/采样点 | (–Fs/2,Fs/2) 周期/单位时间 | ||
注意
如果您将
freqSpec指定为周期性频率或归一化频率的向量,则不支持此参量。如果您指定
"onesided"值,则pwelch在所有频率(除了 0 和奈奎斯特频率)上将功率乘以 2 以保持总功率。如果
x是复数值,则不支持"onesided"值。
数据类型: char | string
功率谱缩放,指定为下列值之一:
"psd"-pwelch返回功率谱密度。"power"-pwelch对 PSD 的每个估计值进行缩放(缩放量为窗的等效噪声带宽),并返回每个频率处的功率估计值。
下表显示在给定输入信号 x、窗向量 win、重叠长度 nOverlap、频率设定 freqSpec 和采样率 Fs 的情况下,在 pxx 中返回的 PSD 估计值和功率谱估计值之间的缩放关系。
| 采样率 | 缩放关系 |
|---|---|
Fs 已指定 | psd = pwelch(x,win,nOverlap,freqSpec,Fs,"psd"); pow = pwelch(x,win,nOverlap,freqSpec,Fs,"power"); pow 等效于 psd*enbw(win,Fs)。win 是窗向量。 |
Fs 未指定 | psd = pwelch(x,win,nOverlap,freqSpec,"psd"); pow = pwelch(x,win,nOverlap,freqSpec,"power"); pow 等效于 psd*enbw(win,2*pi)。 |
跟踪模式,指定为以下值之一:
"mean"-pwelch通过对每个频率 bin 上的所有段的功率谱估计值取平均值,返回每个输入通道的韦尔奇频谱估计值。"maxhold"-pwelch通过在每个频率 bin 上选取所有段上的最大功率谱值,返回每个输入通道的最大值保持频谱。"minhold"-pwelch通过在每个频率 bin 上的所有段上选择最小功率谱值,返回每个输入通道的最小值保持频谱。
PSD 估计值的覆盖概率,指定为 (0,1) 范围内的标量。
如果您指定 ConfidenceLevel=p 和 pxxc,该函数使用真实 PSD 的 p× 100% 区间估计值的上界和下界输出 pxxc。
自 R2026a 起
目标父容器,指定为 Axes 对象、UIAxes 对象或 Panel 对象。
如果指定 Parent=h,则无论是否使用输出参量调用函数,pwelch 函数都会在指定的目标父容器上绘制韦尔奇 PSD 估计值或功率谱。
有关 MATLAB® 图形中目标容器和父子关系的详细信息,请参阅图形对象层次结构。有关在 UIAxes 和 Panel 对象中使用 Parent 设计 App 的详细信息,请参阅Plot Spectral Representations of Signal in App Designer。
示例: h = axes(figure,Position=[0.1 0.1 0.6 0.5]) 定义坐标区父容器。当您指定 pwelch(x,[],[],[],Parent=h) 时,该函数在父容器 h 中绘制输入信号 x 的韦尔奇 PSD。
输出参量
PSD 估计值或功率谱,以实数值非负列向量或矩阵形式返回。
pxx的每列是x对应列的 PSD 估计值或功率谱,具体取决于您如何指定spectrumType。PSD 估计值的单位是输入信号幅值平方/单位频率。例如,如果输入数据
x的单位是伏特,您指定采样率Fs(以赫兹为单位),并假设电阻为 1 Ω,则 PSD 估计值的单位是瓦特/赫兹。功率谱的单位是输入信号的平方幅值单位。例如,如果输入数据
x的单位是伏特,并且假设电阻为 1 Ω,则 PSD 估计值的单位是瓦特。
详细信息
周期图不是广义平稳过程的真实功率谱密度的一致估计量。降低周期图方差的韦尔奇方法将输入信号分割成若干重叠段。
韦尔奇方法计算每个段的修正周期图,然后对这些估计值求平均值以产生功率谱密度的估计值。由于这是广义平稳过程,并且韦尔奇方法使用输入信号的不同段的 PSD 估计值,因此修正周期图表示真实 PSD 的近似不相关估计值,求平均值以减少变异性。
这些段通常会乘以一个窗函数(例如汉明窗),因此韦尔奇方法相当于对修正周期图进行平均。由于各段通常重叠,因此在一个段中被窗锥形化的段的开头和末尾的数据值出现在远离相邻段末尾的位置。这可以防止由于加窗而导致的信息丢失。
参考
[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® 代码。
此函数完全支持 GPU 数组。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数 (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)