Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сравнение сигнала с эталонами
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Sergey Krivonosov
Добрый вечер! Есть массив 128 точек выборок, который соответствует периоду сигнала. Есть 100 эталонов сигнала, которые представляют так же 128 точек выборок, равное периоду сигнала. Необходимо определить насколько сигнал похож на эталон. Проблема заключается в том, что сигнал может отличатся по фазе с эталоном и зачастую искажен. Если тупо перебором, то нужно сравнить 128*128 (со сдвигом) для одного эталона. Это очень долго. Подозреваю, что данная проблема решается с помощью преобразований Фурье, но как приступить я не знаю. Может кто то подскажет метод решения.
seniorandre
Цитата(Sergey Krivonosov @ Dec 18 2017, 19:22) *
Подозреваю, что данная проблема решается с помощью преобразований Фурье, но как приступить я не знаю. Может кто то подскажет метод решения.

Cуществуют конечно научный способы вычисления корреляции, но можно попробовать по типу разложения по квадратурам. Сдвинуть тестовый сигнал на 90гр. и сделать перемножение сигнала на две квадратуры тестового сигнала, а потом посчитать что то типа модуля.
Ну либо если нужен научный метод, то искать алгоритмы вычисления корреляции.
_pv
128*128*100 == 1.6E6 умножений, на калькуляторе считаете, что очень долго получается? насколько надо быстро?
преобразованием Фурье проблема решается в том смысле, что амплитуда спектра от фазы не зависит, так что если эталоны настолько разные что у них амплитуды спектров отличаются настолько что информацию о фазе можно выкинуть, то считайте Фурье и сравнивайте только амплитуды в частотной области.
если одной амплитуды не хватит, то фазы при сдвиге отличаются только добавлением линейной зависимости к*w, соответственно можно наверное в первом приближении просто вычесть линейный фит из ФЧХ и сигнала и эталонов, убрав тем самым неизвестный сдвиг по фазе.
el.d
Цитата(seniorandre @ Dec 18 2017, 18:12) *
Cуществуют конечно научный способы вычисления корреляции, но можно попробовать по типу разложения по квадратурам. Сдвинуть тестовый сигнал на 90гр. и сделать перемножение сигнала на две квадратуры тестового сигнала, а потом посчитать что то типа модуля.
Ну либо если нужен научный метод, то искать алгоритмы вычисления корреляции.

Это называется преобразование Гильберта.

Только зачем оно здесь? Разве в описанном методе есть какое-то сравнение сигнала с эталоном?

Что касается вопроса ТС. Да, можно применить преобразование Фурье.

Для сравнения сигналов используют понятие корреляции. Вычисление корреляции двух сигналов = вычисление свёртки этих двух сигналов.

БПФ можно использовать для вычисления так называемой быстрой свёртки. В спектральной области свёртка заменяется на простое умножение.

То есть, схема примерно такая: есть принятый сигнал s(t) и набор эталонов Ai(t). Вычисляем БПФ[s(t)] и БПФ[Ai(t)]. Вычисляем x = БПФ[s(t)]*БПФ[Ai(t)]. В конце вычисляем ОБПФ[x].
Sergey Krivonosov
Цитата(seniorandre @ Dec 18 2017, 19:12) *
Cуществуют конечно научный способы вычисления корреляции, но можно попробовать по типу разложения по квадратурам. Сдвинуть тестовый сигнал на 90гр. и сделать перемножение сигнала на две квадратуры тестового сигнала, а потом посчитать что то типа модуля.
Ну либо если нужен научный метод, то искать алгоритмы вычисления корреляции.

Спасибо за подсказку, я не мог понять, где взять мнимую часть сигнала. Действительно сдвинув сигнал на 90 градусов я получаю мнимую часть сигнала. Для одной свертки я должен получить 4 массива: M1, M2, M3, M4, где M1 cos сигнала, M2 sin сигнала, M3 cos эталона, M4 sin эталона. Отдельно суммирую от n=0..127: M1(n)*M3(n) - M2(n)*M4(n) и M1(n)*M4(n)+M3(n)*M2(n). Затем эти суммы возвожу в квадрат и суммирую и извлекаю корень квадратный. Что мне даст эта свертка? Я так понимаю, что если сигналы совпадают я получу максимальное значение амплитуды?



Цитата(el.d @ Dec 19 2017, 08:37) *
Это называется преобразование Гильберта.

Только зачем оно здесь? Разве в описанном методе есть какое-то сравнение сигнала с эталоном?

Что касается вопроса ТС. Да, можно применить преобразование Фурье.

Для сравнения сигналов используют понятие корреляции. Вычисление корреляции двух сигналов = вычисление свёртки этих двух сигналов.

БПФ можно использовать для вычисления так называемой быстрой свёртки. В спектральной области свёртка заменяется на простое умножение.

То есть, схема примерно такая: есть принятый сигнал s(t) и набор эталонов Ai(t). Вычисляем БПФ[s(t)] и БПФ[Ai(t)]. Вычисляем x = БПФ[s(t)]*БПФ[Ai(t)]. В конце вычисляем ОБПФ[x].

Предположим я вычислил БПФ и получил амплитуды разных частот. На какое количество частот разбить сигнал? Для каждой частоты нужно произвести свертку. Если частот много - это слишком затратно по вычислениям, даже если применить БПФ. Не пройдет ли одна свертка с эталоном сигнала, как я написал выше?
maugli
Почитайте про согласованный фильтр.
el.d
Цитата(Sergey Krivonosov @ Dec 19 2017, 10:42) *
Спасибо за подсказку, я не мог понять, где взять мнимую часть сигнала. Действительно сдвинув сигнал на 90 градусов я получаю мнимую часть сигнала. Для одной свертки я должен получить 4 массива: M1, M2, M3, M4, где M1 cos сигнала, M2 sin сигнала, M3 cos эталона, M4 sin эталона. Отдельно суммирую от n=0..127: M1(n)*M3(n) - M2(n)*M4(n) и M1(n)*M4(n)+M3(n)*M2(n). Затем эти суммы возвожу в квадрат и суммирую и извлекаю корень квадратный. Что мне даст эта свертка? Я так понимаю, что если сигналы совпадают я получу максимальное значение амплитуды?




Предположим я вычислил БПФ и получил амплитуды разных частот. На какое количество частот разбить сигнал? Для каждой частоты нужно произвести свертку. Если частот много - это слишком затратно по вычислениям, даже если применить БПФ. Не пройдет ли одна свертка с эталоном сигнала, как я написал выше?

Ну вы писали, что у вас сигнал из 128 отсчетов. Следовательно, БПФ тоже должен быть на 128 точек - получается, для сравнения сигнала с одним из эталонов надо 2 БПФ, 128 умножений и ОБПФ.
_pv
Цитата(el.d @ Dec 19 2017, 16:37) *
получается, для сравнения сигнала с одним из эталонов надо 2 БПФ, 128 умножений и ОБПФ.

с учётом того, что БПФ на обычных МК вроде кортексов делаются за ~100 тактов на отсчёт, на таких коротких выборках делать 2 раза БПФ, туда и обратно, (для эталонов можно посчитать заранее) получается не быстрее чем тупо посчитать корреляцию за 128*128 умножений во временной области.
el.d
Цитата(_pv @ Dec 19 2017, 11:49) *
с учётом того, что БПФ на обычных МК вроде кортексов делаются за ~100 тактов на отсчёт, на таких коротких выборках делать 2 раза БПФ, туда и обратно, (для эталонов можно посчитать заранее) получается не быстрее чем тупо посчитать корреляцию за 128*128 умножений во временной области.

Да, скорее всего выигрыш от вычисления свёртки через БПФ будет весомым для бОльшего количества точек. Правда, ТС ничего про МК не говорил.
Sergey Krivonosov
Цитата(el.d @ Dec 19 2017, 12:37) *
Ну вы писали, что у вас сигнал из 128 отсчетов. Следовательно, БПФ тоже должен быть на 128 точек - получается, для сравнения сигнала с одним из эталонов надо 2 БПФ, 128 умножений и ОБПФ.

Не так, для построения БПФ на 128 частот потребуется применить 127 "бабочек". Каждая бабочка это 4 умножения и 4 суммирования. Следовательно, умножений нужно сделать 127*4=508. Для эталонов БПФ выполнять не нужно, его можно выполнить 1 раз и забить в память. После БПФ нам нужно рассчитать амплитуду сигнала для каждой из 128 частот. Т.е. возвести в квадрат действительную и мнимую часть, сложить и найти корень квадратный. И можно сравнивать с амплитудами эталонов забитыми в память. Зачем мне делать обратное преобразование Фурье?
el.d
Цитата(Sergey Krivonosov @ Dec 19 2017, 12:12) *
Не так, для построения БПФ на 128 частот потребуется применить 127 "бабочек". Каждая бабочка это 4 умножения и 4 суммирования. Следовательно, умножений нужно сделать 127*4=508. Для эталонов БПФ выполнять не нужно, его можно выполнить 1 раз и забить в память. После БПФ нам нужно рассчитать амплитуду сигнала для каждой из 128 частот. Т.е. возвести в квадрат действительную и мнимую часть, сложить и найти корень квадратный. И можно сравнивать с амплитудами эталонов забитыми в память. Зачем мне делать обратное преобразование Фурье?

Потому что корреляционная функция (результат свёртки принятого сигнала с эталоном) - это функция от времени. После применения БПФ к принятому сигналу или к эталону получается функция от частоты.

Не надо никакие амплитуды считать. Тем более, что амплитуда у принятого сигнала очень вряд ли будет для всех наблюдений постоянной. Или в вашей системе если у принятого сигнала амплитуда меньше чем у эталона, но временная диаграмма один в один - то это уже не совпадение? Вам тут уже правильно подсказали почитать про согласованный фильтр.
Sergey Krivonosov
Цитата(el.d @ Dec 19 2017, 13:24) *
Потому что корреляционная функция (результат свёртки принятого сигнала с эталоном) - это функция от времени. После применения БПФ к принятому сигналу или к эталону получается функция от частоты.

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

Вы правильно написали, что амплитуды будут разные. Но амплитуды можно нормировать. Амплитуда, как раз и отвечает за отклик на ту или иную частоту и сравнивать я могу только амплитуды (как иначе, что с чем я должен сравнивать. Только мне нужно не теоретически, а что с чем я должен сравнить?).
После БПФ мы можем построить амплитудно-частотную характеристику, которую можно сравнить с эталоном.
el.d
Цитата(Sergey Krivonosov @ Dec 19 2017, 12:36) *
Вы правильно написали, что амплитуды будут разные. Но амплитуды можно нормировать. Амплитуда, как раз и отвечает за отклик на ту или иную частоту и сравнивать я могу только амплитуды (как иначе, что с чем я должен сравнивать. Только мне нужно не теоретически, а что с чем я должен сравнить?).
После БПФ мы можем построить амплитудно-частотную характеристику, которую можно сравнить с эталоном.

Например, пик корреляционной функции сравнивать с неким порогом. Или сравнивать отклики корреляторов между собой и выбирать наибольший. Как выбрать порог - зависит от задачи. Вообще, то, что вам надо - это самая обычная задача различения сигналов. В любом учебнике по статистической радиотехнике написано, как это делать оптимально в том или ином смысле.
Sergey Krivonosov
Цитата(el.d @ Dec 19 2017, 13:40) *
Например, пик корреляционной функции сравнивать с неким порогом. Или сравнивать отклики корреляторов между собой и выбирать наибольший. Как выбрать порог - зависит от задачи. Вообще, то, что вам надо - это самая обычная задача различения сигналов. В любом учебнике по статистической радиотехнике написано, как это делать оптимально в том или ином смысле.

Хотелось бы конкретную привязку. На вход БПФ я подаю сигнал, который представляет 128 выборок. Если бы я делал в аналоговом виде, то мне нужно было бы поставить 128 фильтров, каждый из которых пропускает только свою частоту (настроены на разные частоты). На выходе каждого фильтра я получаю синусоиду одной данной частоты. Поэтому мне надо поставить после каждого фильтра выпрямитель и мерить амплитуду после каждого фильтра.
В цифровом виде в качестве выпрямителя и будет вычисление амплитуды.
Цитата
Вычисляем БПФ[s(t)] и БПФ[Ai(t)]. Вычисляем x = БПФ[s(t)]*БПФ[Ai(t)]. В конце вычисляем ОБПФ[x].


Зачем делать обратное преобразование Фурье (ОБПФ) и что с чем сравнивать я так и не понял?

По поводу БПФ, я его рассматриваю, как запасной вариант. Прежде всего я хотел бы понять, можно ли делать сравнение по свертке входного сигнала с эталоном. Особенно, когда входной сигнал сдвинут по фазу относительно эталона. Т.к. это более простой быстрый метод.
el.d
Цитата(Sergey Krivonosov @ Dec 19 2017, 13:53) *
Хотелось бы конкретную привязку. На вход БПФ я подаю сигнал, который представляет 128 выборок. Если бы я делал в аналоговом виде, то мне нужно было бы поставить 128 фильтров, каждый из которых пропускает только свою частоту (настроены на разные частоты). На выходе каждого фильтра я получаю синусоиду одной данной частоты. Поэтому мне надо поставить после каждого фильтра выпрямитель и мерить амплитуду после каждого фильтра.
В цифровом виде в качестве выпрямителя и будет вычисление амплитуды.


Зачем делать обратное преобразование Фурье (ОБПФ) и что с чем сравнивать я так и не понял?

По поводу БПФ, я его рассматриваю, как запасной вариант. Прежде всего я хотел бы понять, можно ли делать сравнение по свертке входного сигнала с эталоном. Особенно, когда входной сигнал сдвинут по фазу относительно эталона. Т.к. это более простой быстрый метод.

Вы видимо пропустили то сообщение, где я говорил, что БПФ как раз и используем для вычисления свёртки принятого сигнала с эталоном.

Еще раз: свёртка[принятый сигнал,эталон] = ОБПФ[БПФ[принятый сигнал]*БПФ[эталон]].

Это так называемая быстрая свёртка, по результатам - ничем не хуже классической. Доказательство можно посмотреть в любом учебнике по ЦОС.

Однако, данный метод точно дает ускорение в случае относительно большого числа точек БПФ (тысячи). Даст ли этот метод прирост в вашем случае - зависит от того, что и как делать.
Alex11
Очень я сомневаюсь, что Фурье в этом случае будет хорош. Проблема в том, что есть всего один период. Если не накладывать окно, то спектр будет размазан за счет разрывов на краях. Если наложить окно - останется очень мало эффективных точек. Мне кажется, что корреляция будет лучше, но проведенная на двойной длинне эталона.
Sergey Krivonosov
Цитата(Alex11 @ Dec 19 2017, 17:17) *
Очень я сомневаюсь, что Фурье в этом случае будет хорош. Проблема в том, что есть всего один период. Если не накладывать окно, то спектр будет размазан за счет разрывов на краях. Если наложить окно - останется очень мало эффективных точек. Мне кажется, что корреляция будет лучше, но проведенная на двойной длинне эталона.

Да у меня есть полная запись сигнала за 1 период. Затем он повторяется без разрывов. Я могу повторить нужное количество периодов. Это мне что то даст?
Alex11
Цитата
Затем он повторяется без разрывов.

А частота оцифровки строго кратна периоду сигнала? Если нет - как тогда строго повторить без разрыва, если только не снимать сигнал с АЦП дальше? И с какой скоростью реакции нужно опознать сигнал, как часто он изменяется?
Sergey Krivonosov
Цитата(Alex11 @ Dec 19 2017, 18:33) *
А частота оцифровки строго кратна периоду сигнала? Если нет - как тогда строго повторить без разрыва, если только не снимать сигнал с АЦП дальше? И с какой скоростью реакции нужно опознать сигнал, как часто он изменяется?

Частота оцифровки строго кратна периоду сигнала. Сигнал поступает до тех пор пока не распознается. Распознать хотелось бы максимально быстро.
krux
сравнение БПФ сигнала по всему диапазону выборок с БПФ эталона по всему диапазону выборок вам ничего не даст. так вы сравните две средних температуры по двум больницам.

гуглите по ключевым словам "Критерий оптимальности", "согласованный фильтр".
также определитесь, что вам нужно, или что важнее.
например "минимизация вероятности пропуска события", или "минимизация вероятности ложного срабатывания" и т.п.
Alex11
Цитата
Частота оцифровки строго кратна периоду сигнала.

Если так, то можно попробовать и через Фурье, но проверьте лучше, как будет выглядеть спектр от одного периода. А дальше будут вопросы, поставленные в предыдущем посте. Нужно понять, что же Вы ищете, и насколько сигналы отличаются друг от друга.
Sergey Krivonosov
Большое спасибо всем за оперативные ответы! Далее буду самостоятельно разбираться.
_pv
Цитата(krux @ Dec 20 2017, 00:28) *
сравнение БПФ сигнала по всему диапазону выборок с БПФ эталона по всему диапазону выборок вам ничего не даст. так вы сравните две средних температуры по двум больницам.

а это зависит от сигналов, если, например, эталоны просто набор синусов с разными частотами, то сравнение только амплитуд спектров, выкинув при этом фазу, так как она неизвестна и только мешает, может и сработать, соответственно без "перебора" всех фаз корреляцией
но опять же на коротких выборках радости от быстрого преобразования Фурье не особо много.
krux
Цитата(_pv @ Dec 20 2017, 18:11) *
а это зависит от сигналов, если, например, эталоны просто набор синусов с разными частотами, то сравнение только амплитуд спектров, выкинув при этом фазу, так как она неизвестна и только мешает, может и сработать, соответственно без "перебора" всех фаз корреляцией
но опять же на коротких выборках радости от быстрого преобразования Фурье не особо много.

для начала я попрошу вас проверить все ваши эталоны. друг относительно друга.
что вы будете делать, если их БПФ будут в достаточной для вас степени "одинаковы"?

зы. в любом случае речь должна идти о критерии оптимальности. В противном случае вам придется объяснять вашим клиентам, почему вы самая лучшая на свете гадалка.
_pv
Цитата(krux @ Dec 20 2017, 22:26) *
для начала я попрошу вас проверить все ваши эталоны. друг относительно друга.

меня просить не надо, это к ТС.
я лишь сказал что если, ЕСЛИ, амплитуды спектров у эталонов отличаются достаточно чтобы сравнивать сигналы только по ним, то тогда фазу можно просто выкинуть, решив тем самым проблему ТС, который фазу и не знает. ну а нет - так нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.