Easyelectronics.ru

Электроника для всех
Текущее время: 23 окт 2019, 18:13

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 24 сен 2015, 10:02 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Пусть имеется источник сигналов с нелинейно меняющейся со временем частотой, например упрощенно f(t,a)=a*t^2,
где f - частота, t - время, a - коэффициент. Необходимо обнаружить наличие данных сигналов, время их начала и константу (a).
Я подошёл к решению этой задачи следующим образом:
1) Берётся БПФ с небольшим шагом и достаточным числом точек для получения спектра, из которых строится спектрограмма. По сути эта спектрограмма простая двухмерная картинка, по вертикали - частоты, по горизонтали - время.
2) Грубым перебором всех возможных коэффициентов a я строю гистограмму. Гистограмма получается путём сложения всех амплитуд спектрограммы, попадающих в точки X,Y ( Y=f(X,a) ). Из гистограммы можно найти максимумы, которые и будут соответствовать искомым a. Как ни странно, перебор оказался лучше, чем преобразование Хафа для той же функции.
Всё работает, но хотелось бы улучшить результат.

Не смотря на то, что сигнал имеет очень много реверберации и шума, зрительно и на слух я могу безошибочно найти эти коэффикиенты. Алгоритм описанный выше даёт где-то 60% распознавания, т.е. почти половина сигналов теряется.
Сделать простую длинную корреляцию мешает реверберация, т.к. она портит фазу до неузнаваемости. Сгенерированный вручную сигнал с примесью шума я определял корреляцией во всех случаях, и с удивлением обнаружил что в реальности фаза скачет, практически нарезка случайных чисел.

Может быть кто подкинет идей в какую сторону думать? У меня есть идея, что если вместо синусоид делать ДПФ кусочками чирпов, то это улучшит результат, но как это сделать для определённой функции не знаю.
Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 24 сен 2015, 10:29 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 май 2015, 11:06
Сообщения: 90
Откуда: Мирный (Якутия)
Хорошо бы пару картинок! :-)
Пытался я с ЛЧМ сигналами работать... Но по разрешению все-таки корреляция с чистыми sin/cos дала более высокое разрешение.
Пока использую непрерывный вейвлет-анализ (несколько модифицированный).
Вот пример обработки звукового файла (вой волка тундрового):
Вложение:
Волк1.JPG
Волк1.JPG [ 53.92 Кб | Просмотров: 2192 ]

Исходный файл:
Вложение:
Волк_тундровый.rar [40.21 Кб]
Скачиваний: 80


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 24 сен 2015, 11:53 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Вот пример.
На цветной картинке с красно-зелёными линиями один из вариантов алгоритма.
Симметричная красивая красно-зелёная "птичка" - это я по формуле сгенерировал искусственный синусоидальный сигнал F(a,b,c,t) и наложил на реальную запись.

Реальные сигналы очень похожи на искусственный, но представляют собой сумму функций
F(a+da1,b+db1,c+dc1,t+dt1)+F(a+da2,b+db2,c+dc2,t+dt2)+...F(a+daN,b+dbN,c+dcN,t+dtN). Где
da,db,dc,dt меняются в небольшой окрестности относительно искомой величины. Это как если бы запись волка тундрового сдвинули по времени несколько раз на dt, ускорили и замедлили на некторые da,db,dc и все эти записи сложили друг с другом.

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

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

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

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


Вложения:
Комментарий к файлу: Пример чирпов
chirps.zip [101.97 Кб]
Скачиваний: 80
Комментарий к файлу: Спектрограмма с поиском кривых и прямых линий
spectrum2.png
spectrum2.png [ 6.7 Кб | Просмотров: 2171 ]
Комментарий к файлу: Спектрограмма с фильтром собеля
spectrum1.png
spectrum1.png [ 46.75 Кб | Просмотров: 2171 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 24 сен 2015, 12:59 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2623
Откуда: Санкт-Петербург
tmtlib, не уверен, что пригодится, но картинка как-то напоминает об алгоритме RANSAC (по сути - просто как оптимизация вашего алгоритма, потому что пробегать по всем возможным значениям коэф-тов дорого).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 24 сен 2015, 13:22 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Почитал про RANSAC, буду думать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 24 сен 2015, 16:21 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3299
можно просто посчитать два спектра в момент времени t0 и t1, а потом посмотреть кросскорреляцию на сколько они по частоте друг относительно друга разъехались за время t1-t0.
если сделать так для нескольких моментов времени и усреднить все эти смещения, получится как раз наклон.
Вложение:
chirp.png
chirp.png [ 73.24 Кб | Просмотров: 2117 ]

между 0.5 и 0.6с частота съехала на 560Гц.
между 0.45с и 0.65с в среднем на 3.3кГц/сек.
надо только нахождение максимума на корреляционной функции по-человечески сделать, ну и спектры можно почистить, если тупо гаусса какого-нибудь на них натянуть наименьшими квадратами, тогда результат шуметь будет заметно меньше.
ну и если хочется нелинейности соответственно измеренные смещения (производную по частоте) не усреднять надо, а опять же натягивать полином какой-нибудь.

а если хочется чтобы именно через фурье (пока рассмотрим обычный, не быстрый) можно сворачивать сигнал не с синусом/косинусом постоянной частоты как обычно:
Код:
Transform[d_, fs_, f_, a_] := Module[{s, c, i, t},
  s = 0.0;
  c = 0.0;
  t = 0.0;
  For[i = 1, i <= Length[d], i++,
   s += d[[i]]*Sin[2.0*Pi*f*t];
   c += d[[i]]*Cos[2.0*Pi*f*t];
   t = N[(i - 1)/fs];
   ];
  Sqrt[s*s + c*c]
];

а с синусом/косинусом меняющейся частоты.
в данном случае линейно: но вместо f+a*t может быть и что-нибудь позабористее.
Код:
Transform[d_, fs_, f_, a_] := Module[{s, c, i, t},
  s = 0.0;
  c = 0.0;
  t = 0.0;
  For[i = 1, i <= Length[d], i++,
   s += d[[i]]*Sin[2.0*Pi*(f + a*t)*t];
   c += d[[i]]*Cos[2.0*Pi*(f + a*t)*t];
   t = N[(i - 1)/fs];
   ];
  Sqrt[s*s + c*c]
  ]

тогда результат получится двухмерный, от частоты и от "изменения частоты":
на картинке преобразование куска от 0.5 до 0.6 сек, по вертикали Гц/с, по горизонтали - Гц
Вложение:
chirp2.jpg
chirp2.jpg [ 72.38 Кб | Просмотров: 2073 ]

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 25 сен 2015, 08:16 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Спасибо, картинки очень понравились. Буду пробовать.
По поводу ускорения получения двухмерного спектра у меня уже есть идея. Брать обычное БПФ от сигнала, который децимируется с линейно меняющимся со временем коэффициентом. Т.е. к примеру в сигнале есть синусоида с частотой меняющейся от 200Гц до 100Гц, если по ходу синусоиды выбрасывать всё больше сэмплов (или интерполировать), то есть такой наклон коэффициента децимации, который "выпрямит" эту синусоиду до константой и она будет меняться 200Гц до 201.5Гц (к примеру).

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

Заинтересовался программой для расчётов. Поискал функцию ListPlot, как я понял это Mathematica? Чувствуется хорошая удобная программа.

p.s. Смотрю тут знатоки собрались нехилые.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 25 сен 2015, 09:14 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3518
Tmtlib, а можно еще сэмплов подлиннее? В том числе и таких, где искомого сигнала нет. Не обещаю, что скажу что-то полезное, но вдруг.

И еще я заметил, что на сэмпле есть ступеньки, как будто он нарезан и склеен из кусочков.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 25 сен 2015, 09:58 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 май 2015, 11:06
Сообщения: 90
Откуда: Мирный (Якутия)
Вейвлет-анализ файла chirps.wav
(грубая прикидка)
Вложение:
chirps.jpg
chirps.jpg [ 168.88 Кб | Просмотров: 2023 ]

А сигнал этот мне напоминает голос со скремблера ...
Что-то подобное я на радиосканере слышал :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Возможно ли преобразование в стиле БПФ для нелинейных чирпов
СообщениеДобавлено: 21 окт 2015, 09:56 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Вопрос к _pv, но может кто ещё знает:
Я так понимаю кросскорреляция спектров хороша для единичного чирпа. А что делать в случае одновременного наличия трёх "чирпов"? По идее можно сделать локально, добавить веса.

iev91, спасибо. Я наборот сигнал похуже взял. Пробовал чистить шумы в Audacity, но по-моему особого толка нет. Могу и подлиннее, как доберусь до компа с программой.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB