Як визначити, дискретний сигнал періодичний чи ні?


12

Хочу знати, як я можу визначити, чи є ряд даних періодичним чи ні.

Я хочу використовувати перетворення / серії Фур'є. Мої дані виглядають або аперіодично

[111100001111000110010101010000101]

або періодичні

[11001100110011001100]

і мені потрібно вирішити, що це автоматично. Які типи аналізів чи розрахунків можна виконати, щоб визначити, сигнал є періодичним чи ні?

Відповіді:


14

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

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

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

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

EDIT: Це приклад того, як визначити, чи є послідовності періодичними. Далі йде код 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
A(n)

1
@PeterK Добре.
Джим Клей

Ей, Джим, дякую ... Я трохи заплутався, як почати програмувати це, тому що де я коли-небудь шукаю про автокореляцію, я знаходжу складні формули, я дійсно не розумію, з чого почати і як визначити пік з періодом P у коді . У мене є список значень V [] = {110011001100 ..} тепер, як ввести їх у формули автокореляції та визначити, чи є її періодична чи ні ... Чи можете ви, будь ласка, дати мені трохи простий початок ... Дякую
сафзам

@safzam Якщо ви використовуєте Matlab або Python (numpy), вони вже мають функції автокореляції. Якщо вам потрібно щось на C / C ++ / Java / що завгодно, то спробуйте тут- dsprelated.com/showmessage/59527/1.php
Джим Клей

Наприклад, я використав наступні два сигнали s1 ans s2: s1 = [1, 1, 0, 1, 1, 0, 1, 1, 0, 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') Я використав ці чотири рядки в код пітона. Я отримав 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 дає однакову криву веселки, як форму. Як я можу в коді визначити, що один сигнал перодік або майже періодичний або взагалі не періодичний, спасибі
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. Я просто хочу визначити, є цей список періодичним чи ні ... якщо є невелика періодичність, я можу цього уникнути. будь-який подальший натяк PLZ. Заздалегідь спасибі.
сафзам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.