Matlab で古典的なパワー スペクトル推定を実現するためのいくつかの方法

       この記事はブロガーが通信などの分野で勉強していた際に、個人的な勉強や研究、鑑賞のために記録した研究の抜粋およびメモであり、ブロガーの人工知能およびその他の分野についての理解に基づいています。 、、ご指摘頂きましたら速やかに修正させて頂きますので、ご理解頂けますようお願い致します。コミュニケーション分野における記事分類 注

       通信分野のメモ(2) ---「古典的なパワースペクトル推定をMatlabで実現するいくつかの方法」

Matlab で古典的なパワー スペクトル推定を実現するためのいくつかの方法

目次

1. 直接法:

2. 間接的な方法:

3. 改善された直接メソッド:

3.1、Bartlett法

3.2、Welch法


原文/論文の出典: MATLAB Chinese Forum

        fft によって生成されるスペクトルはパワー スペクトルであり、psd によって生成されるパワー スペクトルです。パワー スペクトルはスペクトルの位相情報を失います。異なるスペクトルを持つ信号のパワー スペクトルは同じである可能性があります。パワー スペクトルは振幅の 2 乗を法としたものです。 , 結果は matlab の実数です. スペクトル密度は psd 関数を使用して直接計算できます. matlab によると, psd はウェルチ法の推定を実現できます, これは改良された平均ピリオドグラム法を使用してパワー スペクトル密度を推定するのと同等ですpsd で得られた結果はより正確で滑らかになります。

1. 直接法:

        直接法はピリオドグラム法とも呼ばれ、ランダムな系列x(n)のN個の観測データをエネルギーが有限な系列とみなし、x(n)の離散フーリエ変換を直接計算してX(k)を求めます。その振幅の二乗を N で割った値が、シーケンス x(n) の真のパワー スペクトルの推定値として機能します。

Matlab コードの例:

clear;
Fs=1000; %采样频率
n=0:1/Fs:1;
%产生含有噪声的序列
xn=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n));
window=boxcar(length(xn)); %矩形窗
nfft=1024;
[Pxx,f]=periodogram(xn,window,nfft,Fs); %直接法
plot(f,10*log10(Pxx));

  操作結果:


2. 間接的な方法:

        Wiener Zinchin の定理から、間接法ではまずシーケンス x(n) から自己相関関数 R(n) を推定し、次に R(n) に対してフーリエ変換を実行して x(n) のパワー スペクトル推定を取得することがわかります。 。

Matlab コードの例:

clear;
Fs=1000; %采样频率
n=0:1/Fs:1;
%产生含有噪声的序列
xn=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n));
nfft=1024;
cxn=xcorr(xn,'unbiased'); %计算序列的自相关函数
CXk=fft(cxn,nfft);
Pxx=abs(CXk);
index=0:round(nfft/2-1);
k=index*Fs/nfft;
plot_Pxx=10*log10(Pxx(index+1));
plot(k,plot_Pxx);

 操作結果:


3. 改善された直接メソッド:

        直接法のパワースペクトル推定では、データ長 N が大きすぎるとスペクトル曲線の変動が大きくなり、N が小さすぎるとスペクトルの分解能が悪くなるため改善が必要です。

3.1、Bartlett法

        Bartlett のピリオドグラムの平均化方法は、N 点の有限長シーケンス x(n) をセグメント化してピリオドグラムを計算し、それを平均することです。

Matlab コードの例:

clear;
Fs=1000;
n=0:1/Fs:1;
xn=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n));
nfft=1024;
window=boxcar(length(n)); %矩形窗
noverlap=0; %数据无重叠
p=0.9; %置信概率
[Pxx,Pxxc]=psd(xn,nfft,Fs,window,noverlap,p);
index=0:round(nfft/2-1);
k=index*Fs/nfft;
plot_Pxx=10*log10(Pxx(index+1));
plot_Pxxc=10*log10(Pxxc(index+1));
figure(1)
plot(k,plot_Pxx);
pause;
figure(2)
plot(k,[plot_Pxx plot_Pxx-plot_Pxxc plot_Pxx+plot_Pxxc]);

3.2、Welch法

        Welch 法では、Bartlett 法に 2 つの変更が加えられています。1 つは、適切な窓関数 w(n) を選択し、ピリオドグラムを計算する前にそれを直接追加することです。窓を追加する利点は、窓関数の種類に関係なく、スペクトルが負ではない。第 2 に、セグメント化するときにセグメント間に重複が生じる可能性があり、これにより分散が減少します。

Matlab コードの例:

clear;
Fs=1000;
n=0:1/Fs:1;
xn=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n));
nfft=1024;
window=boxcar(100); %矩形窗
window1=hamming(100); %海明窗
window2=blackman(100); %blackman窗
noverlap=20; %数据无重叠
range='half'; %频率间隔为[0 Fs/2],只计算一半的频率
[Pxx,f]=pwelch(xn,window,noverlap,nfft,Fs,range);
[Pxx1,f]=pwelch(xn,window1,noverlap,nfft,Fs,range);
[Pxx2,f]=pwelch(xn,window2,noverlap,nfft,Fs,range);
plot_Pxx=10*log10(Pxx);
plot_Pxx1=10*log10(Pxx1);
plot_Pxx2=10*log10(Pxx2);
figure(1)
plot(f,plot_Pxx);
pause;
figure(2)
plot(f,plot_Pxx1);
pause;
figure(3)
plot(f,plot_Pxx2);

  操作結果: 


     記事内に不適切や不正確な点がございましたら、ご理解の上ご指摘いただければ幸いです。一部の文章、画像等はインターネット上から取得したものであるため、出典が確認できませんので、紛争等がございましたらブロガーに連絡の上、削除していただきますようお願いいたします。間違い、質問、権利侵害がある場合は、コメントを残して著者に連絡するか、VX 公開アカウントRain21321をフォローして著者に連絡してください。

おすすめ

転載: blog.csdn.net/qq_51399582/article/details/134586546