2014-02-13 131 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脚本来做到这一点,我将很快发布。 –