Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Определение периода сложного сигнала
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Ctrl-Alt-De1
Есть сигнал, принятый с платы АЦП (ЛА-н10м8PCI100Mhz) Необходимо определить его период. Подскажите пожалуйста алгоритмы, с помощью которых это можно было бы сделать.
Пример сигнала:Нажмите для просмотра прикрепленного файла
GetSmart
Вообще, классический способ для сигналов со сложным спектром - корелляция. Но на картинке сигнал больше похож на АМ. И тут может другой способ даст лучший результат. Сперва выпрямление, а потом...
Ctrl-Alt-De1
Автокорреляция дает следующую картину:Нажмите для просмотра прикрепленного файла
И что теперь с ней делать?
GetSmart
Расстояние между вершинами = период.
Ctrl-Alt-De1
Цитата(GetSmart @ Nov 28 2009, 00:19) *
Расстояние между вершинами = период.


Это конечно хорошо, вот только как определить это расстояние, я не знаю. Есть идея построить огибающую автрокорреляции, а затем проаппроксимировать ее синусоидой, а уже у синусоиды с известным аналитическим выражением легко определить период... Вот только как-то это все мне не очень нравится. Может есть другие варианты? Кстати, можете рассказать алгоритм построения огибающей и аппроксимации синусоидой? А то google что-то ничего толкового не находит...
SM
Сигнал чем-то напоминает речь... С виду... Может поможет - но есть немало информации (в сети, в описаниях вокодеров) по оценке периода основного тона речевого сигнала. Очень возможно, что это то, что Вам нужно.

Что касается вашей АКФ - фильтрануть ее ФНЧ, и потом просто найти максимумы.
Ctrl-Alt-De1
А вот для этого сигнала(тот, что сверху), АКФ дает совершенно невразумительный результат(тот, что снизу). Как же быть? Ведь это сигнал с одного и того же датчика...
Нажмите для просмотра прикрепленного файла
serebr
Цитата(Ctrl-Alt-De1 @ Nov 28 2009, 01:07) *
Автокорреляция дает следующую картину:Нажмите для просмотра прикрепленного файла
И что теперь с ней делать?

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

P.S. Судя по картинке исходного сигнала, здесь мы имеем дело с акустическим устройством, например пьезокерамическим приёмником. Причём характерный резонанс составляет около 10 отсчётов АЦП. После вычисления автокорреляции период основной (резонансной) частоты колебаний удваивается и становится равным примерно 5 отсчётам. Значит достаточно ВЧ фильтра, убирающего колебания на графике автокорреляции с периодом помехи большим, чем примерно 5 отсчётов АЦП.

P.P.S. Для работы с источниками сигнала, имеющими достаточно выраженный резонансный характер, хорошо подходит технология Гильберт-преобразования с центральной частотой, равной резонансной частоте. После этого из двух квадратур вычисляется модуль вектора (алгоритм CORDIC), т.е. огибающая сигнала.
Огибающая сигнала, найденная по такой схеме, будет гладкой функцией без паразитных колебаний. Её автокорреляционная функция тоже будет гладкой.
Ctrl-Alt-De1
serebr, спасибо, будем читать smile.gif
serebr
Ctrl-Alt-De1 - выложи файл с данными исходной картинки. Я посчитаю через преобразование Гильберта и выложу результат - картинку.
Ctrl-Alt-De1
Файл бинарный, содержит двухбайтовые целые с прямым порядком байт. Это только малая часть файла, весь слишком долго загружать (~50Мб), но думаю этого достаточно для примера
Signal.dat
serebr
Сигнал, похоже, обрезан (ограничен) по амплитуде значениями от -128 до +127. На ограничениях алгоритм будет работать некорректно. На самой первой картинке сигнал был необрезан, подобного нет?
Ctrl-Alt-De1
На первой картинке просто амплитуда сигнала не превысила 127. Но, видимо так происходит не всегда sad.gif. сам только сейчас заметил. АЦП то 8-ми разрядный, отсюда и ограничение...
serebr
Результат обработки приведен на картинке.
Первый график - исходный сигнал.
Второй - исходный + квадратура после преобразования Гильберта
Третий - модуль вектора (огибающая сигнала)
Четвёртый - автокорреляция
Красными прямоугольниками показаны области ограничения исходного сигнала и соответствующие им погрешности в работе алгоритма (паразитные колебания огибающей).

P.S. Дополнительной фильтрации по высоким частотам не потребовалось.
Нажмите для просмотра прикрепленного файла
GetSmart
Цитата(serebr @ Nov 29 2009, 09:30) *
Четвёртый - автокорреляция

АКФ какого сигнала? Огибающей или исходного?
serebr
Цитата(GetSmart @ Nov 29 2009, 10:22) *
АКФ какого сигнала? Огибающей или исходного?

АКФ исходного сигнала уже приводилась выше автором темы, там есть колебания с удвоенной собственной частотой приёмника.
На моём графике АКФ от огибающей сигнала.
GetSmart
Цитата(serebr @ Nov 29 2009, 10:24) *
На моём графике АКФ от огибающей сигнала.

Я так и подумал smile.gif
В понедельник придёт fontp и "мозги всем прочистит" biggrin.gif

Просто на графике АМ (огибающей) виден период даже лучше чем на АКФ от огибающей. И вообще, изначальный вопрос автора темы для такого сигнала сформулирован просто не верно. В сигнале есть куча периодов (принципиально разных сигналов) и не понятно какой из них нужен автору и по каким критериям его выделять на фоне остальных периодов.
serebr
Цитата(GetSmart @ Nov 29 2009, 10:37) *
Я так и подумал smile.gif
В понедельник придёт fontp и "мозги всем прочистит" biggrin.gif

Просто на графике АМ (огибающей) виден период даже лучше чем на АКФ от огибающей. И вообще, изначальный вопрос автора темы для такого сигнала сформулирован просто не верно. В сигнале есть куча периодов (принципиально разных сигналов) и не понятно какой из них нужен автору и по каким критериям его выделять на фоне остальных периодов.

Автор темы на первом графике наглядно показал, какой период ему нужно найти. Мне этого было достаточно для понимания условий задачи.
GetSmart
Точно указал. Я невнимательно её рассмотрел.
Ну тогда моё имхо - на графике огибающей проще выделить пики, используя порог срабатывания и гистерезис. И уже по этим приблизительным позициям искать пик на АКФ от этой огибающей.
serebr
Цитата(GetSmart @ Nov 29 2009, 10:37) *
Просто на графике АМ (огибающей) виден период даже лучше чем на АКФ от огибающей.

На графике в данном конкретном случае может быть что-то и лучше видно, спорить не буду. Но общий принцип такой: нужно стараться использовать статистические характеристики сигнала (такие, например, как автокорреляция) и избегать алгоритмов, работа которых может быть нарушена из-за одиночного выброса (помехи) в сигнале.
GetSmart
Если расстояние между пиками (период) будет непостоянное, то в АКФ нужно будет использовать буквально 1-2 периода сигнала. Почти замкнутый круг. Во всяком случае пару итераций определения АКФ потребуется.
Ctrl-Alt-De1
В одном кадре данных (484 отсчета) нужно определить один период. Если пики идут неравномерно, то надо найти какой-то средний период.
Tanya
Цитата(Ctrl-Alt-De1 @ Nov 29 2009, 09:34) *
В одном кадре данных (484 отсчета) нужно определить один период. Если пики идут неравномерно, то надо найти какой-то средний период.


Нет никакой волшебной формулы (алгоритма) для нахождения того, что Вам нужно, если не знать, чего....
"Ты скажи мне, ты скажи мне..."
Вы сами должны знать, что мы имеем и что хотим, или - модель.
К примеру - сигнал должен быть описан формулой.... с параметрами.... в диапазоне..... весовая функция....
То, что Вы пишите, не помогает...
Ctrl-Alt-De1
Не знаю, насколько правильно я реализовал алгоритмы, но у меня получилось вот это:
Нажмите для просмотра прикрепленного файла
Красный - исходный сигнал, синий - огибающая ( найдена по методом перобразования Гильберта), зеленый АКФ.
P.S. Насколько я заметил, на глаз период в одном окне (484 отсчета) постоянен в пределах небольшой погрешности.
GetSmart
А почему пики на АКФ имеют другой период относительно пиков на огибающей? На первый взгляд в 2 раза реже.
Ctrl-Alt-De1
Потому, что масштаб по осям разный

Насколько я понял принцип АКФ, количество отсчетов в ней в 2 раза меньше, чем было в исходной функции. Поправьте меня, если я ошибаюсь.
GetSmart
Цитата(Ctrl-Alt-De1 @ Nov 29 2009, 15:16) *
Насколько я понял принцип АКФ, количество отсчетов в ней в 2 раза меньше, чем было в исходной функции. Поправьте меня, если я ошибаюсь.

Совсем нет. Какое перекрытие, столько и отсчётов. В общем на 1 период сигнала будет меньше отсчётов. В АКФ важно найти только первый пик (если нулевую точку считать нулевым пиком), остальные не нужны.
Ctrl-Alt-De1
Для вычисления АКФ я беру первую половину синала, и накладываю на нее часть синала такого же размера, но смещенную относительно первой половины на 1,2,3 и т. д. отсчетов. Наверное ничего не понятно, поэтому вот код, который это делает:
Код
r:=0;
for i:=0 to (n div 2)-1 do
begin
  for j:=0 to (n div 2)-1 do
  begin
   r:=r+Around[j]*Around[j+i];
  end;
  Form1.Series4.AddY(r);
  r:=0;
end;
Ctrl-Alt-De1
Ладно, будем считать, что алгоритмы реализованы правильно. Теперь я не очень понимаю, как определить местоположение пика на графике АКФ?
bahurin
Цитата(Ctrl-Alt-De1 @ Nov 29 2009, 16:37) *
Ладно, будем считать, что алгоритмы реализованы правильно. Теперь я не очень понимаю, как определить местоположение пика на графике АКФ?


в максимуме производная равна 0. Берете производную методом конечных разностей и ищите момент когда она сменит знак. Это и есть экстремум. Потом проверяете что это максимум.
RadioJunior
Цитата(Ctrl-Alt-De1 @ Nov 29 2009, 16:37) *
Ладно, будем считать, что алгоритмы реализованы правильно. Теперь я не очень понимаю, как определить местоположение пика на графике АКФ?


max( abs(АКФ) ) не покатит? rolleyes.gif
thermit
Обычно, центр массы находят.
От, например максимум имеет индекс 1002

i=[1000 1001 1002 1003 1004];
R=[0.8 0.98 0.99 0.95 0.95];

sum(i.*R)/sum® это и будет центр масс (~1002.05)


® Хрень какая... ЦЕ
Ctrl-Alt-De1
RadioJunior, max( abs(АКФ) ) =0. Всегда, поэтому не покатит. thermit, ничего не понял. bahurin, спасибо, будем пробовать.
serebr
Цитата(Ctrl-Alt-De1 @ Nov 30 2009, 19:57) *
RadioJunior, max( abs(АКФ) ) =0. Всегда, поэтому не покатит. thermit, ничего не понял. bahurin, спасибо, будем пробовать.

Остальные участники обсуждения, видимо, понимают, что максимальное значение АКФ позиционно располагается в нулевой точке. Это связано с тем, что в данном кокретном случае сигнал больше всего коррелирован сам с собой, поскольку имеет место свёртка импульсного отклика с передаточной характеристикой приёмника.
Поэтому надо пропустить первые несколько значений abs(АКФ) и только потом начинать искать максимум. Или как правильно говорили выше, искать именно точку, имеющую меньшие значения по обе стороны от неё самой. Очевидно, что нулевая точка на графике abs(АКФ) не имеет предшествующего значения, поэтому при данном подходе не будет определяться как максимум.
Ctrl-Alt-De1
Это конечно все хорошо, но как быть в таком сложном случае?
Нажмите для просмотра прикрепленного файла
serebr
Цитата(Ctrl-Alt-De1 @ Nov 30 2009, 20:17) *
Это конечно все хорошо, но как быть в таком сложном случае?

В этом случае можно искать все максимумы, а затем из них выбирать тот, который имеет наибольшее значение.
RadioJunior
Цитата(Ctrl-Alt-De1 @ Nov 30 2009, 17:17) *
Это конечно все хорошо, но как быть в таком сложном случае?
Нажмите для просмотра прикрепленного файла

А Вам какая точность нужна? Если "качественная", то на "глаз", как Вы уже и делали.

2 serebr - вопрос изначально был
Цитата(Ctrl-Alt-De1 @ Nov 29 2009, 16:37) *
Ладно, будем считать, что алгоритмы реализованы правильно. Теперь я не очень понимаю, как определить местоположение пика на графике АКФ?

Если бы здесь говорилось не о центральном пике, а о остальных, то я бы не написал max( abs (АКФ) ) rolleyes.gif
Ctrl-Alt-De1
Я имею ввиду, что иногда первый пик не является искомым. Надо каким-то образом определить высоту пика.
RadioJunior
Цитата(Ctrl-Alt-De1 @ Nov 30 2009, 17:33) *
Я имею ввиду, что иногда первый пик не является искомым. Надо каким-то образом определить высоту пика.

Можете показать картинку спектра Вашего "сложного" сигнала?
Ctrl-Alt-De1
Сверху исходный сигнал, снизу его преобразование Фурье:
Нажмите для просмотра прикрепленного файла
Sergey'F
Цитата(Ctrl-Alt-De1 @ Nov 30 2009, 20:26) *
Сверху исходный сигнал, снизу его преобразование Фурье

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

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

Пока по всех примерах, что Вы привели, IMHO, можно обойтись без выделения огибающей и автокорреляции. Хватит полосового фильтра и последующего преобразования Фурье.
GetSmart
Цитата(Sergey'F @ Dec 1 2009, 14:21) *
Пока по всех примерах, что Вы привели, IMHO, можно обойтись без выделения огибающей и автокорреляции. Хватит полосового фильтра и последующего преобразования Фурье.

А на Фурье что потом искать?
Sergey'F
Цитата(GetSmart @ Dec 1 2009, 11:37) *
А на Фурье что потом искать?

Да, лучше сначала выпрямить. В общем-то то, о чем Вы писали уже - похоже на АМ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.