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

4

我正在尝试找到在不均匀时间测量的信号的功率谱密度。数据看起来像这样:

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

第一列是自第一次测量以来的时间(以秒为单位),第二列是测量值。

目前,我使用Matlab中的periodogram函数,通过以下方式估计功率谱密度:

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函数。

1个回答

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小,以获得更好的分辨率和更低的噪音。


我发现答案是Lomb-Scargle周期图。它可以找到不规则采样数据的PSD。我找到了一个Matlab脚本来实现这个功能,稍后我会发布它。 - Daniel.Reardon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接