Предисловие
Универ остался в прошлом примерно десять лет назад, но все это время меня не покидают ностальгические чувства и тоска по науке. Остаётся ощущение, что чего-то я не доучил, или что-то мы пробежали слишком быстро. Благо, что современные платформы позволяют чувствовать себя студентом всю жизнь.
К написанию этой статьи меня подтолкнула лабораторная работа №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 найдем соответсвующие частоты по формуле:
где fn — частота дискретизации: 44100 Hz, N — кол-во отсчетов (степень двойки)
- определим какие частоты из таблицы соответствуют найденным (с некоторым допуском ±35 Hz) и найдем искомый символ
Что получилось
Собрать и запустить программу в виде standalone jar можно из исходников, для генерации звуков можно использовать телефон или эту страницу.
Следующим шагом хочу реализовать тоже самое на Arduino.
Комментарии (7)
xztau
14.11.2018 07:52FFT на 8-битке возможно?
Кстати, а можно ли на Arduino поймать 60КГц?
За ссылку на курс по ЦОС благодарю.Скрытый текстБлин! Он закрытый!nafikovr
14.11.2018 15:41ффт возможно конечно. онлайн — зависит от вводных данных.
ответ на второй вопрос тоже зависит от вводных.
pae174
14.11.2018 18:52+1Я просто оставлю это здесь:
US patent #6751303
Передача данных по аудиоканалу с использованием DTMF кодирования
Суть запатентованной идеи: передающая сторона кодирует передаваемые данные в последовательность звуков в формате DTMF и проигрывает эти звуки в телефонную линию или в окружающее пространство. Принимающая сторона прослушивает линию, декодирует DTMF и получает исходные данные. Алгоритм декодирования там не уточняется.
Изобретатель — некий Fred S. Cook, US patent 6751303, 2002-06-28.
Держатель патента — Sprint (это такой американский аналог Мегафона).
Ни на что не претендую — просто мысленно представил себе создание модема с DTMF модуляцией и в два клика обнаружил патент на это дело.
Rend
Для распознавания DTMF можно применять не чистый FFT, а алгоритм Гёрцеля.
zjor Автор
спасибо, попробую его в реализации для ардуино, он должен быть экономичнее
jakushev
Опередили…