plomb

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

Описание

пример

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

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

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

x или t может содержать NaNs или NaTs. Эти значения обработаны как недостающие данные и исключены из расчета спектра.

пример

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

[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, охват интервала Найквиста. Используйте NaNs, чтобы задать недостающие выборки. Все вышеупомянутые опции доступны для нормированных частот. Чтобы получить доступ к ним, задайте пустой массив как второй вход.

пример

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 независимо для каждого столбца и возвращает его в соответствующем столбце pxxX может содержать NaNs. NaNs обработаны как недостающие данные и исключены из расчета спектра.

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

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

Типы данных: 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

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

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

tan(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.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Введенный в R2014b