Автор |
Сообщение |
|
Дата: 30 Окт 2010 11:12:58
#
amx Гм, это старые буквари. В новых юзают FFT через алгоритм Герцеля. Ну да это я так. К слову.
|
|
Дата: 30 Окт 2010 17:44:31 · Поправил: Programmist (30 Окт 2010 18:15:40)
#
Накопал тут Герцеля, в основном все на С++ или вообще на каких-то непонятных языках. Буду переводить, что получится - не знаю. Скорее всего, нужно будет 2-е гармоники из 8-ки учитывать.
По таблице считать пробовал, не могу сказать, что быстрее, только точность хуже. Наверно это уже от процессора зависит. Иногда, если нужно что-то тяжелое делать, создаю несколько больших массивов, при старте программы заполняю их по формулам, ну а потом уже оттуда беру. Вроде как быстрее, чем Const получается.
P.S. Не решается задачка по классике. Было бы здорово, но где взять правильный уровень неизвестной частоты для сравнения с 8-мью известными? Вот и приходится устраивать танцы с бубном и граблями.
|
Реклама Google
|
|
|
Дата: 30 Окт 2010 22:42:49 · Поправил: Programmist (30 Окт 2010 23:30:20)
#
|
|
Дата: 30 Окт 2010 23:42:18
#
P.S. Не решается задачка по классике. Было бы здорово, но где взять правильный уровень неизвестной частоты для сравнения с 8-мью известными?
Ничего не понял.
Я ж писал - сравнивай уровни 8-ми частот между собой.
Точнее, определяй три частоты из этих восьми, имеющие самый большой уровень,
и сравнивай их между собой.
X и Y можно считать равным трем для начала.
то есть сигнал есть, если для трех уровней
A1>A2>A3 справедливо:
A1< A2*3
и
A2 > A3*3
и частоты с уровнями A1 и A3 попадают в разные группы.
А1, A2, A3 определяются квадратурным детектором.
Каким образом их вычислять - обычным БПФ , герцелевым БПФ или просто ПФ (то есть обычным перемножением на sin и cos) - это уже детали реализации, влияют только на сорость вычислений.
|
|
Дата: 30 Окт 2010 23:56:32 · Поправил: Programmist (31 Окт 2010 00:04:09)
#
Спасибо, теперь понял, а я искал 9-ую, большую во всем диапазоне. :) Сейчас буду переписывать.
Оно изначально у меня было правильно, потом понесло куда-то не туда.
|
|
Дата: 31 Окт 2010 00:19:09 · Поправил: xman (31 Окт 2010 00:21:23)
#
Я кстати тоже самое предлагал, девятая и в голову не приходила :) Но вот насчет объединения групп при амплитудном анализе - немного сомневаюсь. Спектральная плотность шума может оказаться неравномерной, поэтому я бы попробовал полностью раздельный анализ по низко- и высокочастотной группам. Т.е сравнивать самую высокую ампл. с амплитудами остальных частот - только внутри группы. Если она заметно больше них - Ок, иначе - помеха.
|
|
Дата: 31 Окт 2010 00:48:49 · Поправил: Programmist (31 Окт 2010 01:43:44)
#
xman
Да, нужно еще подумать, наверно просто устал - вторые сутки искал девятую. :))
Можно пороги X и Y для начала вывести на форму для подстройки, ну и потом другой алгоритм попробовать. В любом случае декодер буду переписывать т.к. был использован чужой модуль от АОН-а, переведенный с С++ на скорую руку и 10 лет назад. Отсюда и возникла путаница.
В исходнике, что лежит выше, уже есть все необходимое для экспериментов. Можно быстрый CTCSS-индикатор сделать или еще чего-нибудь. DTMF-декодер собран на той же основе.
сравнивать самую высокую ампл. с амплитудами остальных частот - только внутри группы
Попробую включить до алгоритма, предложенного amx, как опцию. Поможет избавится от помех, но будет убивать некоторые символы. Имхо, более правильно включить анализ 2-х гармоник, подавление эха и синхронизацию длительности, но это гораздо сложнее в реализации.
|
|
Дата: 31 Окт 2010 07:33:07
#
и частоты с уровнями A1 и A3 попадают в разные группы.
A1 и A2 должны попадать в разные группы, конечно.
|
|
Дата: 31 Окт 2010 18:17:16
#
amx
Спасибо, уже разобрался, декодер переделал, но пришлось алгоритм немного доработать. Получилось 3 порога: X,Y,Z. Считаются 16 частот (первой функцией), где
DtmfFreq: array[0..7] of Double = (697, 770, 852, 941, 1209, 1336, 1477, 1633);
OutRangeFreq: array[0..7] of Double = (733.5, 811, 896.5, 1075, 1272.5, 1406.5, 1555, 1711);
Потом значения массивов складываются в M1 и M2. Если M1 > M2 * Z - значит это DTMF. Опция Noise Filter включает этот режим. СШ, конечно становится хуже, но для работы в реальных условиях это не критично. FFT больше нет, для определения конкретных частот внеполоска не мешает. Имхо, если к этому добавить Вашу пост-обработку - будет совсем не плохо.
Обновление до версии 1.3
|
|
Дата: 31 Окт 2010 19:35:36
#
Интуитивно кажется, что эта дополнительная проверка особой пользы не принесет.
Хотя, возможно, позволит увеличить X и Y, чтобы увеличить вероятность правильного обнаружения в сильных шумах, не увеличив вероятность "ложной тревоги"...
Но можно попробовать просто применить исходный алгоритм (анализа трех максимумов) ко всем 16-ти частотам, введя дополнительную проверку "F1 и F2 попадают в DTMF-частоты".
|
|
Дата: 31 Окт 2010 19:53:04 · Поправил: Programmist (31 Окт 2010 19:57:46)
#
Да, здесь вариантов много. Нужно пробовать. Пока сделал, что успел (не уверен, что правильно), но даже такой простой фильтр уменьшил ложные срабатывания раза в четыре. Пробовал чистить сигнал вейвлетом - не помогает. Еще раз обновил архив, там мелочи.
|
|
Дата: 31 Окт 2010 20:08:33 · Поправил: amx (31 Окт 2010 20:09:56)
#
Странно, у меня вообще ложные срабатывания получить - постараться надо.
Похоже, думатель у постобработчика слабоват :)
Ты на каком интервале (в смысле длительности) принимаешь решение?
|
|
Дата: 31 Окт 2010 20:17:58 · Поправил: Programmist (01 Ноя 2010 06:04:05)
#
Будете смеяться, но постобработчика пока вообще нет. Большой (8192) буфер режется на маленькие куски (в настройках) и идет прямое декодирование этих кусков. Если общий уровень куска много меньше ранее принятого, весь кусок обнуляется, значит пауза. Получается, что решение зависит от размера маленького буфера (при дискрете 48К). Соответственно, при этом часть полезной информации теряется. :(
А ложных срабатываний очень много, если параллельно с сигналом идет голос или музыка. На белый шум, конечно не реагирует.
Как раз собираюсь сделать к сигналу огибающую, но это уже следующий этап. Что-то мне подсказывает, что и в первой части сделано еще далеко не все.
P.S. С 48-ми KHz уходить не хочу - процессоры сейчас быстрые. :) Как правило, у всех карт это стандартный режим. Все остальное, кратное 44100, приводится к 48000 и не всегда ровно. Для DTMF оно может и не столь важно, но в других случаях заметно сильно.
P.P.S. Остается открытым вопрос: Чем правильно определить присутствие частоты? Потому, как сигнал по пути может пару раз крутануть по фазе, а длительность импульсов короткая. В результате – потеря знака, что обычно и происходит. И декодируется такой сигнал каждый раз по-разному. Если его руками можно восстановить - значит это должна уметь делать и программа. Помогает несколько проходов по импульсу, начиная с разных позиций, но слишком много нужно ресурсов.
|
|
Дата: 01 Ноя 2010 11:05:00
#
Скользящий фильтр надо делать, а не кусками нарезать.
А после решателя - если миллисекунд 20 наблюдаешь одну и ту же цифру (или отсутствие цифр вообще) - фиксировать ее.
А с точностью установки частоты семплирования на новых картах - действительно УЖАС-УЖАС-УЖАС.
У меня на он-бордной карте вместо 11025 вообще около 10800 на запись и около 11100 - на воспроизведение. Это ж специально нужно было стараться - так изгадить :(
|
|
Дата: 01 Ноя 2010 13:23:53 · Поправил: Programmist (01 Ноя 2010 14:03:03)
#
Буду делать. Уже собрал циркулярный буфер и все sin/cos раскидал по массивам, ну чтобы пошустрее было. Сразу все не получается, слишком много уходит в корзину. Здесь как всегда - одна ошибка в начале и можно все начинать с чистого листа. Если бы знать, как оно правильно...
На итого выходит, что уже не правильно, раз не устраивает функция определения частот, а потом пути назад нет.
С картами, конечно беда. Чтобы получить кратное 44100, нужен второй кварц, чего делать никто не будет. И кварцы сейчас не те. Пальцем надавил - частота ушла. :(
Да и вообще любой ресемпл сигнал убивает, если запаса нет. Их и так-то этих точек никогда не хватало.
|
|
Дата: 01 Ноя 2010 19:47:45
#
Чтобы получить кратное 44100, нужен второй кварц
один кварц на 21168 кГц позволил бы получить и сетку 44100/N , и 48000/N ...
|
|
Дата: 01 Ноя 2010 20:49:00 · Поправил: Programmist (01 Ноя 2010 21:43:19)
#
В принципе да, это нужно разработчикам железа, а то до сих пор не могут эту проблему решить. Чтобы музыку набор частот послушать, приходится софтовые плагины ставить. Все записи, в основном 44100 были.
Наверное, от лени, полез искать готовый скользящий фильтр и наткнулся на интересную функцию сглаживания методом скользящего среднего. В принципе помогает избавиться от шумов, но надо каждую частоту обрабатывать отдельно, потом поправку АЧХ вводить. Хотя в общем-то вейвлет делает то же самое.
|
|
Дата: 01 Ноя 2010 21:14:02
#
Programmist Странные проблемы вы описываете Потому, как сигнал по пути может пару раз крутануть по фазе. Ну и что? У вас модуляция фазовая что ли? Чес слово иногда не понимаю вас. С одной стороы вроде в теме, с другой как-то слишком вроде, чем в теме. Имхо, имхо, конечно. ДТМФ декодеры на Герцеле описаны чуть ли не канончески. Причём тут фаза? Про какие восемь, девять частот тут говоили тож не пойму. Их всего-то в сетке вроде 7? что-то я не догоняю алгоритмчических ходов ваших. Ну да ладно.
|
|
Дата: 01 Ноя 2010 21:38:51
#
Mesh
Все очень просто. Частот в сетке восемь. Длительность DTMF импульса может быть меньше 40мс. Если этот импульс, например, в середине по фазе сдвинуть, и еще туда пару импульсных помех добавить, сильно изменится амплитуда при детектировании и декодер выбросит его как шум.
декодеры на Герцеле описаны чуть ли не канончески
Может они, где и описаны, но реально рабочих программ я пока кроме как у amx не видел. Чтение трактатов с пятиэтажными формулами у меня восторга не вызывает.
|
|
Дата: 01 Ноя 2010 21:38:53 · Поправил: xman (01 Ноя 2010 21:40:55)
#
Ну если брать полный набор команд DTMF - там матрица 4x4, всего действительно 8 частот. Ими кодируются цифры 0, 1, 2, ..., 9 - их 10 шт, "*" (звездочка), "#" (решетка), и четыре буквы A, B, C, D - получается 16 комбинаций.
|
|
Дата: 01 Ноя 2010 21:55:35
#
xman
В том-то и дело, если декодировать, то полностью. Зачем выбрасывать что-то из стандарта. Длинные импульсы можно и БПФ декодировать или БПФ на Герцеле, что возможно и лучше, чем БПФ. С короткими - беда.
БПФ Герцеля у меня нет. Чтобы попробовать простое преобразование - пол дня ушло на поиски и перевод на Delphi, все выше написано.
|
|
Дата: 01 Ноя 2010 21:58:01
#
xman Гм. Так выходит на сайте косая таблица? Я по ней смоторел. Там 7 частот. Ну раз 8 значит 8. Бог с ними, не самое это важное. Programmist Может они, где и описаны, но реально рабочих программ я пока кроме как у amx не видел. Да ладно, бога побойтесь. Коде 300 который тут уже упоминали. :) Да есть софт который колбасит этот ДТМФ. С фазой пардон, это что-то искуственное вы тут придумали. По середеине повернуть, да ещё помех добавить. Ага, а если в начале помех, посередине и в конце, то вобще любой деуодер станет. :) Вот бы Ваську так на этот счёт прорабатывли. :) ДТМФ это не фазовая мода, и чувственость к фазе это огрехи алгоритма. Чего это ради амплитуда сильно изменится от фазы? Амплитуда это амплитуда, а фаза это фаза, они ни как не связаны, по меньшей мере теория так гласит. :) Чего у вас там выходит в деме, это уже другого сорта проблемы. Имхо. Не такой уж сигналик ДТМФ нежный что б какая-то там фаза чего-то могла ушатать в дым. Скорости как то не те знаете ли. :)
|
|
Дата: 01 Ноя 2010 22:15:05 · Поправил: Programmist (01 Ноя 2010 22:24:18)
#
Mesh
Вот с Васькой, как раз, так и вышло, взял что попало и положил в основу, а потом переделывать было поздно, да и задачи у нее другие. Свою функцию она выполняет и возвращается туда нет желания. Может когда, и сделаю чего, но это будет другая программа.
А софта всякого много, это уже из серии - зачем строить свой дом, когда у соседа дворец. :)
Правильная таблица в CoolEdit-e, им и генерю сигналы для отладки. Плюс генераторы помех всех видов самодельные.
|
|
Дата: 01 Ноя 2010 22:22:55
#
Programmist Да не, причём тут дворец соседа?? Была фраза, что якобы софтра рабочего по декодингу ДТМФ вроде как и нет, кроме там бла-бла. Ну я ж просто говорю, что есть. А строить дом или нет. Эт только вы решаете и ни как не сосед у которого дворец, сарай, шалаш или хоромы. Так с фазой-то чего? Чего ради фаза должна изменить сильно амплитуду? Пусть обкрутится сигналик по фазе хоть десять раз, как был он ДТМФ так и останется. Може не прав конечно, может быть. :)
|
|
Дата: 01 Ноя 2010 22:26:02 · Поправил: xman (01 Ноя 2010 22:31:11)
#
Предлагаю воспользоваться вот этой информацией. Там таблица всех восьми частот и их шестнадцати комбинаций. Вроде как совпадает с дэйтшитами на телефонные ИМС.
Насчет фазы - согласен с выше сказанным, сколько бы она не крутилась - сама частота никуда не денется. |
|
Дата: 01 Ноя 2010 22:31:12
#
Mesh
С фазой дело плохо. Поэтому все декодеры на плохих сигналах выдают полный бред, причем совершенно разные результаты декодирования одного и того же сигнала. Вот тут то все от фазы (начальной точки отсчета) и зависит.
|
|
Дата: 01 Ноя 2010 22:37:15
#
Programmist С фазой дело плохо. Где в ДТМФ? Сигналки плз в студию, с плохой фазой. :) Чё-то мутняк какой-то имхо.
|
|
Дата: 01 Ноя 2010 22:49:09
#
Mesh
Зачем копилку засорять? Сгенерите в Cool-e 3 цифры минимальной (на гране разборчивости) длительности и поверните с середины на 180. Что скажет Code300 не знаю, но у меня такой сигнал декодируется с ошибками, причем все время разными.
Сейчас сам Code300 найду и попробую.
|
|
Дата: 01 Ноя 2010 22:56:50
#
Programmist Ну и ладно. Значит оно вам так надо. :) Успехов.
|
|
Дата: 01 Ноя 2010 23:06:54
#
Mesh
Спасибо. Попробовал Code300. Декодер намного лучше, значит надо работать дальше. Никто ведь не скажет как он устроен, да и если скажет - толку не будет, пока сам не сделаешь. :) Удачи.
|
Реклама Google |
|