【问题标题】:Matlab/Python: Power spectral density of non-uniform time seriesMatlab/Python:非均匀时间序列的功率谱密度
【发布时间】:2014-03-12 02:03:10
【问题描述】:

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

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 轴(并产生类似于下图的东西),它需要在频率空间中。鉴于数据的采样不均匀,我对如何解决这个问题感到困惑。

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

【问题讨论】:

    标签: python matlab numpy spectral-density


    【解决方案1】:

    我不知道有任何函数可以根据不规则采样数据计算 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 脚本来执行此操作,我将很快发布。
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多