现代通信原理A.3:随机信号的功率谱估计

部分内容参考
[1] 基于Welch算法的经典功率谱估计的MATLAB分析(http://www.doc88.com/p-3734310145747.html)

  功率谱估计是利用有限长的数据估计信号的功率谱,分为经典谱估计和现代谱估计。下面我们从经典谱估计中的周期图法入手,进一步讨论其改进Welch算法。

1、周期图法

  周期图法有傅立叶变换得到的,因此也称为直接法。若我们有离散的 N N N点随机序列 x N ( n ) , n = 0 , 1 , … , N − 1 x_N(n),n=0,1,\ldots,N-1 xN(n),n=0,1,,N1,则可以得到其 N N N点离散傅立叶变换(DFT) X N ( f ) X_N(f) XN(f),进一步可以得到对 x ( n ) x(n) x(n)真实功率谱密度 P X ( f ) P_X(f) PX(f)的估计:
(1) P ^ X ( f ) = 1 N ∣ X N ( f ) ∣ 2 = 1 N ∣ ∑ n = 0 N − 1 x ( n ) e − j 2 π f n ∣ 2 . \tag{1} \hat P_X(f)=\frac{1}{N}|X_N(f)|^2=\frac{1}{N}{\Large |}\sum_{n=0}^{N-1}x(n)e^{-j2\pi fn}{\Large |}^2. P^X(f)=N1XN(f)2=N1n=0N1x(n)ej2πfn2.(1)由于直接法没有统计平均,因此准确性较差,方差性能不好。此外,当数据长度 N N N较大时,谱曲线呈现较大起伏;数据长度 N N N较小时,谱的分辨率有不好。

下面给出的程序中,首先产生矩形脉冲信号如图1中(a)所示,再用周期图法观察它的功率谱密度。我们采用调用MATLAB中的fft函数以及按照(1)编程计算两种方法进行功率谱估计,结果分别如图1中(b)和©所示。

%------------------
%系统参数设置
%-----------------
T_start=0;%开始时间
T_stop=10;%截止时间
T=T_stop-T_start;%仿真持续时间
T_sample=1/10;%采样间隔
f_sample=1/T_sample; % 采样速率
N_sample=T/T_sample;% 采样点数

%-----------------
%产生矩形脉冲
%-----------------
A=1;
n=1:N_sample;
Tg=1;
N_Tg=floor(Tg/T_sample);
x=zeros(1,N_sample);
x(1:N_Tg+1)=A*ones(1,N_Tg+1);
subplot(2,2,[1 2])
plot(n*T_sample,x);

%-------------------------
%功率谱密度估计
%-------------------------
%periodogram
%调用MATLAB中的fft函数
PSD_X1=abs(fft(x)).^2/N_sample;
subplot(2,2,3)
plot(n/N_sample*f_sample,PSD_X1)
%按照公式(1)计算
temp1=[1:N_sample]'*[1:N_sample];
temp2=exp(-j*2*pi/N_sample*temp1);
x_matrix=repmat(x,[N_sample,1]);
PSD_X2=(abs(sum(x_matrix.*temp2,2)).^2/N_sample)';
subplot(2,2,4)
plot(n/N_sample*f_sample,PSD_X2)

在这里插入图片描述

图1

2、周期图法的改进算法

  为了改进周期图法,可以采用适当的窗函数对谱进行平滑。其思想是,将 N N N点离散序列 x N ( n ) , n = 0 , 1 , … , N x_N(n),n=0,1,\ldots,N xN(n),n=0,1,,N,分成 L L L段,每段的长度为 M M M,分别求每一段的功率谱密度,然后加以平均。
  如果对分段数据加矩形窗,则第 l l l段数据变为
x N l ( n ) = x N [ n + ( l − 1 ) M ] d 1 [ n + ( l − 1 ) M ] ,   n = 0 , 1 , … , M − 1 , l = 1 , 2 , … , L , x^l_N(n)=x_N[n+(l-1)M]d_1[n+(l-1)M],\ n=0,1,\ldots,M-1,l=1,2,\ldots,L, xNl(n)=xN[n+(l1)M]d1[n+(l1)M], n=0,1,,M1,l=1,2,,L,这里 d 1 ( n ) d_1(n) d1(n)表示矩形窗在 n n n点的系数。由此,可以得到修正后的平均周期图为
P ‾ ( f ) = 1 M L ∑ l = 1 L ∣ ∑ n = 0 M − 1 x N l ( n ) e − j 2 π n f ∣ 2 . \overline{P}(f)=\frac{1}{ML}\sum_{l=1}^{L}{\Large |}\sum_{n=0}^{M-1}x_N^l(n)e^{-j2\pi nf}{\Large |}^2. P(f)=ML1l=1Ln=0M1xNl(n)ej2πnf2.此方法称为Bartlett法,它可以改善直接法的方差特性。那么信号到底要分多少段?每一段长度应该为多少呢?显然,每一段点数越多,频域分辨率就越高。如果整个信号不分段,那么频域分辨率最高。此外如果一个信号本身点数不太多,那么如果不同段之间有重复交叠(overlapping),显然可以比没有overlapping时频域分辨率高。这就引出了Welch法。
  Welch法是对Bartlett法的改进。Welch法在对 x N ( n ) x_N(n) xN(n)分段时,允许每段数据存在部分交叠(overlaping),并且每一段的数据窗口可以不采用矩形窗,即
P ‾ ( f ) = 1 M U ∑ l = 1 L ∣ ∑ n = 0 M − 1 x N l ( n ) d 2 ( n ) e − j 2 π n f ∣ 2 . \overline{P}(f)=\frac{1}{MU}\sum_{l=1}^{L}{\Large |}\sum_{n=0}^{M-1}x_N^l(n)d_2(n)e^{-j2\pi nf}{\Large |}^2. P(f)=MU1l=1Ln=0M1xNl(n)d2(n)ej2πnf2.这里 d 2 ( n ) d_2(n) d2(n)表示数据窗口。由于Welch法允许隔断交叠,从而增大了段数 L L L,因此可以更好改善估计的方差特性。但数据交叠会减小每段的不相关性。此外,选择合适窗函数可以减小频谱泄露,改善分辨率。

3、MATLAB中应用pwelch函数实现功率谱估计

  我们用MATLAB中的函数pwelch来观察白噪声的功率谱密度,大家在帮助文档里面输入pwelch即可以查到相关说明和示例。这里将部分用法罗列如下:

pxx=pwelch(x) 

【说明】返回输入信号x的PSD估计pxx。如果x为实值,则pxx为单边PSD估计;若x为复值,则pxx为双边PSD估计。每段fft的默认点数为256,因此可以得到129个点的PSD结果。

pxx = pwelch(x,window,noverlap,nfft) 

【说明】这里的’window’表示每次处理的分段数据长度;'noverlap’是指相邻两段数据之间的重叠部分长度;nfft为PSD估计时使用的离散傅立叶变换的点数。默认情况下,nfft为不小于分段数据长度的最小的2的幂与256二者中较大的那一个值。(有点拗口,举例说,如果分段数据长度为100,则不小于它的最小2的幂为128,nfft就为256;若分段数据长度为500,则nfft为512)。显然我们会让nfft尽量大,这样频率分辨率会比较高。显然此时得到的PSD的点数为nfft/2+1,频率分辨率为f_sample/nfft。

 pxx = pwelch(x,window,noverlap,nfft,'centered')

【说明】加入’centered’参数,我们可以生成以零频率(直流)为中心正负对称的PSD,此时PSD的点数等于nfft。

下面我们仍然以上面矩形脉冲信号为例,看看如何用pwelch函数估计其功率谱密度。系统参数设置和波形生成代码见上面代码段,这里不再重复。得到的功率谱密度如图2所示。

%------------------------
%Welch方法
%------------------------
PSD_X3=pwelch(x,500,100,'centered')*N_sample;
figure(2)
N_fft=max(256,length(PSD_X3));
xx=[-N_fft/2+1:N_fft/2]*(f_sample/N_fft);
plot(xx,PSD_X3)

在这里插入图片描述

图2

猜你喜欢

转载自blog.csdn.net/tanghonghanhaoli/article/details/100825259