[an error occurred while processing this directive]
|
Первое и существенное. АКФ надо брать прямо в частотной области, т.е.
если S(m) - спектр сигнала s[n], то нам надо найти величину
Rs(k)= S * S (k), (1)
где "*" - операция линейной свертки.
Почему эта операция поможет найти период? Вы говорите, что Ваш сигнал состоит из суммы периодических сигналов. Сфокусируем внимание на том, что компоненты суммы - периодические сигналы, и каждая компонента имеет свой период. Одной компоненте будет соответствовать набор равноотстоящих друг от друга дельта-функций в частотной области (я их ранее называл палками). И если бы сигнал состоял только из одной периодической компоненты (точнее, из компоненты с одним периодом), то на спектре это бы было сразу же видно из того, что все дельта-функции равно отстоят друг от друга.
Теперь перейдем к Вашим реалиям. У Вас есть не одна, а три (или более) компонент. Каждая имеет свой период. Каждой на спектре будет соответствовать свой набор равноотстоящих друг от друга дельта-функций. Только теперь у нас на спектре все будет вперемешку. Нам надо отделить одну периодическую последовательность дельта-функций от другой. Как это сделать?
Я предложил следующий способ. Вернемся опять к примеру, когда мы имеем дело только с одной компонентой; соответсвенно, в частотной области у нас будет только одна последовательность равноотстоящих "палок". Если мы возьмем и вычислим АКФ этих "палок" по формуле (1), то получим также последовательность периодических затухающих палок с тем же периодом, но эта последовательность будет иметь ярко выраженный максимум в нуле, а следующее за ним по величине значение будет в точке, равной периоду последовательности. В промежутках между палками будут лишь незначительные шумы. Поэтому после вычисления АКФ по формуле (1) надо просто найти первый максимум (в нуле, поэтому его и искать особенно нечего) и первую палку, превышающую некоторый выбранный порог (если бы не случай двух, трех и более компонент, то можно было бы говорить вторую по величине палку, но мы намеренно не будем акцентировать внимание на этом обстоятельстве). Взять расстояние между ними - это и будет период последовательности. Величину порога удобно взять как некоторый процент от величины центральной (нулевой) палки.
Теперь если у нас есть две или более компонент суммы, то в силу линейности АКФ метод будет тем же с той лишь поправкой, что расстояние между главной палкой (что в нуле) и положением на оси абсцисс второй палки будет соответствовать первой компоненте, а расстояние между нулем и положением третьей палки - второй компоненте, и т.д. Здесь в принципе возможны случаи, обработку которых я не хочу описывать, поскольку работа рутинная. Упомяну лишь о них, а Вы сами решите, бывает ли у Вас такое, или нет.
Описанный выше способ идеально работает, когда разброс в периодах компонент не будет сильным, т.е. когда период компоненты с наибольшим периодом меньше удвоенного периода компоненты с наименьшим периодом. Если это не так, то задача по-прежнему решается. Поправка будет в том, что при рассмотрении расстояния между нулем и третьей палкой надо посмотреть, не является ли эта третья палка кратным значением уже найденного периода. Эта проблема легко устраняется решетом Эратосфена, применяемого, например, в хорошо известном методе поиска простых чисел.
Еще одна проблема может возникнуть, если допускается наличие компонент с кратным периодом. Она сложнее, но все равно решается. Если нужно будет - напишите, я опишу, как я бы ее решил. Впрочем, думаю, что и Вы без труда найдете способ ее решения.
E-mail: info@telesys.ru