поиск нужной последовательности в зашумленном сигнале (цифровом)
- Войдите на сайт для отправки комментариев
Сб, 10/06/2017 - 16:05
приветствую
программу ещё не писал, думаю над алгоритмом. и вообще я новичок. Возможно кто-то из вас профессионально сталкивался, поэтому прошу подсказки.
на вход INT0 атмеги328 припаян датчик, который является приемником сигнала.
а изначально сигнал очень простой: "0" длительностью 2мс, "1" длительностью 5мс. и так в цикле...
но всякие шумы и прочие факторы могут превратить его в зашумленный. Плюс к тому же ширина импульса может варьироваться в пределах 0.5мс. т.к. не ровно 2 мс, а 2 +/-0.5мс, т.к. не ровно 5 мс, а 5 +/-0.5мс
стоит задача понять когда сигнал пропадает полностью, и когда он есть (но возможно с помехами).
подскажите правильный алгоритм работы )
Если для вас это сложная задача, то ка вариант решения проблемки - поставить не шумящий приемник сигнала
Если все таки нужен програмный алгоритм отфильтрования полезного сигнала, то читать этот очень ценный материал
http://phreakerclub.com/forum/showpost.php?p=46091&postcount=1147
только наверно придется зарегестрироваться, описан алгоритм приема сигнала из радиоэфира с отфильтровкой помех, это классика приема
Я бы сделал так;
1. Меряем оба параметра, период и скважность, частота низкая - библиотеки под ардуино есть в сети готовые, не поленитесь поискать,
2. Набиваем данные в два массив целичисленных переменных, в зависимости от ардуино рамер подбираем,
3, Используем сортировку циферек и строим гистограмму выборки, типа 1.6мс - 5штук, 1.8мс - 12, 2.0 - 30 и т.д. Здесь шаг по оси времени можно взять 10% ну или поменьше, ардуина быстро считает.
Ну а дальше простая интегральная сумма всех что в 'окне допуска' делится на тотальную сумму. Выбираете уровень срабатывания - т.е. пороговой детектируемый уровень или шумовое дно как на англе обзывается. И включаете лампочку.
Не забываем, сигнал с помехами.
Мерить перепады уровней нужно по внешним прерываниям.
приемник сигнала уже обрабатывает от шума, так что только программный путь остался.
применять библиотеки не хотелось бы, чтобы ускорить код, тем более если будут использованя прерывания.
сначала у меня была идея, похожая на один из методов из материала, предложенного russo - считывать через равные промежутки времени.
выделить переменную в два байта. и считывать с интервалом в 0.5мс значение входа. и делать сдвиг при каждом считывании. так скажем массив на битовом уровне. дальше искать значение 00 00 11 11 11 11 11, а вернее делать xor моей переменной с этим числом и считать количество единиц в результате операции xor (оно должно быть например не более двух).
т.е. чтобы считываемая таким образом последовательность совпадала например на 80%. в этом случае сигнал есть. менее 80% - сигнала нет.
что думаете о таком алгоритме? или все же лучше использовать внешнее прерывание и измерять ширину импульса т и.д... ?
Я не предлагал считывать через равные промежутки времени. Нужно считывать по внешним прерываниям. Тогда считывание будет точное и не пропустим помеху или полезный сигнал. Алгоритм описан по ссылке выше.
Ничего не понял. Вы похоже не туда заехали. Информация передается пакетом. Если пакет испорчен, то его игнорируют. А шумом или чем-то еще не важно. Вам нужно ловить время перепадов и считать время между перепадами. Если перепады меньше или больше заданых , то опять пакет испорчен. Ждем следующего.
Подскажите, праильно измерять ширину импульса в прерывании с помощью micros() ?
Подскажите, праильно измерять ширину импульса в прерывании с помощью micros() ?
отказаться от прерывания.
ранее наоборот выяснили, что лучше использовать прерывание для поиска импульсов. фронты я ловлю, теперь пытаюсь измерить длительность, но вижу, что несмотря на наличие кварца время в контроллере течет очень не точно. На одной минуте, по грубой оценке через blink ))), теряется полторы секунды!!.
вот задумался, может micros() неправильное время мне выдаёт? правильно ли этой функцией его измерять?
а зачем отказываться от прерывания?
Какой сигнал нужно ловить?
Нужны точные данные
Здесь описан прием по прерываниям для формата пакетов старлайн и кейлог
http://phreakerclub.com/forum/showthread.php?t=992&highlight=%D0%B0%D1%8...
"0" длительностью 2мс, "1" длительностью 5мс. и так в цикле...
вот ставлю прерывание по CHANGE
в теле программы смотрю какое значение у Lstate и если оно 3, то сигнал есть
Вижу вам нравятся танцы с бубном. Мои ссылки чем не устраивают? Ну тогда пляшите...
Нутром чую, ТС какойто фигни написал, че за сигнал такой, так зашумлен что его не разбереш, есть он или нету.
///Подскажите, праильно измерять ширину импульса в прерывании с помощью micros() ?
а судя по таким вопросам - нуб полнейший. Непосильный крест на себя валите!
Понятно что любой импульс не будет иметь длительность идеально 2мс или сколько там. Но не считать же его зашумленным из за этого...
Ну ладно, допустим так есть как написано. Выручит статобработка. Определяем длительности в последовательности импульсов, отдельно низких уровней, отдельно высоких. Строим гистограммы для каждого тоже свою. Если на гистограммах обнаруживаем максимумы в раене ожидаемых значений - есть сигнал заданый. Можна сгладить гистограмы сразу, если совсем плохо.
чем не нравятся ссылки - нравятся, но они больше для передачи данных. а у меня примитивный сигнал. зачем усложнять?!
Котельникова вспоминать тоже незачем. Опять же, сигнал примитивный.
лог анализатор показал, что реально на входе все почти без помех, так что оказалось достаточно измерять micros()-ами и ввести lдопустимую погрешность, а также осеивать неправильные пакеты тоже простым методом типа гистограмм
Кстати вместо реального импульса длительностью 5мс по лог анализатору на входе, micros() выдал 4.5мс. в общем отчасти из-за этого сначала ничего не получалось. пока понял, много помучался.
Всем спасибо.
Выложеные ссылки предназначены для приема цифрового сигнала, крайная ссылка уже готовый код для ардуины. Там поменять длительности и формат сигнала нужно.
но всякие шумы и прочие факторы могут превратить его в зашумленный. Плюс к тому же ширина импульса может варьироваться в пределах 0.5мс. т.к. не ровно 2 мс, а 2 +/-0.5мс, т.к. не ровно 5 мс, а 5 +/-0.5мс
стоит задача понять когда сигнал пропадает полностью, и когда он есть (но возможно с помехами).
Сигнал периодический?
Клапауций 112 дело говорит - отказаться от прерывания. Прерывание будет обрабатывать изменения фронтов сигнала, сравнение уровней и тд. Для анализа сигнала вам нужна его форма и перевод формы в корреляционную функцию путем сравнения с эталоном (эталонами).
Если нет мозгов, можете забыть про теорему Котельникова.
лог анализатор показал, что реально на входе все почти без помех, так что оказалось достаточно измерять micros()-ами и ввести lдопустимую погрешность, а также осеивать неправильные пакеты тоже простым методом типа гистограмм
Кстати вместо реального импульса длительностью 5мс по лог анализатору на входе, micros() выдал 4.5мс. в общем отчасти из-за этого сначала ничего не получалось. пока понял, много помучался.
Курица не птица. Шум выдаст такое количество прерываний по измененеию уровня, что о форме сигнала останется гадать на кофейной гуще.
Я тут вспомнил, есть ещё библиотеки для декодирования ИК пультов, таже самая широтно импульсная хрень. Ваще писать ничё не придется, скачать, поправить в заголовочном файле длительность 0 и 1 - у ИК-шек она о.7 и 2.2 мсек кажется, и готово.