Ответ: просили сурцы АОН'а на Си, получайте... ;))) тут весь процесс - от анализа входного потока до получения символа...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ЅOІC 30 мая 2003 г. 14:26
В ответ на: подскажите алгоритм поиска двух максимумов из 6 ( аон ), как оно хоть делаеться примерно ? P.S. учусь помаленьку :) отправлено Larionov Ivan 30 мая 2003 г. 01:43

Спектральный анализ ответов аппаратуры АОН


Допустим, выборки сигнала в цифровой форме идут с частотой 39 мс
(АОН на базе Z80),тогда вызвав функцию calc (приведена ниже) получаем
таблицу результатов спектрального анализа:

ЧастотаПериод (выборки, шт.)Выборки
1699,428 Гц36,66 (phase sin)000000001111111111111111111000000000000000000111111111111111111000000000000000000011111111111111111100000000000000000011111111111111111110000000000000000001111111111111111110000000000000000000111111111111111111000000000000000000111111111111111111100000000000000000
2699,428 Гц36,66 (phase cos) 
3899,685 Гц28,5 (phase sin) 
4899,685 Гц28,5 (phase cos) 
51091,108 Гц23,5 
61091,108 Гц23,5 
71282,051 Гц20000000001111111111000000000011111111110000000000111111111100000000001111111111000000000111111111100000000001111111111000000000011111111110000000000111111111000000000011111111110000000000111111111100000000001111111111000000000111111111100000000001111111111000000000
81282,051 Гц20000000001111100000000001111111111000000000011111111110000000000111111111100000000011111111110000000000111111111100000000001111111111000000000011111111000000000001111111111000000000011111111110000000000111111111100000000001111111110000000000111111111100000000001111
91508,296 Гц17000000001111111110000000001111111100000000011111111000000000111111110000000001111111100000000011111111100000000111111111000000001111111110000000011111111100000000111111111000000001111111110000000001111111100000000011111111000000000111111110000000001111111100000000
101508,296 Гц17 
111693,275 Гц15,143000000001111111100000000111111100000000111111100000000111111100000000111111100000000111111100000000111111110000000111111110000000111111110000000111111110000000111111110000000111111110000000111111110000000011111110000000011111110000000011111110000000011111110000000
121693,275 Гц15,143000000001111000000001111111000000001111111000000001111111100000001111111100000001111111100000001111111100000001111111100000001111111100000001111111100000000111111100000000111111100000000111111100000000111111100000000111111100000000111111110000000111111110000000111


Находим две частоты с максимальным уровнем и декодируем по
CCITT код... и всех делов!



// Процедура вычисления двухчастотного спектра
// Cracked from AON "Русь-20с." by SOIC ;)
//
void calc(BYTE *buf, BYTE *result)
{
int ptr = 0;
int t;
int k = 0;
BYTE C = 0;
BYTE E;

for(int i=0; i < 12; i++) result[i] = 0;

for(int z=0; z < 0x21; z++)
{
t=0;
for(int i=0; i < 6; i++)
{
E = (E << 1) | buf[ptr++];

result[t] += s_add[ s_xor[k] ^ C ];
t++;
k++;
result[t] += s_add[ s_xor[k] ^ C ];
t++;
k++;
}
E = (E << 1) | buf[ptr++];
E = (E << 1) | buf[ptr++];
C = E;
}
}
///////////////////////////////////////////////////

// Таблицы для анализа спектра сигналов CCITT
// Cracked from AON "Русь-20с." by SOIC

// Таблица эталонных выборок сигналов CCITT (6 частот
// по две колонки на одну частоту: sin и cos фазы)
BYTE s_xor[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0xF8,0xFF,0xF8,0xFF,0xF0,
0xFF,0xC0,0xFE,0x00,0xF0,0x00,0xC0,0x01,0x80,0x07,0x00,0x0F,
0xE0,0x00,0x00,0x03,0x00,0x3F,0x0F,0xFF,0x3F,0xFC,0xFE,0xE0,
0x00,0x0F,0x07,0xFF,0xFF,0xFC,0xFC,0x80,0xC0,0x03,0x01,0x1F,
0x07,0xFF,0xFF,0xF0,0xE0,0x00,0x00,0x1F,0x1F,0xFE,0xFC,0xC0,
0xFF,0xFC,0xE0,0x00,0x01,0x7F,0xFF,0xF8,0xE0,0x00,0x03,0x3F,
0xFE,0x00,0x00,0x3F,0xFF,0xF8,0xC0,0x01,0x0F,0xFF,0xF8,0xC0,
0x00,0x00,0x7F,0xFF,0xE0,0x00,0x0F,0xFF,0xF0,0x00,0x07,0x7F,
0x00,0x7F,0xFF,0x80,0x03,0x7F,0xFC,0x80,0x07,0x7F,0xF0,0x80,
0x3F,0xFF,0x00,0x01,0xFF,0xF0,0x01,0x3F,0xF8,0x80,0x0F,0xFF,
0xFF,0xE0,0x03,0xFF,0xC0,0x00,0xFF,0xF0,0x03,0x3F,0xE0,0x01,
0xF0,0x00,0xFF,0xF8,0x03,0xFF,0x80,0x03,0xFE,0xC0,0x1F,0xFE,
0x00,0x07,0xF0,0x00,0xFF,0xF0,0x1F,0xFF,0x01,0x1F,0xE0,0x03,
0x03,0xFF,0x00,0x1F,0x80,0x01,0xF8,0x00,0xFF,0xE0,0x3F,0xFC,
0xFF,0xFF,0x3F,0xFF,0x07,0xFF,0x01,0x3F,0x00,0x0F,0xC0,0x07,
0xFF,0x00,0xFF,0xC0,0xFF,0xE0,0xFF,0xF0,0xFF,0xF0,0x7F,0xF8,
0x80,0x00,0x80,0x00,0x80,0x01,0x80,0x03,0x80,0x07,0x80,0x0F,
0x00,0x3F,0x01,0xFF,0x0F,0xFF,0x1F,0xFE,0x7F,0xFC,0xFF,0xF0,
0x1F,0xFF,0xFF,0xFC,0xFF,0xC0,0xF0,0x00,0xC0,0x03,0x01,0x0F,
0xFF,0xF0,0xF8,0x00,0x00,0x03,0x03,0x7F,0x3F,0xFE,0xFE,0xE0,
0xF8,0x00,0x00,0x0F,0x0F,0xFF,0xFF,0xE0,0xE0,0x01,0x03,0x1F,
0x00,0x03,0x1F,0xFF,0xFE,0x80,0x00,0x07,0x1F,0xFF,0xFC,0xC0,
0x00,0xFF,0xFF,0xE0,0x00,0x07,0x3F,0xFE,0xF0,0x00,0x07,0x3F,
0xFF,0xFF,0xC0,0x00,0x1F,0xFF,0xF0,0x00,0x07,0xFF,0xF8,0x80,
0xFF,0x80,0x00,0x7F,0xFE,0x80,0x03,0x7F,0xF8,0x80,0x07,0x7F,
0xC0,0x00,0xFF,0xFE,0x00,0x0F,0xFF,0xE0,0x03,0x7F,0xF0,0x00,
0x00,0x1F,0xFC,0x00,0x3F,0xFF,0x00,0x07,0xFC,0xC0,0x0F,0xFE,
0x0F,0xFF,0x00,0x07,0xFC,0x00,0x7F,0xFC,0x01,0x3F,0xE0,0x01,
0xFF,0xF8,0x0F,0xFF,0x00,0x0F,0xE0,0x00,0xFE,0xE0,0x1F,0xFE,
0xFE,0x00,0xFF,0xF0,0x3F,0xFE,0x07,0xFF,0x00,0x0F,0xC0,0x03,
0x00,0x00,0xE0,0x00,0xF8,0x00,0xFE,0xC0,0xFF,0xF0,0x3F,0xFC,
0x00,0xFF,0x00,0x3F,0x00,0x1F,0x00,0x0F,0x00,0x07,0x80,0x07,0xC5
};


// Таблица перевода Байта в число бит,установленных в единицу в этом байте
BYTE s_add[] = {
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
};


P.S.: Прошивка была кракнута на написаном мною эмуляторе АОН'ов
под Win32. Если вас интересует, то в версии "Русь 20с."
процедура, которая читает код символа (длительность выполнения около
10 мс) находится по адресу #1DC8 - возвращает символ в регистре A.


А вот вам фрагмент кода из моего аона (http://zxmak.chat.ru/Soft/aon.rar):


calc(bbb, result);

for(int i=0; i < 12; i++)
{
BYTE v = result[i];
if(v < 0x80) v = 0x80 - v;
else v = v + 0x80;

result[i] = sa_level[v];
}


for(int i=0; i < 6; i++)
result[i] = BYTE((WORD(result[i*2]) + WORD(result[i*2+1])) / 2);

BYTE indexL=0, indexH=0;
BYTE vL=0, vH=0;
for(int i=0; i < 6; i++)
{
if(vH < result[i])
{
vL = vH;
vH = result[i];
indexL = indexH;
indexH = i;
}
else if( vL < result[i])
{
vL = result[i];
indexL = i;
}
}
BYTE code = sa_cod[indexL*6+indexH];

return code;

вот таблички sa_level и sa_cod:


// Таблицы для анализа спектра сигналов CCITT
// Cracked from AON "Русь-20с." by SOIC

BYTE sa_level[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03,
0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x07,
0x08, 0x09, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
0x18, 0x19, 0x1A, 0x1C, 0x1D, 0x1E, 0x20, 0x21,
0x23, 0x24, 0x26, 0x27, 0x29, 0x2A, 0x2C, 0x2E,
0x30, 0x31, 0x33, 0x35, 0x37, 0x39, 0x3B, 0x3D,
0x3F, 0x41, 0x43, 0x45, 0x47, 0x49, 0x4B, 0x4D,
0x50, 0x52, 0x54, 0x56, 0x59, 0x5B, 0x5E, 0x60,
0x63, 0x65, 0x68, 0x6A, 0x6D, 0x70, 0x72, 0x75,
0x78, 0x7A, 0x7D, 0x80, 0x83, 0x86, 0x89, 0x8C,
0x8F, 0x92, 0x95, 0x98, 0x9B, 0x9E, 0xA1, 0xA5,
0xA8, 0xAB, 0xAF, 0xB2, 0xB5, 0xB9, 0xBC, 0xC0,
0xC3, 0xC7, 0xCA, 0xCE, 0xD1, 0xD5, 0xD9, 0xDD,
0xE0, 0xE4, 0xE8, 0xEC, 0xF0, 0xF4, 0xF8, 0xFC,
0xFF, 0xFF // на всякий случай
};

BYTE sa_cod[] = {
0x0A, 0x01, 0x02, 0x04, 0x07, 0x0A,
0x01, 0x0A, 0x03, 0x05, 0x08, 0x0A,
0x02, 0x03, 0x0A, 0x06, 0x09, 0x0B,
0x04, 0x05, 0x06, 0x0A, 0x00, 0x0C,
0x07, 0x08, 0x09, 0x00, 0x0A, 0x0A,
0x0A, 0x0A, 0x0B, 0x0C, 0x0A, 0x0A
};



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru