主要内容

periodogram

周期图功率谱密度估计值

说明

pxx = periodogram(x) 返回使用矩形窗找到的输入信号 x 的周期图功率谱密度 (PSD) 估计值 pxx。如果 x 是向量,则它被视为单通道。如果 x 是矩阵,则会针对每列独立计算 PSD 并将其存储在 pxx 的对应列中。如果 x 是实数值,则 pxx 是单边 PSD 估计值。如果 x 是复数值,则 pxx 是双边 PSD 估计值。离散傅里叶变换 (DFT) 中的点数 nfft 是 256 或大于信号长度的下一个 2 的幂,取两者中的最大值。

示例

pxx = periodogram(x,window) 使用窗 window 返回修正周期图 PSD 估计值。window 是与 x 长度相同的向量。

示例

pxx = periodogram(x,window,nfft) 在离散傅里叶变换 (DFT) 中使用 nfft 个点。如果 nfft 大于信号长度,则 x 会零填充到长度 nfft。如果 nfft 小于信号长度,则信号以 nfft 为模循环并使用 datawrap 求和。例如,如果输入信号为 [1 2 3 4 5 6 7 8]nfft 等于 4,则会生成 sum([1 5; 2 6; 3 7; 4 8],2) 的周期图。

示例

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

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

示例

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

示例

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

示例

[___] = periodogram(x,window,___,freqrange) 返回在 freqrange 指定的频率范围内的周期图。freqrange 的有效选项是:'onesided''twosided''centered'

示例

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

示例

[rpxx,f] = periodogram(___,'reassigned') 将每个 PSD 估计值重新分配给最接近其能量中心的频率。rpxx 包含重新分配给 f 的每个元素的估计值之和。

[rpxx,f,pxx,fc] = periodogram(___,'reassigned') 还返回非重新分配的 PSD 估计值 pxx 和能量中心频率 fc。如果您使用 'reassigned' 标志,则无法指定 probability 置信区间。

示例

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

示例

不带输出参量的 periodogram(___) 在当前图窗窗口中绘制周期图 PSD 估计值或功率谱。

示例

示例

全部折叠

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

创建一个角频率为 π/4 弧度/采样点并具有加性 N(0,1) 白噪声的正弦波。信号长度为 320 个采样。使用默认矩形窗和 DFT 长度获取周期图。DFT 长度是大于信号长度的下一个 2 的幂,或 512 个点。由于信号是实数值且具有偶数长度,周期图是单边周期图,并且有 512/2+1 个点。

n = 0:319;
x = cos(pi/4*n)+randn(size(n));
[pxx,w] = periodogram(x);
plot(w,10*log10(pxx))

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

使用 periodogram 且以无输出形式重复绘图。

periodogram(x)

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

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

创建一个角频率为 π/4 弧度/采样并具有加性 N(0,1) 白噪声的正弦波。信号长度为 320 个采样。使用汉明窗和默认 DFT 长度获取修正周期图。DFT 长度是大于信号长度的下一个 2 的幂,或 512 个点。由于信号是实数值且具有偶数长度,周期图是单边周期图,并且有 512/2+1 个点。

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

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

获取一个输入信号的周期图,该输入信号由角频率为 π/4 弧度/采样点的离散时间正弦信号和加性 N(0,1) 白噪声组成。使用等于信号长度的 DFT 长度。

创建一个角频率为 π/4 弧度/采样并具有加性 N(0,1) 白噪声的正弦波。信号长度为 320 个采样。使用默认矩形窗和等于信号长度的 DFT 长度获取周期图。由于信号是实数值信号,默认返回单边周期图,长度等于 320/2+1。

n = 0:319;
x = cos(pi/4*n)+randn(size(n));
nfft = length(x);
periodogram(x,[],nfft)

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

获取在 1700 年至 1987 年间每年采样的 Wolf(相对太阳黑子)数量数据的周期图。

加载相对太阳黑子数量数据。使用默认矩形窗和 DFT 点数(此示例中为 512)获取周期图。这些数据的采样率为 1 采样/年。绘制周期图。

load sunspot.dat
relNums=sunspot(:,2);

[pxx,f] = periodogram(relNums,[],[],1);

plot(f,10*log10(pxx))
xlabel('Cycles/Year')
ylabel('dB / (Cycles/Year)')
title('Periodogram of Relative Sunspot Number Data')

Figure contains an axes object. The axes object with title Periodogram of Relative Sunspot Number Data, xlabel Cycles/Year, ylabel dB / (Cycles/Year) contains an object of type line.

您在前面的图窗中看到,在周期图中大约 0.1 周期/年处有一个峰值,这表明周期大约为 10 年。

获取一个输入信号的周期图,该输入信号由处于加性 N(0,1) 白噪声中的角频率为 π/4π/2 弧度/采样点的两个离散时间正弦信号组成。获取在 π/4π/2 弧度/采样点处的双边周期图估计值。将结果与单边周期图进行比较。

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

[pxx,w] = periodogram(x,[],[pi/4 pi/2]);
pxx
pxx = 1×2

   14.0589    2.8872

[pxx1,w1] = periodogram(x);
plot(w1/pi,pxx1,w/pi,2*pxx,'o')
legend('pxx1','2 * pxx')
xlabel('\omega / \pi')

Figure contains an axes object. The axes object with xlabel omega blank / blank pi contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent pxx1, 2 * pxx.

获得的周期图值是单边周期图中值的 1/2。当您在一组特定频率处计算周期图时,输出是双边估计值。

创建一个信号,该信号由处于 N(0,1) 加性白噪声中频率为 100 和 200 Hz 的两个正弦波组成。采样频率为 1 kHz。获取在 100 和 200 Hz 处的双边周期图。

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

freq = [100 200];
pxx = periodogram(x,[],freq,fs)
pxx = 1×2

    0.2647    0.2313

以下示例说明置信边界与周期图的用法。在周期图中,如果某个频率的置信边界下限超出周围 PSD 估计值的置信边界上限,则清楚地表明时间序列中存在显著的振荡,虽然这不是统计意义的必要条件。

创建一个信号,该信号包含在加性白 N(0,1) 噪声中叠加的 100 Hz 和 150 Hz 正弦波。这两个正弦波的振幅为 1。采样频率为 1 kHz。

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

获取具有 95% 置信边界的周期图 PSD 估计值。绘制周期图及置信区间,并放大在 100 Hz 和 150 Hz 附近的感兴趣频率区域。

[pxx,f,pxxc] = periodogram(x,rectwin(length(x)),length(x),fs,...
    'ConfidenceLevel',0.95);

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

xlim([85 175])
xlabel('Hz')
ylabel('dB/Hz')
title('Periodogram with 95%-Confidence Bounds')

Figure contains an axes object. The axes object with title Periodogram with 95%-Confidence Bounds, xlabel Hz, ylabel dB/Hz contains 3 objects of type line.

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

获取处于加性 N(0,1) 噪声中的 100 Hz 正弦波的周期图。数据以 1 kHz 的频率采样。使用 'centered' 选项获取以 DC 为中心的周期图并绘制结果。

fs = 1000;
t = 0:0.001:1-0.001;
x = cos(2*pi*100*t)+randn(size(t));
periodogram(x,[],length(x),fs,'centered')

Figure contains an axes object. The axes object with title Power Spectral Density, xlabel Frequency (Hz), ylabel Power/frequency (dB/Hz) contains an object of type line.

生成一个由嵌入在高斯白噪声中的 200 Hz 正弦波组成的信号。该信号在 1 kHz 下采样 1 秒。噪声具有方差 0.01²。重置随机数生成器以获得可重现的结果。

rng('default')

Fs = 1000;
t = 0:1/Fs:1-1/Fs;
N = length(t);
x = sin(2*pi*t*200)+0.01*randn(size(t));

使用 FFT 计算信号的功率谱,按信号长度归一化。正弦波是分 bin 形式,因此所有功率都集中在单个频率采样中。绘制单边频谱。放大到峰值附近的区域。

q = fft(x,N);
ff = 0:Fs/N:Fs-Fs/N;

ffts = q*q'/N^2
ffts = 
0.4997
ff = ff(1:floor(N/2)+1);
q = q(1:floor(N/2)+1);

stem(ff,abs(q)/N,'*')
axis([190 210 0 0.55])

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

使用 periodogram 计算信号的功率谱。指定一个汉宁窗和 1024 的 FFT 长度。找出在 200 Hz 处的估计功率与实际值之间的百分比差异。

wind = hann(N);

[pun,fr] = periodogram(x,wind,1024,Fs,'power');

hold on
stem(fr,pun)

Figure contains an axes object. The axes object contains 2 objects of type stem.

periodogErr = abs(max(pun)-ffts)/ffts*100
periodogErr = 
4.7349

重新计算功率谱,但这次使用重排。绘制新估计值,并将其最大值与 FFT 值进行比较。

[pre,ft,pxx,fx] = periodogram(x,wind,1024,Fs,'power','reassigned');

stem(fx,pre)
hold off
legend('Original','Periodogram','Reassigned')

Figure contains an axes object. The axes object contains 3 objects of type stem. These objects represent Original, Periodogram, Reassigned.

reassignErr = abs(max(pre)-ffts)/ffts*100
reassignErr = 
0.0779

使用 'power' 选项估计在特定频率处正弦波的功率。

创建一个在 1 kHz 下且持续一秒采样的 100 Hz 正弦波。正弦波的振幅为 1.8,等效于功率为 1.8²/2 = 1.62。使用 'power' 选项估计功率。

fs = 1000;
t = 0:1/fs:1-1/fs;
x = 1.8*cos(2*pi*100*t);
[pxx,f] = periodogram(x,hamming(length(x)),length(x),fs,'power');
[pwrest,idx] = max(pxx);
fprintf('The maximum power occurs at %3.1f Hz\n',f(idx))
The maximum power occurs at 100.0 Hz
fprintf('The power estimate is %2.2f\n',pwrest)
The power estimate is 1.62

生成一个多通道信号的 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);

periodogram(x)

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

创建一个函数 periodogram_data.m,该函数使用窗返回输入信号的修正周期图功率谱密度 (PSD) 估计值。该函数指定离散傅里叶变换点数等于输入信号的长度。

type periodogram_data
function [pxx,f] = periodogram_data(inputData,window)
%#codegen
nfft = length(inputData);
[pxx,f] = periodogram(inputData,window,nfft);
end

使用 codegen (MATLAB Coder) 生成一个 MEX 函数。

  • 函数中的 %#codegen 指令指示 MATLAB® 代码用于代码生成。

  • -args 选项指定示例参量,这些参量定义 MEX 文件输入的大小、类和复/实性。对于此示例,将 inputData 指定为 1024×1 双精度随机向量,将 window 指定为长度为 1024 的汉明窗。在对 MEX 函数的后续调用中,使用长度为 1024 个采样的输入信号和窗。

  • 如果您要使 MEX 函数具有不同名称,请使用 -o 选项。

  • 如果您要查看代码生成报告,请在 codegen 命令的末尾添加 -report 选项。

codegen periodogram_data -args {randn(1024,1),hamming(1024)}
Code generation successful.

使用周期图函数和您生成的 MEX 函数计算一个长度为 1024 个采样的含噪正弦波的 PSD 估计值。指定正弦波归一化频率为 2π/5 弧度/采样点和汉宁窗。绘制两个估计值以验证它们是否一致。

N = 1024;
x = 2*cos(2*pi/5*(0:N-1)') + randn(N,1);
periodogram(x,hann(N))
[pxMex,fMex] = periodogram_data(x,hann(N));
hold on
plot(fMex/pi,pow2db(pxMex),':','Color',[0 0.4 0])
hold off
grid on
legend('periodogram','MEX function')

Figure contains an axes object. The axes object with title Periodogram Power Spectral Density Estimate, xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Power/frequency (dB/(rad/sample)) contains 2 objects of type line. These objects represent periodogram, MEX function.

输入参数

全部折叠

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

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

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

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

窗,指定为与输入信号长度相同的行向量或列向量。如果您将 window 指定为空,则 periodogram 使用矩形窗。如果您指定 'reassigned' 标志和空 window,则函数使用 β = 38 的凯塞窗。

注意

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

数据类型: single | double

DFT 点数,指定为正整数。对于实数值输入信号 x,如果 nfft 是偶数,PSD 估计值 pxx 的长度为 (nfft/2 + 1);如果 nfft 是奇数,则为 (nfft + 1)/2。对于复数值输入信号 x,PSD 估计值的长度始终为 nfft。如果 nfft 指定为空,则使用默认 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 作为输入,则 periodogram 会忽略 freqrange

数据类型: char | string

功率谱缩放,指定为 'psd''power'。要返回功率谱密度,请省略 spectrumtype 或指定 'psd'。要获得在每个频率处的功率估计值,请改用 'power'。指定 'power' 会按窗的等效噪声带宽对每个 PSD 估计值进行缩放,但使用 'reassigned' 标志时除外。

数据类型: char | string

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

输出参量

全部折叠

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

周期性频率,以实数值列向量形式返回。对于单边 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) 周期/单位时间。

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

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

数据类型: single | double

重新分配的 PSD 估计值,以实数值非负列向量或矩阵形式返回。rpxx 的每列是 x 的对应列的重新分配的 PSD 估计值。

能量中心频率,指定为向量或矩阵。

详细信息

全部折叠

参考

[1] Auger, François, and Patrick Flandrin. "Improving the Readability of Time-Frequency and Time-Scale Representations by the Reassignment Method." IEEE® Transactions on Signal Processing. Vol. 43, May 1995, pp. 1068–1089.

[2] Fulop, Sean A., and Kelly Fitz. "Algorithms for computing the time-corrected instantaneous frequency (reassigned) spectrogram, with applications." Journal of the Acoustical Society of America. Vol. 119, January 2006, pp. 360–371.

扩展功能

全部展开

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

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

版本历史记录

在 R2006a 之前推出

全部展开