2014-02-13 160 views
2

我試圖找到在不均勻時間測量的信號的功率譜密度。數據看起來像這樣:Matlab/Python:非均勻時間序列的功率譜密度

0 1.55 
755 1.58 
2412256 2.42 
2413137 0.32 
2497761 1.19 
... 

其中第一列是由於第一測量的時間(以秒計),第二列是測量的值。

目前,利用Matlab軟件的週期圖功能,我已經能夠通過使用估算功率譜密度:

nfft = length(data(:,2)); 
pxx = periodogram(data(:,2),[],nfft); 

現在,此刻,繪製這個我一直在使用

len = length(pxx); 
num = 1:1:len; 
plot(num,pxx) 

這明顯不能在功率譜密度上放置正確的x軸(併產生類似下圖的圖),這需要在頻率空間中。鑑於數據的不均勻採樣,我對如何處理這個問題感到困惑。

example

什麼是轉換爲正確的方式(然後繪製在)估算數據的功率譜密度已不均勻地採樣時頻空間?我也有興趣從python/numpy/scipy的角度來解決這個問題,但迄今爲止只看到了Matlab函數。

回答

0

我不知道任何函數可以從不規則的採樣數據中計算PSD,所以您需要先將數據轉換爲統一的採樣率。因此,第一步是使用interp1以固定的時間間隔重新採樣。

avg_fs = 1/mean(diff(data(:, 1))); 
min_time = min(data(:, 1)); 
max_time = max(data(:, 1)); 
num_pts = floor((max_time - min_time) * avg_fs); 
new_time = (1:num_pts)'/avg_fs; 
new_time = new_time - new_time(1) + min_time; 
new_x = interp1(data(:, 1), data(:, 2), new_time); 

我總是用pwelch計算PSD的,這裏是我會怎樣做呢

nfft = 512; % play with this to change your frequency resolution 
noverlap = round(nfft * 0.75); % 75% overlap 
window = hanning(nfft); 
[Pxx,F] = pwelch(new_x, window, noverlap, nfft, avg_fs); 
plot(F, Pxx) 
xlabel('Frequency (Hz)') 
grid on 

你一定會想與NFFT實驗,較大的數字會給你更多的頻率分辨率(間距較小頻率之間),但是PSD會噪音較大。你可以做的一個技巧,以獲得高分辨率和低噪音是使窗口小於nfft。

+0

我發現答案是Lomb-Scargle週期圖。這找到了不規則採樣數據的PSD。我發現一個matlab腳本來做到這一點,我將很快發佈。 –