小鐘 asked in 電腦與網際網路軟體 · 1 decade ago

[MATLAB] 請教頻譜分析的一個問題

假設有ㄧ個系統已經用simulink model,現在我想對這系統的輸出訊號做頻譜分析(為了算出THD、SNR),並且系統輸入頻率是10k,輸出取樣頻率fs=(65536*10k)/255,總取樣點數65536點,總取樣週期255,基本上有符合coherent sampling,之後我對取樣出來的資料做fft,而我MATLAB做頻譜指令是這樣給的(假設取出的資料陣列名子是data):

>> data(1:65536);

>> b=abs(fft(data));

但是我現在的問題是我想加入window得指令,使的我頻譜分析更加精確。請問有人知道要如何加入window的指令嗎?

(請各位matlab大師幫幫忙,謝謝)

Update:

感謝Chaos大師的回答,

但是我用[Pxx,f]做出來的頻譜沒有基頻訊號,也沒有noise跟harmonic,

只有在某些頻率上(200k、400k...)有power而已,

是不是本人在哪個地方設定錯誤了呀??

(以我系統設定的條件,基頻應該出現在10K,還有harmonic應該會出現在基頻的倍數上,但頻譜結果跟我要的不ㄧ樣!!困惑中^0^)

Update 2:

另外我MATLAB指令是這樣用的:

>>[Pxx,f]=pwelch(a(1:65536),hamming(128),[],512,65536*10000/255)

>>plot(f,Pxx),xlabel('Frequency'),ylabel('Pxx')

Update 3:

更正:

另外我MATLAB指令是這樣用的:

>>[Pxx,f]=pwelch(data(1:65536),hamming(128),[],512,65536*10000/255)

>>plot(f,Pxx),xlabel('Frequency'),ylabel('Pxx')

Update 4:

把nfft值調高,有看到基頻、noise跟harmonic了。thx

Update 5:

不過有個問題要跟Choas大師再請教,

我加入window目的是希望在65536點之間得到255完整週期

( 因為系統輸入到輸出是有delay問題存在,

所以我65536點的取法是刻意將總週期數多跑幾個週期之後,

再從最後ㄧ個點取65536點回來。)

那要怎麼使用window指令,

才能保證我取的65536點會得到255個完整週期呢?

(因為要是頻譜這弄錯,我接下來算THD、SNR都會跟這錯掉)

1 Answer

Rating
  • Chaos
    Lv 7
    1 decade ago
    Favorite Answer

    可以使用pwelch指令來達成

    用法為[Pxx,f]=pwelch(x,window,noverlap,nfft,fs)

    其中計算出來的Pxx就是頻譜(不同頻率f時的能量)

    輸入的訊號分別為

    x: 輸入訊號值,就你的問題應該是y

    window:是選用的window函數,例如用hanning或hamming等,必須給所要window的寬度,亦即hanning(32)或hamming(128)等

    noverlap:表示重疊的點數,這部份需要數位訊號處理的專業,不懂可以用[]表示用預設的值

    nfft:表示頻譜的解析度,數字越多,表示計算的越細,通常是用2^n表示,如64,512

    fs:為取樣頻率,10,000Hz

    因此,一個範例為

    >>[Pxx,f]=pwelch(data(1:65536),hanning(128,[],512,10000);

    >>plot(f,Pxx),xlabel('Frequency'),ylabel('Pxx')

    2008-10-19 08:21:12 補充:

    試著把nfft調高看看,如2048

    2008-10-19 18:11:56 補充:

    你可以調整window的長度。讓它包括每一個週期,也就是用hamming(256)或hanning(256)並且讓overlap=1因為你的週期是255

    >>[Pxx,f]=pwelch(data(1:65536),hanning(256),1,2048,10000);

    Source(s): 教學經驗
Still have questions? Get your answers by asking now.