Дтмф декодер на fft

Тема в разделе "Arduino & Shields", создана пользователем Ariadna-on-Line, 10 апр 2021.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Отлаживаю в Протеусе. Подаю на виртуал-Ардуину (через сумматор из двух резисторов 10ком) синусоиды с виртуал-генераторов Протеуса. согласно картинке (см. картинку). Код выдает измеренные частоты двух доминирующих пиков + соответствующие им стандартные частоты из таблицы (см. картинку), если попадают в интервалы допуска, и соответствующий символ клавиатуры. Имею загадочное поведение кода.
    Оцифровок за раз - 128. Скорость - 8000 смпл/сек. Интервалы допуска - +-63 и +-36 Гц.
    См. картинку -
    1. Кнопка A, B, C - правильно.
    2. Кнопка D - нижняя частота (941 гц) - правильно, вместо верхней - произвольное значение.
    3. Кнопка 7 - правильно.
    4. Кнопки 1, 4, * - нижняя частота (697 гц) - правильно, вместо верхней - произвольное значение.
    5. И тд.
    Господа гуру - какие идеи на тему этого фэномэна ? Честно говоря - у меня никаких (пока).
     

    Вложения:

    • DTMF.png
      DTMF.png
      Размер файла:
      18,2 КБ
      Просмотров:
      111
    • Кнопка C.jpg
      Кнопка C.jpg
      Размер файла:
      44,9 КБ
      Просмотров:
      108
    • Кнопка D.jpg
      Кнопка D.jpg
      Размер файла:
      23,5 КБ
      Просмотров:
      98
    Последнее редактирование: 10 апр 2021
  2. ivan_alexoff

    ivan_alexoff Гик

    Поищите в инете прошивки на "русские" АОН-ы. Там та же двухчастотная посылка, только частоты отличаются от DTMF. Когда то находил, правда для PIC-a
     
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Если вы про дизассемблирование хексов - мне не потянуть ассемблер. Исходники - посмотрю, если найду. Спасибо.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    А если на реальном железе попробовать? Протеус не всегда работает так как в жизни. За это его не очень люблю.
     
    Ariadna-on-Line нравится это.
  5. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вставил в библиотеку свою функцию. Прописал в заголовочном файле. Вызывается, компилится без ошибок. Вопрос - Почему функции, которые там были изначально, выделяются розовым цветом в Ардуино ИДЕ, а вновь введенная функция - нет. Как оболочка узнаЁт, что эта функция - "самосад" ?
     
    Последнее редактирование: 13 апр 2021
  6. a1000

    a1000 Гуру

    А ей по барабану кто добавил функцию, вы или автор библиотеки.
     
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Пардонс - имеет место артефакт буквы Ё. Исправил вопрос :
    Как оболочка узнаЁт, что эта функция - "самосад" ?
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Алгоритм поиска пиков делал сам - сам и ошибся.
    1. Ответ на заглавный вопрос оказался прост. ДТМФ сигналы состоят из двух частот - ниже 1100 Гц (НЧ) и выше 1100 Гц (ВЧ). Алгоритм начинал с НЧ и шел к ВЧ. Выделял два пика - "высокий" и "еще выше". А если "еще выше" попадался первым, второй пик не опознавался. Принудительная установка на генераторе амплитуды ВЧ пика больше амплитуды НЧ пика исправила проблему, но это не правильно. Пришлось разделить диапазон на два участка частот, и искать пики по очереди - каждый на своем участке. Проблема с кодом решилась.
    2. Проблема с подЦветкой "самосадной" функции разрешилась сама собой, без видимых причин. Загадка поведения пока не решена.
    --------
    Опознавание ДТМФ работает, но есть проблема. Передатчик и приемник независимы, поэтому приемник может либо пропустить символ, либо принять его два раза. Требуется некий адаптивный алгоритм подстройки приемника под темп передатчика ДТМФ.
    ПС. К чему эта мататень - уже писАл - желание сделать "антропоморфный" способ общения с электроникой, типа язык R2D2.
     
    Последнее редактирование: 21 апр 2021
  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1 - Сейчас нет свободной ардуины чтобы проверить, а в Протеусе это не прокатывает, потому задаю вопрос - Допускается ли динамическое переключение источника внутреннего референса ? Чтоб получилось типа автоматической регулировки усиления. Ведь чем меньше референс, те чувствительнее АЦП.
    2 - ПС. Расширил алгоритм до 6х6 тонов. Теперь передается и принимается весь английский алфавит и цифры. Но проблему асинхронности (выражается в удвоении знаков) пока не решил.
     

    Вложения:

    Последнее редактирование: 24 апр 2021
  10. a1000

    a1000 Гуру

    Источник опорного напряжения задаётся битами REFS1-REFS0 регистра ADMUX.
    [​IMG]
    Это для atmega8, для atmega328 внутренний ИОН 1,1 V.
    Как пишет даташит
    И ещё - если подаёте внешнее опорное на AREF, внутренний ИОН нельзя использовать.
     
    Последнее редактирование: 25 апр 2021
    Ariadna-on-Line нравится это.
  11. kemal

    kemal Нуб

    Не знаю, на сколько применимо тут, но вспомнилось из тех же АОНов: там есть дополнительный символ повтора. Специально для того, чтобы два одинаковых символа не шли подряд.
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Судя по ДШ, софт-переклюк референса возможен. Есть тонкость - мы же работаем с синусоидами. Требуется делитель из резисторов для смещения на середину шкалы, то есть на половину референсного напряжения. Значит запитываться он должен от него же. Логично вроде - запитать делитель от пина Vref, чтоб не городить лишнюю схемотехнику. В этом и есть суть вопроса. Делал ли кто такой фокус ?
    Это понятно - это функции "высокого уровня", но хотелось бы сначала сделать функцию "низкого уровня " тупой авто-синхронизации с входным сигналом. Поступил сигнал и приемник тут же засинхронился на него.
     
    Последнее редактирование: 26 апр 2021
  13. kemal

    kemal Нуб

    А это и есть синхронизация. Детектируем те же частоты, что и при предыдущем анализе - значит ещё предыдущий символ не закончился. Нашли другие частоты - это следующий символ. И не надо никого не под кого подстраивать, можно хоть полдня один символ пищать.
     
  14. parovoZZ

    parovoZZ Гуру

    меньше вольта в старом атмеловском хламе падать нельзя. Да и на вольте уже работать стрёмно - шумов много. Ну если только на 8 битах.
     
  15. kemal

    kemal Нуб

    3*6*9*
    где '*' - символ повтора.
    Если подряд идут больше одинаковых символов, то уже сам символ используется. То есть, например:
    333999 - 3*39*9
     
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не понял. - Телефонная станция передавала такие сигналы повтора ? Не знал. Я думал - пауза 100мС между посылками - признак раздела символов. Буду искать подробности работы станций. Надо в алгоритме поиск пауз закладывать. Спасибо. Навели на идею. Но явно усложняет алгоритм.
    Поскольку работаем на середине шкалы - там и так на каждую полуволну приходиться всего 5 битов.
     
    Последнее редактирование: 26 апр 2021
  17. parovoZZ

    parovoZZ Гуру

    это заблуждение.
     
    Ariadna-on-Line нравится это.
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Повторяю передача-приём - процесс асинхронный -
    1. Ситуация 1 - Передатчик и оцифровщик начали одновременно - Оцифровщик получил много выборок от полных периодов частот. Обсчет выдал их частоты и их магнитуды, те интенсивности частот. По магнитудам как раз сигнал и выделяют.
    2. Ситуация 2 - Оцифровщик начал, а передатчик заканчивает. Получили мало выборок от сигнала, бОльшая часть - от паузы и шумов.. Магнитуды низкие, а магнитуды низких частот сигнала - еще ниже, тк не влезла бОльшая часть периода. Возникает проблема опознавания на фоне шумов. Опознается возможно что-то. Оно не предыдущая буква, но и не коррект.
    3. Здесь бы конечно алгоритм Гёрцеля экономичней Фурье. Но у меня ни одна библа с Герцелем не заработала.
     
    Последнее редактирование: 6 май 2021
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Хех, а ведь получается. Ардуино Уно и модулек с микрофончиком. Прием в комп по кабелю, но передача честно - по звуку с динамика компа, хотя открыт балкон и проспект с машинами за окном. Все - теперь очередь за полной автономностью и удобоваримым интерфейсом.
     

    Вложения:

    • DTMF printer.jpg
      DTMF printer.jpg
      Размер файла:
      108,8 КБ
      Просмотров:
      116
    Последнее редактирование: 20 май 2021
  20. SergeiL

    SergeiL Оракул Модератор

    В АОН-е безынтервалный пакет, поэтому там есть коды для повтора предыдущего кода, иначе не определить следующий.
    В DTMF все с паузами. Тут коды повтора не нужны.
    Есть специализированные аппаратные декодоры DTMF, они работают без занятия основного контроллера, поэтому предпочтительней.
    В свое время, в начале 2000-ых, делал программный вариант распознавания DTMF, но аппаратный вариант и проще и правильней.