Пpивет, All!
А как сделана в АОH'ах фильтpация 2 из 8 может кто мне скажет, или хотя бы отпpавит к соответствyющим интеpнетовсим pесypсам... ???
С yважением, Oleg
Пpивет, All!
А как сделана в АОH'ах фильтpация 2 из 8 может кто мне скажет, или хотя бы отпpавит к соответствyющим интеpнетовсим pесypсам... ???
С yважением, Oleg
OP> А как сделана в АОH'ах фильтpация 2 из 8 может кто мне скажет, или хотя бы
В алгоритме имени АОHа используется не БПФ, а ДПФ над 1-разрядными отсчётами. Ввиду чего (такой разрядности) операция умножения вырождается в логическую операцию "исключающее или", иначе XOR, что в свою очередь позволяет умножать аж по 8 значений за раз, при 8-разрядом аккумуляторе. То есть, что это значит, что выражение вида следующего вида:
S = sum( X(1:N) .* e.^(-i*2*pi*(1:N)*n/N) ), где N -- число дискретных отсчётов, над которыми производится преобразование, i -- мнимая единица, а соотношение n/N определяет как раз период обнаруживаемой частоты, то-есть n -- число её периодов в N отсчётах. X -- массив входных значений.
вырождается в такое вот:
S = sum( xor( X(1:N), cos(2*pi*(1:N)*n/N)>0 ) \ - i*xor( sin(2*pi(1:N)*n/N)>0 ) );
(это выражения octave или mathlab)
Для определения на уровне гудит/не гудит фаза сигнала не нужна, равно как и точное значение амплитуды, достаточно отношения между всеми 6-ю частотами, от полученной суммы остаётся взять даже не корень суммы квадратов, а ради простоты -- сумму абсолютных значений мнимой и действительной части: abs(real(S)) + abs(imag(S));
И так 6 раз, для каждой обнаруживаемой частоты. После чего остаётся только выбрать частоты с максимальной амплитудой.
Что до кодирования в микропроцессоре, то скоростной кирпичик программы имеет два 8-разрядных регистра, пока один вводится, другой ксорится, потом введённый копируется в тот который ксорится -- это так называемый doublebuffering. В каждом из регистров представлены
8 последних значений с входного компаратора (1-разрядный АЦП), через равные промежутки времени. Тот регистр который ксорится, от момента как будет загружен из того регистра в который данные попадают из компаратора, и до следующего такого момента, успевает 2*N раз проксориться с байтом "квадратного" синуса и косинуса каждой частоты (состоит исключительно из 0 и 1). В байте тоже 8 последовательных, по времени, значений амплитуды. И тут же, 2*N раз, после каждого XOR по табличке, это для скорости, считается число установленных разрядов в байте, оно и суммируется в отдельном регистре для каждой частоты. После окончания полного цикла (N в формуле сверху) производятся остальные вычисления. И для Z80, и для i51, и для PIC это даёт ~2-кратный выигрыш по скорости, но не по байтам... AFAIK, в Руси-23/25 на Z80 и i51 именно так и сделано.Касается выбора N, здесь выбора как такового и нет. Реальные значение длительности одной посылки имеют нижнюю границу в 25 миллисекунд, что в свою очередь ограничивает N сверху в ~12 мс -- только по одному преобразованию невозможно сделать никаких выводов, потому как оно может попасться на стык меж двух посылок, нужно минимум два преобразования на цифру. Есть и другое ограничение -- весьма желательно, чтоб N выбиралось таким образом, что во время отведённое на одно преобразование укладывалось целое число периодов каждой из частот. Этим требованиям промежуток в 10мс идеально соответствует, тем более, что при таком раскладе "гармошка" (sin(x)/x) частотного отклика такого "фильтра" очень хорошо попадает в нули на всех других используемых в АОH частотах кроме данной. Во всех известных АОHах используется 10мс. Что же до численного значения N -- числа отсчётов, оно зависит от частоты дискретизации. Типично, порядка 25КГц (в "Руси" так точно). Это уже определяется крутизной фильтра, он обязательно нужен, на входе компаратора, и другими, мало понятными мне факторами...
Hо это всё сказанное -- ерунда. Для собственно определения номера, достаточно важно знать, как потом вычленить сам этот номер из массива результатов преобразования, как выдавить из АТС ответ и определить что он вообще есть и т.п... Типично, это в стандартах не сказано, длина посылки варьируется от 25 до 100мс, причём для каждой цифры может быть по-своему. В передаче могут быть паузы и выпадения отдельных частот... Типично, в АОHах результат преобразования тут же, непосредственно после каждого преобразования, декодируется в цифру, и тут же, полученный поток цифр фильтруется. Для выделения наиболее вероятной из цифр, по мажоритарному принципу, из, к примеру, последних 4-х штук. И самое главное -- для уменьшения их числа (их 100 штук на секунду, при типичном объёме ОЗУ в сотню-другую байт, и длительности посылки до 1.5-а секунд). Так поступает и "Русь". После того как вся посылка принята, в ОЗУ имеется массив "сырого кода", который в той-же "Руси" можно просмотреть, при желании, в смысле это штатная её функция. Он (сырок код) характеризуется, в частности, тем, что в нём исключены повторы цифр, ещё на стадии фильтрации. Из него уже и декодируется номер, тут, IMHO, самая главная задача алгоритма АОHа и заключается -- если на предыдущих этапах практически не было решений отличных от единственного очевидного и верного, то в данном случае есть множество весьма не однозначных решений, с весьма неопределённым результатом на выходе...
OP> отпpавит к соответствyющим интеpнетовсим pесypсам... ???
Тут как-то ссылка давалась: "Радиотехнические системы", под pед. Ю.М.Казаринова, Москва, "Высшая Школа", 1990. Я думаю, толку будет больше, чем от интернет-ресурсов.
PS: исправьте настройки ваших программ. HЕ HУЖHО в fido заменять русские строчные буквы "р" и "у" на аналогичные по начертанию латинские. /Требует замены только буква "H" заглавная/. В частности, вы препятствуете машинной обработке информации. Так, например, поисковая система Google не сможет найти ваши письма по ключевым словам. И в следующий раз, когда вы задаёте в эхоконференцию вопрос, рискуете остаться без ответа. (это для извлечения ссылок на интернет-ресурсы я так предлагаю использовать google groups).
Have something to add? Share your thoughts — no account required.
Ask the community — no account required