Как определить, является ли дискретный сигнал периодическим или нет?

12

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

Я хочу использовать преобразование Фурье / ряд. Мои данные выглядят либо апериодическими

[111100001111000110010101010000101]

или периодический

[+11001100110011001100]

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

safzam
источник

Ответы:

14

Я бы сделал нормализованную автокорреляцию для определения периодичности. Если он периодичен с периодом вы должны увидеть пики в каждой выборке P в результате. Нормализованный результат «1» подразумевает идеальную периодичность, «0» вообще не подразумевает периодичность в этот период, а значения между ними подразумевают несовершенную периодичность. Вычтите среднее значение последовательности данных из последовательности данных перед выполнением автокорреляции, поскольку это сместит результаты.PP

Пики будут иметь тенденцию уменьшаться по мере удаления от центра, который они получают, просто из-за меньшего количества перекрывающихся образцов. Вы можете смягчить этот эффект, умножив результаты на обратную величину процента перекрывающихся выборок.

гдеU(n)- несмещенная автокорреляция,A(n)- нормализованная автокорреляция,n- смещение, аN- количество выборок в последовательности данных, которые вы проверяете на периодичность.

U(n)=A(n)N|Nn|
U(n)A(n)nN

РЕДАКТИРОВАТЬ: Это пример того, как определить, являются ли последовательности периодическими. Ниже приведен код Matlab.

s1 = [1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1];
s1n = s1 - mean(s1);
plot(xcorr(s1n, 'unbiased'))

«Беспристрастный» параметр функции xcorr указывает ей выполнить масштабирование, описанное в моем уравнении выше. Однако автокорреляция не нормализована, поэтому пик в центре составляет около 0,25 вместо 1. Однако это не имеет значения, если мы помним, что центральный пик является идеальной корреляцией. Мы видим, что нет других соответствующих пиков, кроме как на самых внешних краях. Это не имеет значения, потому что там есть только один пример перекрытия, так что это не имеет смысла.

Непериодические

s2 = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
s2n = s2 - mean(s2);
plot(xcorr(s2n, 'unbiased'))

Здесь мы видим, что последовательность является периодической, потому что есть несколько несмещенных пиков автокорреляции с той же величиной, что и центральный пик.

периодический

Джим Клэй
источник
3
+1: Вы также можете захотеть исправить данные до формирования , иначе любое DC-смещение может помешать нахождению периодических пиков. A(n)
Питер К.
1
@PeterK Хороший вопрос.
Джим Клэй
Привет, Джим, спасибо .. Я немного запутался, как начать программировать это, потому что, где бы я ни искал автокорреляцию, я нахожу сложные формулы, я не понимаю, с чего начать и как определить пик с периодом P в коде , Со мной у меня есть список значений V [] = {110011001100 ..} теперь, как поместить их в формулы автокорреляции и определить, периодичен ли он или нет ... Не могли бы вы дать мне немного легкого начала ... Большое спасибо
Safzam
@safzam Если вы используете Matlab или Python (numpy), у них уже есть функции автокорреляции. Если вам нужно что-то в C / C ++ / Java / что угодно, попробуйте здесь
Джим Клэй
Например, я использовал следующие два сигнала s1 и s2: s1 = [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1] s2 = [1, 0, 1, 1, 1, 0 , 1, 0, 0, 0, 1] r1 = numpy.correlate (s1, s1, mode = 'full') r2 = numpy.correlate (s2, s2, mode = 'full') Я использовал эти четыре строки в код Python. Я получил r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] и r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] и r1, и r2 дают одинаковую кривую радуги, похожую на форму. Как я могу определить в коде, что один сигнал является peroidc или почти периодическим или вообще не периодическим, спасибо
safzam
4

Ответ Джима заставил меня задуматься о том, как проверить это статистически. Это привело меня к автокорреляционному тесту Дурбина-Ватсона .

Обобщением этого является форма:

DW(τ)=n=τN1[U(n)U(nτ)]2n=0N1U(n)2

и моя попытка реализовать это в scilab:

// http://en.wikipedia.org/wiki/Durbin%E2%80%93Watson_statistic
s1 = [1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1];
s1n = s1 - mean(s1);
xs1 = xcorr(s1n,"unbiased");
N1 = length(xs1);

s2 = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
s2n = s2 - mean(s2);
xs2 = xcorr(s2n,"unbiased");
N2 = length(xs2);

dwstat1 = [];
dwstat2 = [];

for lag = 1:15,

    dxs1 = xs1((lag+1):N1) - xs1(1:(N1-lag));
    dxs2 = xs2((lag+1):N2) - xs2(1:(N2-lag));


    dwstat1 = [dwstat1 sum(dxs1.^2) / sum(xs1.^2)];
    dwstat2 = [dwstat2 sum(dxs2.^2) / sum(xs2.^2)];

end;

DW(τ)τ

Если я нанесу результат для наших двух последовательностей примеров:

введите описание изображения здесь

Тогда ясно, что вторая последовательность демонстрирует корреляцию при лагах 4, 8 и т. Д. И антикорреляцию при лагах 2, 6 и т. Д.

DW(τ)

Питер К.
источник
Спасибо за эту информацию. Infact Я делаю программу на Python, где я получаю много списков 0 и 1. Я хочу отделить периодические, случайные, серийные серии. Я пробую вышеупомянутую логику в python, но функция "xcorr" не в python, тогда я использовал функцию numpy.correlate (lst, lst, mode = 'full'). Также списки содержат около 70 000 списков 0 и 1 .. Я просто хочу определить, является ли этот список периодическим или нет ... если есть небольшая непериодичность, я могу избежать этого. любой дальнейший намек плз. заранее спасибо.
safzam