- PVSM.RU - https://www.pvsm.ru -

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

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

Предисловие

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

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

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

Если понажимать на кнопки телефона (или здесь [3]), то можно услышать, что каждый символ имеет свою частоту, а точнее даже две, и эта комбинация уникально кодирует символ.
Наша задача — выделить из зашумленного сигнала две наиболее сильные частоты и проверить, кодируют ли они какой-то символ в соответствии с таблицей:

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 можно из исходников [4], для генерации звуков можно использовать телефон или эту страницу [3].

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

Следующим шагом хочу реализовать тоже самое на Arduino.

Автор: zjor

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/299029

Ссылки в тексте:

[1] progressing: https://processing.org/

[2] openedu: https://openedu.ru/course/eltech/DSP/

[3] здесь: http://onlinetonegenerator.com/dtmf.html

[4] исходников: https://github.com/zjor/dtmf-detector/tree/master/processing

[5] Источник: https://habr.com/post/429700/?utm_campaign=429700