Matlab/Python:非均匀时间序列的功率谱密度

Matlab/Python:非均匀时间序列的功率谱密度,python,matlab,numpy,spectral-density,Python,Matlab,Numpy,Spectral Density,我试图找到在不均匀时间测量的信号的功率谱密度。数据如下所示: 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 =

我试图找到在不均匀时间测量的信号的功率谱密度。数据如下所示:

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。

我发现答案是Lomb Scargle周期图。这将查找不规则采样数据的PSD。我找到了一个matlab脚本来实现这一点,我将很快发布。