Определение цифры на слух

    В этой статье я расскажу о простой программке на processing, которая «слушает» микрофон и определяет цифры, набираемые на телефоне в тоновом режиме.

    Предисловие


    Универ остался в прошлом примерно десять лет назад, но все это время меня не покидают ностальгические чувства и тоска по науке. Остаётся ощущение, что чего-то я не доучил, или что-то мы пробежали слишком быстро. Благо, что современные платформы позволяют чувствовать себя студентом всю жизнь.

    К написанию этой статьи меня подтолкнула лабораторная работа №3 из курса “Основы цифровой обработки сигналов” ЛЭТИ на платформе openedu.

    Принцип работы


    Если понажимать на кнопки телефона (или здесь), то можно услышать, что каждый символ имеет свою частоту, а точнее даже две, и эта комбинация уникально кодирует символ.
    Наша задача — выделить из зашумленного сигнала две наиболее сильные частоты и проверить, кодируют ли они какой-то символ в соответствии с таблицей:
    1209 Hz 1336 Hz 1477 Hz 1633 Hz
    697 Hz 1 2 3 A
    770 Hz 4 5 6 B
    852 Hz 7 8 9 C
    941 Hz * 0 # D

    Я использовал processing, т.к. в нем есть все примитивы для работы с микрофоном и преобразованием Фурье.

    Алгоритм следующий:

    • представим сигнал в виде спектра, fft.analyze вернет нам массив float[]
    • найдем номер отсчета n1 соответсвующий максимальной амплитуде
    • занулим его и все, что в некоторой окрестности (выбранной с умом), чтобы не поймать 2 близкие частоты
    • найдем 2й номер отсчета n2, соотвествующий максимальной из оставшихся амплитуд
    • по номерам n1 и n2 найдем соответсвующие частоты по формуле:

      $f_n = f_dn/ N$

      где fn — частота дискретизации: 44100 Hz, N — кол-во отсчетов (степень двойки)
    • определим какие частоты из таблицы соответствуют найденным (с некоторым допуском ±35 Hz) и найдем искомый символ

    Что получилось


    Собрать и запустить программу в виде standalone jar можно из исходников, для генерации звуков можно использовать телефон или эту страницу.



    Следующим шагом хочу реализовать тоже самое на Arduino.
    • +20
    • 3,7k
    • 7
    Поделиться публикацией

    Комментарии 7

      0
      Для распознавания DTMF можно применять не чистый FFT, а алгоритм Гёрцеля.
        +2
        спасибо, попробую его в реализации для ардуино, он должен быть экономичнее
          0
          Опередили…
          0
          FFT на 8-битке возможно?
          Кстати, а можно ли на Arduino поймать 60КГц?
          За ссылку на курс по ЦОС благодарю.
          Скрытый текст
          Блин! Он закрытый!
            0
            ффт возможно конечно. онлайн — зависит от вводных данных.
            ответ на второй вопрос тоже зависит от вводных.
              0
              насчет 60КГц надо внимательно спецификацию посмотреть, в будущем планирую Arduino M0 Pro использовать, но в одном из проектов делал fft на Arduino, там есть и исходник библиотеки.
              +2
              Я просто оставлю это здесь:

              US patent #6751303
              Передача данных по аудиоканалу с использованием DTMF кодирования
              Суть запатентованной идеи: передающая сторона кодирует передаваемые данные в последовательность звуков в формате DTMF и проигрывает эти звуки в телефонную линию или в окружающее пространство. Принимающая сторона прослушивает линию, декодирует DTMF и получает исходные данные. Алгоритм декодирования там не уточняется.
              Изобретатель — некий Fred S. Cook, US patent 6751303, 2002-06-28.
              Держатель патента — Sprint (это такой американский аналог Мегафона).

              Ни на что не претендую — просто мысленно представил себе создание модема с DTMF модуляцией и в два клика обнаружил патент на это дело.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое