Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Алгоритм Кодирования и декодирования ⇐ ПредыдущаяСтр 2 из 2 Рассмотрим алгоритм рекуррентного кодирования информации на примере упрощенной типовой функция кодирования, имеющей следующий вид:
где: Xi – символ сообщения, подлежащий преобразованию (кодированию);
Алгоритм кодирования следующий: Процесс кодирования в виде алгоритма представлен на рисунке 1.
На приемной стороне осуществляется декодирование сообщения в соответствии с формулами, имеющими вид: X 1*= Y 1 A - B; X 2*= Y 2 X 1*- Y 1; и т.д., Если последний декодированный символ Xn* сообщения совпадает с переданным Xn, то блок передан без искажений. При условии Xn*≠ Xn делается вывод о наличии ошибки и применяется процедура обнаружения места ошибки, заключающаяся в декодировании информационного блока в обратном направлении (реверсный режим): Xn -1*=(Xn* + Yn -1)/ Yn; Xn -2*=(Xn -1*+ Yn -2)/ Yn -1; и т.д.
Процесс декодирования информационного блока в виде алгоритма представлен на рис. 2.
Листинги программ. Кодер (7,4) циклического кода по регистрам. #include <iostream> using namespace std; int app_coder(int x, int y) { int a[4]; int g[4]; int c[3]; for (int i = 0; i < 4; i++) { a[3 - i] = x % 10; g[3 - i] = y % 10; x = x / 10; y = y / 10; } for (int i = 0; i < 3; i++) c[i] = 0; for (int i = 0; i < 4; i++) { int k = (c[2] + a[i]) % 2; if (k==0) { c[2] = c[1]; c[1] = c[0]; } else { c[2] = (c[1] + g[2]+1) % 2; c[1] = (c[0] + g[1]+1) % 2; } c[0] = k; cout << a[i] << " "; for (int j = 0; j < 3; j++) cout << c[j]; cout << endl; } int j = 0; if (a[0] + a[1] + a[2] + a[3] == 0) cout << "000000"; else { while (a[j] == 0) { cout <<a[j]; j++; } }
int k = a[0]; for (int i = 1; i < 4; i++) k = k * 10 + a[i]; for (int i = 0; i < 3; i++) k = k * 10 + c[2 - i]; return k; } int main() { const int gpolinom = 1011; char letter; int x; do { cout << "input code message:" << endl; cin >> x; cout << app_coder(x, gpolinom)<<endl; cout << "One more? (y/n)\n"; cin >> (letter); } while (letter == 'y'); return 0; } Декодер циклического кода (7,4) по регистрам и весу остатка w<=t. int app_decoder(int x, int y) { char letter; int a[7]; int b[7]; int g[4]; int c[3]; for (int i = 0; i < 7; i++) { a[6 - i] = x % 10; x = x / 10; b[6 - i] = a[i]; } for (int i = 0; i < 4; i++) { g[3 - i] = y % 10; y = y / 10; } for (int i = 0; i < 3; i++) c[i] = 0; for (int i = 0; i < 7; i++) { if (c[2] == 0) { c[2] = c[1]; c[1] = c[0]; c[0] = a[i]; } else { c[2] = (c[1] + g[2] + 1) % 2; c[1] = (c[0] + g[1] + 1) % 2; c[0] = (a[i] + 1) % 2; } cout << a[i] << " "; for (int j = 0; j < 3; j++) cout << c[j]; cout << endl; } int w = c[0] + c[1] + c[2]; cout << "w="<< w << endl;
int count = 0; if (w == 0) { if (a[0] + a[1] + a[2] + a[3] == 0) cout << "000"; else { int j = 0; while (a[j] == 0) { cout << a[j]; j++; } } int k = a[0]; for (int i = 1; i < 4; i++) k = k * 10 + a[i]; return k; } else { if (w==1) for (int i = 4; i < 7; i++) a[i] = (a[i] + c[6 - i]) % 2; else { while (w > 1) { cin >> letter; count++; int p = a[0]; for (int i = 0; i < 6; i++) a[i] = a[i + 1]; a[6] = p; for (int i = 0; i < 3; i++) c[i] = 0; for (int i = 0; i < 7; i++) { if (c[2] == 0) { c[2] = c[1]; c[1] = c[0]; c[0] = a[i]; } else { c[2] = (c[1] + g[2] + 1) % 2; c[1] = (c[0] + g[1] + 1) % 2; c[0] = (a[i] + 1) % 2; } cout << a[i] << " "; for (int j = 0; j < 3; j++) cout << c[j]; cout << endl; } w = c[0] + c[1] + c[2]; cout << "w=" << w << endl; } for (int i = 4; i < 7; i++) a[i] = (a[i] + c[6 - i]) % 2; for (int i = 0; i < count; i++) { int p = a[6]; for (int j = 0; j < 6; j++) a[6 - j] = a[5 - j]; a[0] = p; } }
if (a[0] + a[1] + a[2] + a[3] == 0) cout << "000"; else { int j = 0; while (a[j] == 0) { cout << a[j]; j++; } } } int k = a[0]; for (int i = 1; i < 4; i++) k = k * 10 + a[i]; return k; }
int main() { const int gpolinom = 1011; char letter; int x; do { cin >> x; cout << app_decoder(x, gpolinom) << endl; cout << "One more? (y/n)\n"; cin >> letter; } while (letter == 'y'); return 0; }
Вывод по курсовой работе. Таким образом циклические коды широко применяются для исправления ошибок при передаче сообщения по каналу связи. Разработка циклических кодов Хемминга: циклического кода Голея, Рида- Саломона,Кода Хемминга повлияло на дальнейшее развитие кодов исправляющих ошибки. Позже появились уже циклически избыточные коды(англ. Cyclic redundancy check, CRC) — алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных. CRC является практическим приложением помехоустойчивого кодирования, основанном на определённых математических свойствах циклического кода. В, частности, в данном алгоритме используются стандартизованные полиномы. К примеру
Список литературы 1. Дмитриев В.И. «Прикладная теория информации»,М. 1989. 2. Гаранин М.В. и др. Системы и сети передачи информации:Радио и связь,2001-336c.:ил. 3. А.А. Духин «Теория информации»-М.:Гелиос АРВ,2007-248 c.,ил. 4. Глухов М. M., Елизаров В. П., Нечаев А. А. Алгебра: Учебник В 2-х т.Т.II.—М.:Гелиос АРВ,2003.—416с,ил. 5. Коды, исправляющие ошибки. (1972) Авторы: У. Питерсон, Э. Уэлдон. Перевод с английского. Под редакцией Р.Л. Добрушина и С.И. Самойленко. 6. Колесник В.Д., Полтырев Г.Ш. Курс теории информации. М.: Наука, 2006. 7. Вычислительные системы, сети и телекоммуникации. 4-е издание. Авторы – Владимир Бройдо, Ольга Ильина, Питер,2011. 8. Системы и сети передачи данных Авторы:Мельников Д.А. РадиоСофт,2015
9. Таненбаум Э. С.Компьютерные сети. 4-е изд СПб Питер, 2011
|