關於譜能量,有這樣一種解釋,你可以試著去算一算
訊號可以分成能量訊號與功率訊號,非週期能量訊號具有能量譜密度,是傅立葉變換的平方,功率訊號具有功率譜密度,其與自相關函式是一對傅立葉變換對,等於傅立葉變換的平方/區間長度。不能混淆。能量訊號是沒有功率譜的。
胡廣書老師的書上找到這麼一段話,“隨機訊號在時間上是無限的,在樣本上也是無窮多,因此隨機訊號的能量是無限的,它應是功率訊號。功率訊號不滿足付裡葉變換的絕對可積的條件,因此其付裡葉變換是不存在的。如確定性的正弦函式的付裡葉變換是不存在,只有引入了衝激函式才求得其付裡葉變換。因此,對隨機訊號的頻譜分析,不再簡單的是頻譜,而是功率譜。”
對於確定性訊號而言,裡面存在能量訊號,是沒有功率譜密度的,也存在功率訊號,是有功率譜密度的。所以訊號的頻譜與是否是確定性訊號沒有必然聯絡。
頻譜是訊號的傅立葉變換。它描述了訊號在各個頻率上的分佈大小。頻譜的平方(當能量有限,平均功率為0時稱為能量譜)描述了訊號能量在各個頻率上的分佈大小。
計算過程中,都是透過樣本資料的快速傅立葉變換來計算。但不同的是,訊號的頻譜是複數,包含幅頻響應和相頻響應,重複計算時的結果基本相同。 而隨機訊號的功率譜也可以對資料進行FFT,但必須計算模值的平方,因為功率譜是實數。而且換一組樣本後,計算的結果略有不同,因為隨機訊號的樣本取值不同。要得到真實的功率譜必須進行多次平均,次數越多越好。
根據parseval定理,訊號傅氏變換模平方被定義為能量譜,即單位頻率範圍內包含的訊號能量。自然,能量跟功率有一個時間平均的關係,所以,能量譜密度在時間上平均就得到了功率譜。
matlab實現經典功率譜估計
fft做出來是頻譜,psd做出來是功率譜;功率譜丟失了頻譜的相位資訊;頻譜不同的訊號其功率譜是可能相同的;功率譜是幅度取模後平方,結果是個實數
matlab中自功率譜密度直接用psd函式就可以求,按照matlab的說法,psd能實現Welch法估計,即相當於用改進的平均週期圖法來求取隨機訊號的功率譜密度估計。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、間接法:
間接法先由序列x(n)估計出自相關函式R(n),然後對R(n)進行傅立葉變換,便得到x(n)的功率譜估計。
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)分段求週期圖再平均。
clear;
Fs=1000;
window=boxcar(length(n)); %矩形窗
noverlap=0; %資料無重疊
p=0.9; %置信機率
[Pxx,Pxxc]=psd(xn,nfft,Fs,window,noverlap,p);
plot_Pxxc=10*log10(Pxxc(index+1));
figure(1)
pause;
figure(2)
plot(k,[plot_Pxx plot_Pxx-plot_Pxxc plot_Pxx+plot_Pxxc]);
3.2、Welch法
Welch法對Bartlett法進行了兩方面的修正,一是選擇適當的窗函式w(n),並再週期圖計算前直接加進去,加窗的優點是無論什麼樣的窗函式均可使譜估計非負。二是在分段時,可使各段之間有重疊,這樣會使方差減小。
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);
plot(f,plot_Pxx);
plot(f,plot_Pxx1);
figure(3)
plot(f,plot_Pxx2);
關於譜能量,有這樣一種解釋,你可以試著去算一算
訊號可以分成能量訊號與功率訊號,非週期能量訊號具有能量譜密度,是傅立葉變換的平方,功率訊號具有功率譜密度,其與自相關函式是一對傅立葉變換對,等於傅立葉變換的平方/區間長度。不能混淆。能量訊號是沒有功率譜的。
胡廣書老師的書上找到這麼一段話,“隨機訊號在時間上是無限的,在樣本上也是無窮多,因此隨機訊號的能量是無限的,它應是功率訊號。功率訊號不滿足付裡葉變換的絕對可積的條件,因此其付裡葉變換是不存在的。如確定性的正弦函式的付裡葉變換是不存在,只有引入了衝激函式才求得其付裡葉變換。因此,對隨機訊號的頻譜分析,不再簡單的是頻譜,而是功率譜。”
對於確定性訊號而言,裡面存在能量訊號,是沒有功率譜密度的,也存在功率訊號,是有功率譜密度的。所以訊號的頻譜與是否是確定性訊號沒有必然聯絡。
頻譜是訊號的傅立葉變換。它描述了訊號在各個頻率上的分佈大小。頻譜的平方(當能量有限,平均功率為0時稱為能量譜)描述了訊號能量在各個頻率上的分佈大小。
計算過程中,都是透過樣本資料的快速傅立葉變換來計算。但不同的是,訊號的頻譜是複數,包含幅頻響應和相頻響應,重複計算時的結果基本相同。 而隨機訊號的功率譜也可以對資料進行FFT,但必須計算模值的平方,因為功率譜是實數。而且換一組樣本後,計算的結果略有不同,因為隨機訊號的樣本取值不同。要得到真實的功率譜必須進行多次平均,次數越多越好。
根據parseval定理,訊號傅氏變換模平方被定義為能量譜,即單位頻率範圍內包含的訊號能量。自然,能量跟功率有一個時間平均的關係,所以,能量譜密度在時間上平均就得到了功率譜。
matlab實現經典功率譜估計
fft做出來是頻譜,psd做出來是功率譜;功率譜丟失了頻譜的相位資訊;頻譜不同的訊號其功率譜是可能相同的;功率譜是幅度取模後平方,結果是個實數
matlab中自功率譜密度直接用psd函式就可以求,按照matlab的說法,psd能實現Welch法估計,即相當於用改進的平均週期圖法來求取隨機訊號的功率譜密度估計。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、間接法:
間接法先由序列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法進行了兩方面的修正,一是選擇適當的窗函式w(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(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);