Добрый день,
есть данные, которые на лету оцифровываются на 1MS/s, в них присутствует полезный сигнал - это какие-то всплески. Эти всплески по форме похожи на пол-периода синуса, иногда они могут идти последовательно друг за другом с разным знаком, то есть получается несколько полупериодов синуса.
Про частоту таких полусинусов почти известна частота, то есть:
* частота расположена в диапазоне от 30кГц до 150кГц,
* заранее известно 5 частот, более менее равномерно разбросанных по этому диапазону, и частота таких полусинусов довольно близка к ним, но, может отличаться иногда на процентов десять, то есть в худшем случае получается почти не известно: например даны частоты 30, 45, 67, 100, 150, а из-за того, что одна частота ушла вниз на 15% а другая вверх на те же 15% они оказались очень близко друг к другу.
Шума много, причем по евклидовой норме он превышает полезный сигнал на пару-тройку порядков. Он может быть немного выше верхнего диапазона частот, то есть выше 150кГц, и его очень много ниже 30кГц.
Классические фильтры с большой предысторией не работают, то есть они конечно начинают хорошо давить шум, но довольно сильно искажают сам сигнал и после них уже решить то, что надо я уже не могу.
Но если на исходный график посмотреть - сигнал виден не вооруженным глазом.
Мне надо детектировать частоту сигнала, точное положение максимума, и, если сигнал состоит из нескольких полупериодов, то мне надо уточнить частоту + точно получить, что тут есть столько-то полупериодов и записать хотя бы какую-то аппроксимацию огибающей.
Пока делаю в лоб, то есть для каждого временного отсчета считаю интеграл сигнала с кучей тестовых синусов, уточняю частоты, и, если что-то хорошо получается, сохраняю как результат. Алгоритм получается очень трудоемким, и содержит тысячи операций на одно измерение. Меня это не устраивает. После обработки сигнал обычно сжат очень хорошо - это просто группы чисел, в которых записана точка, когда был максимум первой амплитуды, сама величина амплитуды, число полупериодов, принадлежность к какой-то частоте, поправка на увеличение или уменьшение частоты и, если полупериодов очень много, то огибающая.
Так как из-за огромной величины шума в других диапазонах отфильтровать только этот диапазон без эффекта альясинга не получается - ведь то, что мне надо - иногда длится всего-то 6-10 отсчетов.
Недавно я поднимал тему оконного Фурье (
topic160206.html ) которое я применял к этой же задаче. Если сигнал на мое счастье длился внутри одного окна, или был достаточно длинным и распространялся на несколько окон - все сохранялось идеально, а вот если мне сильно не везло и сигнал был коротким (пол-периода) и был точно на границе двух окон, я часто терял информацию о таком сигнале. Я тендирую к оконному Фурье с перекрыванием, но информации после такой компрессии будет больше и я не впишусь по скорости передачи.
Мой вопрос в том какой метод применить для того, чтобы или перекомпремировать такой сигнал, чтобы он все-таки стал занимать существенно меньше трафика, или сразу детектировать такую информацию в этом сигнале, но с небольшими математическими затратами (на процессоре есть от силы 10-12 флоп на один принятый сигнал).