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

时间:2014-02-13 09:30:05

标签: 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 = length(pxx);
num = 1:1:len;
plot(num,pxx)

这显然没有在功率谱密度上放置正确的x轴(并产生如下图所示),这需要在频率空间中。鉴于数据的不均匀采样,我对如何解决这个问题感到困惑。

example

在估算不均匀采样数据的功率谱密度时,转换为(然后绘制)频率空间的正确方法是什么?我也有兴趣从python / numpy / scipy的角度解决这个问题,但到目前为止只看了Matlab函数。

1 个答案:

答案 0 :(得分: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。