вертикально

Периодограмма Lomb-Scargle

Синтаксис

[pxx,f] = plomb(x,t)
[pxx,f] = plomb(x,fs)
[pxx,f] = plomb(___,fmax)
[pxx,f] = plomb(___,fmax,ofac)
[pxx,fvec] = plomb(___,fvec)
[___] = plomb(___,spectrumtype)
[___,pth] = plomb(___,'Pd',pdvec)
[pxx,w] = plomb(x)
plomb(___)

Описание

пример

[pxx,f] = plomb(x,t) возвращает оценку степени спектральной плотности (PSD) Lomb-Scargle, pxx, сигнала, x, который выбирается в моменты, заданные в t. t должен увеличиться монотонно, но не должен быть однородно расположен с интервалами. Все элементы t должны быть неотрицательными. pxx оценен на частотах, возвращенных в f.

  • Если x является вектором, он обработан как один канал.

  • Если x является матрицей, то plomb вычисляет PSD независимо для каждого столбца и возвращает его в соответствующем столбце pxx.

x или t могут содержать NaN s или NaT s. Эти значения обработаны как недостающие данные и исключены из вычисления спектра.

пример

[pxx,f] = plomb(x,fs) обрабатывает случай, где сигнал выбирается однородно, на уровне fs, но имеет недостающие выборки. Задайте недостающие данные с помощью NaN s.

[pxx,f] = plomb(___,fmax) оценивает PSD до максимальной частоты, fmax, с помощью любого из входных параметров от предыдущих синтаксисов. Если сигнал выбирается в N non-NaN моменты, и Δt является разницей во времени между первым и последним из них, то pxx возвращен в round (fmax / min f) точки, где min f  = 1 / (4 × N × ts) является наименьшей частотой, на которой вычисляется pxx, и средним шагом расчета является ts = Δt / (N – 1). значения по умолчанию fmax к 1 / (2 × ts), который для однородно выбранных сигналов соответствует частоте Найквиста.

пример

[pxx,f] = plomb(___,fmax,ofac) задает целочисленный фактор сверхдискретизации, ofac. Использование ofac, чтобы интерполировать или сглаживать спектр напоминает дополняющий нуль метод для основанных на БПФ методов. pxx снова возвращен в round (fmax/fmin) точки частоты, но минимальная частота, рассмотренная в этом случае, равняется 1 / (ofac × N × ts). значения по умолчанию ofac к 4.

пример

[pxx,fvec] = plomb(___,fvec) оценивает PSD x на частотах, заданных в fvec. fvec должен иметь по крайней мере два элемента. Второй выходной аргумент совпадает с входом fvec.

Вы не можете задать максимальную частоту или фактор сверхдискретизации, если вы используете этот синтаксис.

пример

[___] = plomb(___,spectrumtype) задает нормализацию периодограммы.

  • Установите spectrumtype на 'psd' или оставьте его незаданным, чтобы получить pxx как степень спектральная плотность.

  • Установите spectrumtype на 'power' получать спектр мощности входного сигнала.

  • Установите spectrumtype на 'normalized' получать стандартную периодограмму Lomb-Scargle, которая масштабируется два раза отклонением x.

пример

[___,pth] = plomb(___,'Pd',pdvec) возвращает порог уровня мощности, pth, такой, что пик со значением, больше, чем pth, имеет вероятность pdvec того, чтобы быть истинным пиком сигнала а не результатом случайных колебаний. pdvec может быть вектором. Каждый элемент pdvec должен быть больше, чем 0 и меньшим, чем 1. Каждая строка pth соответствует элементу pdvec. pth имеет то же количество каналов как x. Эта опция не доступна, если вы задаете выходные частоты в fvec.

пример

[pxx,w] = plomb(x) возвращает оценку PSD x, оцененного в наборе равномерно расположенных с интервалами нормированных частот, w, охватывая интервал Найквиста. Используйте NaN s, чтобы задать недостающие выборки. Все вышеупомянутые опции доступны для нормированных частот. Чтобы получить доступ к ним, задайте пустой массив как второй вход.

пример

plomb(___) без выходных аргументов строит периодограмму Lomb-Scargle оценка PSD в окне текущей фигуры.

Примеры

свернуть все

Метод Lomb-Scargle может обработать сигналы, которые были выбраны неравномерно или имеют недостающие выборки.

Сгенерируйте двухканальный синусоидальный сигнал, выбранный на уровне 1 кГц в течение приблизительно 0,5 с. Частоты синусоиды составляют 175 Гц и 400 Гц. Встройте сигнал в белый шум с отклонением σ2=1/4.

Fs = 1000;
f0 = 175;
f1 = 400;

t = 0:1/Fs:0.5;

wgn = randn(length(t),2)/2;

sigOrig = sin(2*pi*[f0;f1]*t)' + wgn;

Вычислите и постройте периодограмму сигнала. Используйте periodogram с настройками по умолчанию.

periodogram(sigOrig,[],[],Fs)

axisLim = axis;
title('Periodogram')

Используйте plomb с настройками по умолчанию, чтобы оценить и построить PSD сигнала. Используйте пределы по осям из предыдущего графика.

plomb(sigOrig,t)

axis(axisLim)
title('Lomb-Scargle')

Предположим, что сигнал пропускает 10% исходных выборок. Поместите NaN в случайные местоположения, чтобы моделировать недостающие точки данных. Используйте plomb, чтобы оценить и построить PSD сигнала с недостающими выборками.

sinMiss = sigOrig;

misfrac = 0.1;
nTime = length(t)*2;

sinMiss(randperm(nTime,round(nTime*misfrac))) = NaN;

plomb(sinMiss,t)

axis(axisLim)
title('Missing Samples')

Выберите исходный сигнал, но сделайте выборку неоднородной путем добавления дрожания (неуверенность) в измерения времени. Первый момент продолжает быть в нуле. Используйте plomb, чтобы оценить и построить PSD неоднородно выбранного сигнала.

tirr = t + (1/2-rand(size(t)))/Fs/2;
tirr(1) = 0;

sinIrreg = sin(2*pi*[f0;f1]*tirr)' + wgn;

plomb(sinIrreg,tirr)

axis(axisLim)
title('Nonuniform Sampling')

Галилео Галилей наблюдал движение четырех самых больших спутников Юпитера в течение зимы 1610 года. Когда погода позволила, Галилео записал местоположения спутников. Используйте его наблюдения, чтобы оценить орбитальный период одного из спутников, Каллисто.

Угловое положение Каллисто измеряется в минутах дуги. Недостающие данные из-за облачных условий заданы с помощью NaNs. Первое наблюдение датировано 15 января. Сгенерируйте массив datetime времен наблюдения.

yg = [10.5 NaN 11.5 10.5 NaN NaN NaN -5.5 -10.0 -12.0 -11.5 -12.0 -7.5 ...
    NaN NaN NaN NaN 8.5 12.5 12.5 10.5 NaN NaN NaN -6.0 -11.5 -12.5 ...
    -12.5 -10.5 -6.5 NaN 2.0 8.5 10.5 NaN 13.5 NaN 10.5 NaN NaN NaN ...
    -8.5 -10.5 -10.5 -10.0 -8.0]';

obsv = datetime(1610,1,14+(1:length(yg)));

plot(yg,'o')

ax = gca;
nights = [1 18 32 46];
ax.XTick = nights;
ax.XTickLabel = char(obsv(nights));
grid

Оцените спектр мощности данных с помощью plomb. Задайте фактор сверхдискретизации 10. Выразите получившиеся частоты в обратные дни.

[pxx,f] = plomb(yg,obsv,[],10,'power');
f = f*86400;

Используйте findpeaks, чтобы определить местоположение единственного видного пика спектра. Постройте спектр мощности и покажите пик.

[pk,f0] = findpeaks(pxx,f,'MinPeakHeight',10);

plot(f,pxx,f0,pk,'o')
xlabel('Frequency (day^{-1})')
title('Power Spectrum and Prominent Peak')
grid

Определите орбитальный период Каллисто (в днях) как инверсия частоты максимальной энергии. Результат отличается меньше чем на 1% от значения, опубликованного НАСА.

Period = 1/f0
Period = 16.6454
NASA = 16.6890184;
PercentDiscrep = (Period-NASA)/NASA*100
PercentDiscrep = -0.2613

Галилео Галилей обнаружил четыре самых больших спутника Юпитера в январе 1610 и записал их местоположения каждая ясная ночь до марта того года. Используйте данные Галилео, чтобы найти орбитальный период Каллисто, наиболее удаленный из этих четырех спутников.

Наблюдения Галилео за угловым положением Каллисто находятся в минутах дуги. Существует несколько разрывов из-за облачных условий. Сгенерируйте массив duration времен наблюдения.

t = [0 2 3 7 8 9 10 11 12 17 18 19 20 24 25 26 27 28 29 31 32 33 35 37 ...
    41 42 43 44 45]';
td = days(t);

yg = [10.5 11.5 10.5 -5.5 -10.0 -12.0 -11.5 -12.0 -7.5 8.5 12.5 12.5 ...
    10.5 -6.0 -11.5 -12.5 -12.5 -10.5 -6.5 2.0 8.5 10.5 13.5 10.5 -8.5 ...
    -10.5 -10.5 -10.0 -8.0]';

plot(td,yg,'o')

Используйте plomb, чтобы вычислить периодограмму данных. Оцените спектр мощности до частоты 0.5day-1. Задайте фактор сверхдискретизации 10. Выберите стандартную нормализацию Lomb-Scargle.

oneday = seconds(days(1));

[pxx,f] = plomb(yg,td,0.5/oneday,10,'normalized');

f = f*oneday;

Периодограмма имеет один ясный максимум. Назовите пиковую частоту f0. Постройте периодограмму и аннотируйте пик.

[pmax,lmax] = max(pxx);
f0 = f(lmax);

plot(f,pxx,f0,pmax,'o')
xlabel('Frequency (day^{-1})')

Используйте линейный метод наименьших квадратов, чтобы соответствовать к данным функции формы

y(t)=A+Bпотому что2πf0t+Csin2πf0t.

Подгоняемые параметры являются амплитудами A, B, и C.

ft = 2*pi*f0*t;

ABC = [ones(size(ft)) cos(ft) sin(ft)] \ yg
ABC = 3×1

    0.4243
   10.4444
    6.6137

Используйте подгоняемые параметры, чтобы создать подходящую функцию на 200 интервалах точек. Отобразите данные на графике и наложите подгонку.

x = linspace(t(1),t(end),200)';
fx = 2*pi*f0*x;

y = [ones(size(fx)) cos(fx) sin(fx)] * ABC;

plot(td,yg,'o',days(x),y)

Выберите синусоиду на 0,8 Гц на уровне 1 Гц в течение 100 с. Встройте синусоиду в белый шум с отклонением 1/100. Сбросьте генератор случайных чисел для повторяемых результатов.

f0 = 0.8;

rng default
wgn = randn(1,100)/10;

ts = 1:100;
s = sin(2*pi*f0*ts) + wgn;

Вычислите и постройте степень спектральная оценка плотности до частоты дискретизации. Задайте фактор сверхдискретизации 10.

plomb(s,ts,1,10)

Там искажает, потому что частота синусоиды больше, чем частота Найквиста.

Повторите вычисление, но теперь выберите синусоиду наугад времена. Включайте частоты до 1 Гц. Задайте фактор сверхдискретизации 2. Постройте PSD.

tn = sort(100*rand(1,100));
n = sin(2*pi*f0*tn) + wgn;

ofac = 2;

plomb(n,tn,1,ofac)

Искажение исчезает. Неправильная выборка увеличивает эффективную частоту дискретизации путем уменьшения некоторых временных интервалов.

Увеличьте масштаб частот приблизительно 0,8 Гц. Используйте прекрасную сетку с интервалом 0,001 Гц. Вы не можете задать фактор сверхдискретизации или максимальную частоту в этом случае.

df = 0.001;
fvec = 0.7:df:0.9;

hold on
plomb(n,tn,fvec)
legend('ofac = 2','df = 0.001')

Сгенерировать N=1024 выборки белого шума с отклонением σ=1, учитывая частоту дискретизации 1 Гц. Вычислите спектр мощности белого шума. Выберите нормализацию Lomb-Scargle и задайте фактор сверхдискретизации ofac=15. Сбросьте генератор случайных чисел для повторяемых результатов.

rng default

N = 1024;
t = (1:N)';
wgn = randn(N,1);

ofac = 15;
[pwgn,f] = plomb(wgn,t,[],ofac,'normalized');

Проверьте, что оценка спектра мощности Lomb-Scargle белого шума имеет экспоненциальное распределение с модульным средним значением. Постройте гистограмму значений pwgn и гистограмму набора экспоненциально распределенных случайных чисел, сгенерированных с помощью функции распределения f(z|1)=e-z. Чтобы нормировать гистограммы, вспомните, что общее количество выборок периодограммы N×ofac/2. Задайте ширину интервала 0,25. Наложите график теоретической функции распределения.

dx = 0.25;
br = 0:dx:5;

Nf = N*ofac/2;

hpwgn = histcounts(pwgn,br)';

hRand = histcounts(-log(rand(Nf,1)),br)';

bend = br(1:end-1);

bar(bend,[hpwgn hRand]/Nf/dx,'histc')
hold on
plot(br,exp(-br))
legend('wgn','Empirical pdf','Theoretical pdf')
hold off

Встройте в шум синусоидальный сигнал частоты 0,1 Гц. Используйте отношение сигнал-шум ξ=0.01. Задайте амплитуду синусоиды, x0, использование отношения x0=σ2ξ. Вычислите спектр мощности сигнала и постройте его гистограмму вместе с эмпирическими и теоретическими функциями распределения.

SNR = 0.01;
x0 = sqrt(2*SNR);
sigsmall = wgn + x0*sin(2*pi/10*t);

[psigsmall,f] = plomb(sigsmall,t,[],ofac,'normalized');

hpsigsmall = histcounts(psigsmall,br)';

bar(bend,[hpsigsmall hRand]/Nf/dx,'histc')
hold on
plot(br,exp(-br))
legend('sigsmall','Empirical pdf','Theoretical pdf')
hold off

Повторите использование вычисления ξ=1. Распределение теперь отличается заметно.

SNR = 1;
x0 = sqrt(2*SNR);
siglarge = wgn + x0*sin(2*pi/10*t);

[psiglarge,f] = plomb(siglarge,t,[],ofac,'normalized');

hpsiglarge = histcounts(psiglarge,br)';

bar(bend,[hpsiglarge hRand]/Nf/dx,'histc')
hold on
plot(br,exp(-br))
legend('siglarge','Empirical pdf','Theoretical pdf')
hold off

Сгенерируйте 100 выборок синусоидального сигнала на уровне частоты дискретизации 1 Гц. Задайте амплитуду 0,75 и частоту 0.6/2π0.096Hz. Встройте сигнал в белый шум отклонения 0.902. Сбросьте генератор случайных чисел для повторяемых результатов.

rng default

X0 = 0.75;
f0 = 0.6;
vr = 0.902;

Nsamp = 100;
t = 1:Nsamp;
X = X0*cos(f0*(1:Nsamp))+randn(1,Nsamp)*sqrt(vr);

Отбросьте 10% выборок наугад. Постройте сигнал.

X(randperm(Nsamp,Nsamp/10)) = NaN;

plot(t,X,'o')

Вычислите и постройте нормированный спектр мощности. Аннотируйте уровни, которые соответствуют ложно-сигнальным вероятностям 50%, 10%, 1% и 0,01%. Если вы генерируете много белых шумовых сигналов с 90 выборками с отклонением 0.902, то у половины из них есть один или несколько peaks выше, чем 50%-я строка, 10% имеют один или несколько peaks выше, чем 10%-я строка и так далее.

Pfa = [50 10 1 0.01]/100;
Pd = 1-Pfa;

[pxx,f,pth] = plomb(X,1:Nsamp,'normalized','Pd',Pd);

plot(f,pxx,f,pth*ones(size(f')))
xlabel('f')
text(0.3*[1 1 1 1],pth-.5,[repmat('P_{fa} = ',[4 1]) num2str(Pfa')])

В этом случае пик достаточно высок, что только приблизительно 0,01% возможных сигналов может достигнуть его.

Используйте plomb без выходных аргументов, чтобы повторить вычисление. График является теперь логарифмическим, и уровни чертятся с точки зрения вероятностей обнаружения.

plomb(X,1:Nsamp,'normalized','Pd',Pd)

Когда дали вектор данных как единственный вход, plomb оценивает степень спектральная плотность с помощью нормированных частот.

Сгенерируйте 128 выборок синусоиды нормированной частоты π/2 рад/выборка, встроенный в белый Гауссов шум отклонения 1/100.

t = (0:127)';
x = sin(2*pi*t/4);
x = x + randn(size(x))/10;

Оцените PSD использование процедуры Lomb-Scargle. Повторите вычисление с periodogram.

[p,f] = plomb(x);
[pper,fper] = periodogram(x);

Постройте оценки PSD в децибелах. Проверьте, что результаты эквивалентны.

plot(f/pi,pow2db(p))
hold on
plot(fper/pi,pow2db(pper))

axis([0 1 -40 20])
xlabel('\omega / \pi')
ylabel('PSD')
legend('plomb','periodogram')

Оцените Lomb-Scargle PSD сигнала с тремя каналами, состоявшего из синусоид. Задайте частоты как 2π/3 рад/выборка, π/2 рад/выборка, и 2π/5 рад/выборка. Добавьте белый Гауссов шум отклонения 1/100. Используйте plomb без выходных аргументов, чтобы вычислить и построить оценку PSD в децибелах.

x3 = [sin(2*pi*t/3) sin(2*pi*t/4) sin(2*pi*t/5)];
x3 = x3 + randn(size(x3))/10;

figure
plomb(x3)

Вычислите оценку PSD снова, но теперь удалите 25% данных наугад.

x3(randperm(numel(x3),0.25*numel(x3))) = NaN;

plomb(x3)

Если у вас нет временного вектора, используйте NaN, чтобы задать недостающие выборки в сигнале.

Сгенерируйте 1 024 выборки синусоиды нормированной частоты 2π/5 рад/выборка, встроенный в белый шум отклонения 1/100. Оцените степень спектральная плотность с помощью процедуры Lomb-Scargle. Используйте plomb без выходных аргументов, чтобы построить оценку.

t = (0:1023)';
x = sin(2*pi*t/5);
x = x + randn(size(x))/10;

[pxx,f] = plomb(x);

plomb(x)

Удалите любую выборку путем присвоения NaN. Используйте plomb, чтобы вычислить и построить PSD. Периодограмма достигает максимума на той же частоте, потому что ось времени неизменна.

xnew = x;
xnew(2:2:end) = NaN;

plomb(xnew)

Удалите любую выборку путем субдискретизации. Функция теперь оценивает периодичность на дважды исходной частоте. Это - вероятно, не результат, который вы хотите.

xdec = x(1:2:end);

plomb(xdec)

Входные параметры

свернуть все

Входной сигнал, заданный как вектор или матрица. Если x является вектором, он обработан как один канал. Если x является матрицей, то plomb вычисляет оценку PSD независимо для каждого столбца и возвращает его в соответствующем столбце pxx. x может содержать NaN s. NaN s обработан как недостающие данные и исключен из вычисления спектра.

Типы данных: single | double

Моменты времени, заданные как неотрицательный вектор действительных чисел, массив datetime или массив duration. t должен увеличиться монотонно, но не должен быть однородно расположен с интервалами. t может содержать NaN s или NaT s. Эти значения обработаны как недостающие данные и исключены из вычисления спектра.

Типы данных: single | double | datetime | duration

Частота дискретизации, заданная как положительная скалярная величина. Частота дискретизации является количеством выборок в единицу времени. Если модуль времени является секундами, частота дискретизации имеет модули герц.

Типы данных: single | double

Максимальная частота, заданная как положительная скалярная величина. fmax может быть выше, чем частота Найквиста.

Типы данных: single | double

Сверхдискретизация фактора, заданного как положительный целочисленный скаляр.

Типы данных: single | double

Введите частоты, заданные как вектор. fvec должен иметь по крайней мере два элемента.

Типы данных: single | double

Масштабирование спектра мощности, заданное как один из 'psd', 'power' или 'normalized'. Исключение spectrumtype или определение 'psd', возвращают степень спектральная оценка плотности. Определение 'power' масштабирует каждую оценку PSD эквивалентной шумовой пропускной способностью окна. Задайте 'power', чтобы получить оценку степени на каждой частоте. Определение 'normalized' масштабирует pxx два раза отклонением x.

Вероятности обнаружения, заданного как пара, разделенная запятой, состоящая из 'Pd' и скаляра или вектора действительных значений между 0 и 1, исключительный. Вероятность обнаружения является вероятностью, что пик в спектре не происходит из-за случайных колебаний.

Типы данных: single | double

Выходные аргументы

свернуть все

Периодограмма Lomb-Scargle, возвращенная как вектор или матрица. Когда входной сигнал, x, является вектором, затем pxx является вектором. Когда x является матрицей, функция обрабатывает каждый столбец x как независимый канал и вычисляет периодограмму каждого канала.

Частоты, возвращенные как вектор.

Типы данных: single | double

Нормированные частоты, возвращенные как вектор.

Типы данных: single | double

Пороги уровня мощности, возвращенные как вектор или матрица. Порог уровня мощности является амплитудой, которую пик в спектре должен превысить так, это может быть исключено (с вероятностью pdvec), что пик происходит из-за случайных колебаний. Каждая строка pth соответствует элементу pdvec. pth имеет то же количество каналов как x.

Типы данных: single | double

Больше о

свернуть все

Периодограмма Lomb-Scargle

Периодограмма Lomb-Scargle позволяет вам найти и протестировать слабые периодические сигналы в в противном случае случайном, неравномерно выборочных данных.

Рассмотрите наблюдения N, xk, взятый во времена tk, где k = 1, …, N. Периодограмма Lomb-Scargle задана [1]

PLs(f)=12σ2{[k=1N(xkx¯)потому что(2πf(tkτ))]2k=1Nпотому что2(2πf(tkτ))+[k=1N(xkx¯)sin(2πf(tkτ))]2k=1Nsin2(2πf(tkτ))},

где

x¯=1Nk=1Nxk

и

σ2=1N1k=1N(xkx¯)2

соответственно среднее значение и отклонение данных.

Смещение времени, τ, выбрано как

загар(2(2πf)τ)=k=1Nsin(2(2πf)tk)k=1Nпотому что(2(2πf)tk)

гарантировать инвариантность времени вычисленного спектра. Любой сдвиг tk → tk + T в измерениях времени приводит к идентичному сдвигу в смещении: τ → τ + T. Кроме того, выбор гарантирует, что “максимум в периодограмме происходит на той же частоте, которая минимизирует сумму квадратов невязок припадка синусоиды к данным”. [2] смещение зависит только от времен измерения и исчезает, когда времена равномерно распределены.

Если входной сигнал состоит из белого Гауссова шума, то LS P (f) следует за экспоненциальным распределением вероятностей с модульным средним значением [3].

Ссылки

[1] Lomb, Николас Р. “Анализ Частоты наименьших квадратов Неравноценно Расположенных с интервалами Данных”. Астрофизика и Космические исследования. Издание 39, 1976, стр 447–462.

[2] Scargle, Джеффри Д. “Исследования в Астрономическом Анализе Временных рядов. II. Статистические Аспекты Спектрального анализа Неравномерно Расположенных с интервалами Данных”. Астрофизический Журнал. Издание 263, 1982, стр 835–853.

[3] Нажмите, Уильям Х. и Джордж Б. Рибики. “Алгоритм FAST для Спектрального анализа Неравномерно Выборочных данных”. Астрофизический Журнал. Издание 338, 1989, стр 277–280.

[4] Хорн, Джеймс Х. и Салли Л. Бэлиунас. “Предписание для Анализа Периода Неравномерно Выбранных Временных рядов”. Астрофизический Журнал. Издание 302, 1986, стр 757–763.

Введенный в R2014b