簡體   English   中英

Matlab / Python:非均勻時間序列的功率譜密度

[英]Matlab/Python: Power spectral density of non-uniform time series

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

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軸(並產生如下圖所示),它需要在頻率空間中。 鑒於數據采樣不均,我對如何解決此問題感到困惑。

例

在估計已采樣不均勻的數據的功率譜密度時,轉換為(然后繪制)頻率空間的正確方法是什么? 我也有興趣從python / numpy / scipy的角度解決這個問題,但到目前為止僅關注Matlab函數。

我不知道有任何功能可以從不規則采樣數據中計算出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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM