ВхідРеєстрація
beloshenko
 

Правила форуму :
1. Заборонена нецензурна лексика.
2. Заборонена образа інших користувачів.
3. Дозволена конструктивна критика.
4. Дозволена самореклама.
5. Реклама і повідомлення мають не суперечити з
християнськими і загальнолюдськими цінностями та не критикувати Науково Технічний Прогрес.
6. Реклама має не пропагандувати насильство, гомосексуалізм, неповагу до науки.
7. Рекомендовано дотримуватись структурності.

Благодійна акція. Спасіть кота в Китаї.

Ви можете створювати теми та брати участь у їх
обговоренні на цьому форумі. Бажаю щоб мій форум
приніс Вам максимально користі і сприяв досягненню
Ваших мрій...


Додати до обраного Відправити мені e-mail
     
Що нового?
Про власника сайту
Зображення
Файловий архів
Щоденник
Форум
Сторінки
Посилання
Чат
Лічильник
Друзі
Мітки
Опитування
Митець Юлія Красна
Радіоінженер Анатолій Бєлошенко
IS Beloshenko
 
Цікаві сайти
 
 
Відвідувачі
 
newmanal Алексей
1 день тому 19.03.2010 20:51:42
stanislav0849 Станислав Люлевич
6 дні(в) тому 14.03.2010 15:47:15
chelentano233 Andr
8 дні(в) тому 12.03.2010 20:34:42
cappt Олександр
11 дні(в) тому 09.03.2010 11:28:24
k-lenysya olena
14 дні(в) тому 06.03.2010 20:25:10
 
Календар
 
<
Березень 2010
>
ПнВтСрЧтПтСбНд
1234567
891011121314
15161718192021
22232425262728
293031
 
Підписка
 
E-mail: 
 
 
 
 
Оцініть мій сайт
1
2
3
4
5

Результати опитування
 
 
Коли мова йде про давні о...
19 дні(в) тому 02.03.2010 00:34:06
OK!
43 дні(в) тому 05.02.2010 21:30:29
class A { float a; ...
55 дні(в) тому 25.01.2010 02:27:34
Можна проводити десь так ...
55 дні(в) тому 25.01.2010 02:18:25
Site : http://www.crypl...
55 дні(в) тому 24.01.2010 15:54:23
 
Інші сайти
 
tv-studia Андрій Дорош
sumtsova Лариса
blackdahlia
buryachok Костянтин Костянтинович
chystokostya Kostya Sheeper
 
Коментовані запису
 
Форум програмістів
Повідомлення: 64
ЛЕГКИЙ ЗАРОБІТОК В НЕТІ !...
Повідомлення: 42
Кодер Декодер БЧХ
Повідомлення: 17
New! Одна із стратегій ви...
Повідомлення: 8
Бог тебя любит.
Повідомлення: 8
 
Топ коментаторів
 
beloshenko Микита Бєлошенко
Коментрі: 194
nazar123 Назар
Коментрі: 8
alisa-2009 alisa
Коментрі: 7
lola605 lola
Коментрі: 5
vbaran Вадим Баранов
Коментрі: 4
  Повернутися на головнуbeloshenko / Форум / Програмування / Кодер Декодер БЧХ  

Кодер Декодер БЧХ

4.00 (1)

Створити темуСтворити тему | До списку

ДодавТекст

sashko
Кодер Декодер БЧХ
281 день тому 12.06.2009 16:27:15 Цитата('609011','88','6','2911')">Повідомити про спам

Написати мовою С++ програму, що реалізує алгоритм роботи циклічного кодера та декодера для коду БЧХ, .Писати в консолі 1. Функція кодування зчитує число у двійковому вигляді та виводить закодоване повідомлення у двійковому вигляді. Параметри коду БЧХ задаються у середині програми. Відповідно до цих даних вибрати мінімальний по розміру беззнаковий цілий тип. 2. Функція декодування зчитує закодоване повідомлення у двійковому вигляді, і зчитує у двійковому виді маску з “1” у спотворюваних розрядах, за допомогою якої здійснює інверсію розрядів закодованого повідомлення . Результат декодування виводить. Механізм виявлення та виправлення помилок реалізувати за допомогою алгоритму з циклічними зсувами. Усю необхідну додаткову інформацію виводити у вікно.

У вхідних даних коду БХЧ: n – довжина закодованого повідомлення, s – кількість помилок, що виправляються, P(x) – твірний поліном. Кількість контрольних бітів визначається із залежності: n = k + m, а запис твірного полінома, представленого у вигляді вісімкових цифр, перетворюється шляхом переводу кожної вісімкової цифри у двійкове число. Наприклад, P(x) = 2467. Цифрі 2 відповідає двійкове число 010, цифрі 4 – 100, цифрі 6 – 110, а цифрі 7 – 111, і остаточно – 10100110111 ( x^10 + x^8 + x^5 + x^4 + x^2 + x +1 ).д

параметри циклічного коду : n = 63; k = 57; s = 1; P(x) = 103



Коментар: 17 Переглядів: 1013
Мітки: поможіть будь-ласка реалізувати програму . наперед вдячний

beloshenko Надіслати повідомлення
Микита Бєлошенко
image
281 день тому 12.06.2009 20:39:38 Цитата('609011','609011','6','2912')">Повідомити про спам
-> Збереження двійкового числа і його перетворення.
Якщо не сильно перейматись економією пам'яті, то 
представити двійнове число можна просто у short int 
масиві.
Але краще зробити двійковий масив m2.
Для прикладу можна привести три масиви,
що використовуються при XOR кодуванні.

...
short int m1[100];
bool m2[100];
bool b_input[100]; // масив на вході
bool b_key[100];   // масив ключа
bool b_result[100] // масив результату
...

-> Графічний інтерфейс, а також ввод-вивід.
Ну писати треба тут багато, простіше
подивитись у http://www.firststeps.ru -> Visual C -> 
MFC.
Якщо казати про консоль то необхідно згадати такі 
бібліотеки, як ->

...
#include "stdio.h"
#include "conio.h"
#inclyde "iostream.h"
...

Команди і оператори з цих бібліотек необхідні для 
організації вводу-виводу. Причому остання бібліотека 
(iostream.h) потрібна для потоковго вводу і виводу.

printf,scanf,>>.

Ввод числа i типу int з клавіатури,
а також зчитування одного символу. ->
...
int i;
char ch;
cin >> i; 
ch = getch();
...

Варто додати, що cout - вивід на екран, а cin - ввод з 
клавіатури. Стрічку закінчує endl.

-> Перехід до двійкового числа.

   Наведемо алгоритм переходу до дійкового 
представлення числа N. Цифри двійкового числа 
отримуються через змінну   r з кінйя двійкового числа.

   1. r = остача від ділення N на 2;
   2. N = N поділити на 2 націло;
   3. Якщо N>1 то перейти до 1;   

-> По суті алгоритму.

Код БЧХ належить до класу циклічних кодів.

-> Джерела.
1. Код БЧХ у Вікіпедії (РУ).
http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D...
2. Виправлення помилок.
http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BD%D0...

P.S.
Потрохи розбираюся у поставленій задачі.

sashko
image
281 день тому 12.06.2009 21:34:42 Цитата('609011','88','6','2920')">Повідомити про спам

А зміг би написати цей кодер декодер бчх ? Просто проблема в тому що я сам покишо неможу цього написати ... А мені просто ну дуже потрібно . Міжіншим ось оригінал завдання в .doc .

http://slil.ru/27752332


sashko
image()
281 день тому 12.06.2009 21:41:52 Цитата('609011','88','6','2914')">Повідомити про спам

http://slil.ru/27752332 Ось тут можна завантажити оригінал завдання , там є опис , та деякі підказки ...

P.S Дякую що взялися за цю програму.


sashko
imageRE:
281 день тому 12.06.2009 21:49:49 Цитата('609011','88','6','2919')">Повідомити про спам

P.S. Потрохи розбираюся у поставленій задачі.


Дуже вам вдячний ...

Міжіншим ось оригінал завдання: http://slil.ru/27752332 . Тут є деякі підказки та приклади ...


sashko1
image!
281 день тому 12.06.2009 21:52:47 Цитата('609011','88','6','2913')">Повідомити про спам

http://slil.ru/27752332 Це оригінал завдання , можливо Вам це пригодиться ... Там э деякі підказки та куски програмного коду .

Дякую що взялися за цю програму :)



beloshenko Надіслати повідомлення
Микита Бєлошенко
imageЯ надіслав модуль з поліномами на EMAIL.
277 дні(в) тому 16.06.2009 12:00:19 Цитата('609011','609011','6','2922')">Повідомити про спам

Там є і операція добутку поліномів, як я побачив то закодоване число представлене через поліном, що є добутком двох поліномів. Один з цих поліномів дається кодом а інший числом, яке кодується. Тому процедура добутку поліномів в цьому кодуванні потрібна. Там вона на Паскалі. Якщо б Ви змогли відтягнути до завтра (вечір), то я переклав б її на Сі і написав вже якийсь кодер. Поки даю що є.

type
  float=real;
  polynomial=^term;
  term=record
         degree:integer;
         coefficient:float;
         next:polynomial;
  end;

...

function product_poly(p,q:polynomial):polynomial;
var p_run,q_run,s:polynomial; t:term;
begin
  s:=nil; t.next:=nil; p_run:=copy_poly(p);
  while p_runnil do begin
    q_run:=copy_poly(q);
    while q_runnil do begin
      t.degree:=p_run^.degree+q_run^.degree;
      t.coefficient:=p_run^.coefficient*q_run^.coefficient;
      insert_term(t,true,s); q_run:=q_run^.next;
    end; p_run:=p_run^.next;
  end; product_poly:=s;
end;

По суті можна просто множити поліноми як масиви, а не як списки, а цей алгоритм на сайті вже є і реалізован на Сі.

http://beloshenko.e-hosting.com.ua/forum/494/1357_...


sashk0 Надіслати повідомлення
imagemylivepage.com
Олександр
imageДЯКУЮ !!!
277 дні(в) тому 16.06.2009 17:33:36 Цитата('609011','4258944','6','2923')">Повідомити про спам

Безмежно Вам вдячний !!!

У мене є час до пятниці (включно) , але це вже останій термін.

Такщо якщо маєте  час ,бажання та сили ще троха то я б Вас попросив перекласти , доробити що нехватає і тд ...

 

Дуже дуже дякую Вам !!!

 


beloshenko Надіслати повідомлення
Микита Бєлошенко
imageПродовжимо прості логічні міркування.
275 дні(в) тому 18.06.2009 14:42:11 Цитата('609011','609011','6','2924')">Повідомити про спам

Схема множення поліномів вже якась є, залишилось лише перекласти на Сі. Поцікавимось питанням кодування. Як отримати закодований поліном? На це питання відповідь дає Вікіпедія. Кодовий поліном c(x) отримується з інформаційного полінома m(x) шляхом домноження(1) на поліном g(x).

(1) c(x)=m(x)*g(x)

Це фактично і є кодування але для поліномів. Поліном g(x) називається породжуючим.


sashk0 Надіслати повідомлення
imagemylivepage.com
Олександр
imageмммм
275 дні(в) тому 18.06.2009 15:03:15 Цитата('609011','4258944','6','2925')">Повідомити про спам

Зрозуміло.А в якому значенні породжуючим ?

І ще можете коментарі "ключових моментів"  програми  понаписувати . Щоб я ше сам розібрався з програмою ...

А таке питання.Ви встигнете до завтра (пятниці,вечора) завершити написання програми ? :)


beloshenko Надіслати повідомлення
Микита Бєлошенко
imageЗараз намагаюсь написати...
275 дні(в) тому 18.06.2009 17:32:21 Цитата('609011','609011','6','2926')">Повідомити про спам
1). Перетворення числа у двійковий поліном.
P(x^1)->x+1 -> 11->3
P(x^5)->x^5+x^3+1 ->101001->41
P(x^8)->x^8+x^4+x^3+x^2+1 ->100011101->285
Бачимо, що у скобках стоїть степінь поліному,
а коефіцієнти поліному дорівнюють цифрам двійкового 
розкладу числа.

Кодер. (з *.doc файлу, там інші позначення ніж у Вікіпедії)

Крок 1. Множимо вхідну кодову комбінацію g(x) на одночлен x^m, де m - степінь твірного (породжуючого) 
полінома p(x).

Крок 2. Ділимо g(x)*x^m на твірний поліном p(x).

g(x)*x^m
-------- = q(x) + r(x) / p(x)
p(x)

power(g(x)) = power(q(x)) (степінь)
power(r(x)) < m
q(x) - частка від ділення.
r(x) - залишок від ділення.

Тобто для закодованого повідомлення, враховуючи особливості алгебри двійкового поля, отримаємо для результуючого полінома

f(x) = p(x) * q(x) = g(x) * x^m + r(x).

Де f(x) - закодований поліном.

beloshenko Надіслати повідомлення
Микита Бєлошенко
imageДомноження g(x) на x^m
275 дні(в) тому 18.06.2009 18:44:08 Цитата('609011','609011','6','2929')">Повідомити про спам
void main()
{
	int i;

	int data;
	int code;
	int m_data[100], p_data;
	int m_code[100], p_code;
	int r,d;

	data = 13; // 8 + 4 + 0 + 1

	d = data;
	p_data = 0;
	while(d>0)
	{
		r = d % 2;
		d = d / 2;

		m_data[p_data] = r;
		p_data ++;
	};

	code = 11; // 8 + 0 + 2 + 1

	d = code;
	p_code = 0;
	while(d>0)
	{
		r = d % 2;
		d = d / 2;

		m_code[p_code] = r;
		p_code ++;
	};

	// Визначення степені полінома з кодом
	int m = p_code - 1;

        // Шукаємо g(x) * x ^ m
	int g_x_x_m[100];
	int p_g_x_x_m = p_data + m;
	int p_data_;

	for(i=0; i< = p_g_x_x_m - 1; i++)
	{
		g_x_x_m[ i] = 0;
	};

	p_data_ = p_data;
	while(p_data > -1)
	{
		g_x_x_m[p_data + m] = m_data[p_data];
		p_data--;		
	};
	p_data = p_data_;
}

beloshenko Надіслати повідомлення
Микита Бєлошенко
imageПрограма
275 дні(в) тому 18.06.2009 19:07:47 Цитата('609011','609011','6','2931')">Повідомити про спам
void main()
{
	int i;

	int data;
	int code;
	int m_data[100], p_data;
	int m_code[100], p_code;
	int r,d;

	data = 13; // 8 + 4 + 0 + 1

	d = data;
	p_data = 0;
	while(d>0)
	{
		r = d % 2; d = d / 2;
		m_data[p_data] = r;
		p_data ++;
	};

	code = 11; // 8 + 0 + 2 + 1

	d = code;
	p_code = 0;
	while(d>0)
	{
		r = d % 2; d = d / 2;
		m_code[p_code] = r;
		p_code ++;
	};

	int m = p_code - 1; // Визначення степені полінома з кодом

	// Шукаємо g(x) * x ^ m
	int gxxm[100];
	int gxxm_[100];
	int pgxxm = p_data + m;
	int p_data_;

	for(i=0; i< =pgxxm - 1; i++)
	{
		gxxm[ i] = 0;
		gxxm_[ i]=0;
	};

	p_data_ = p_data;
	while(p_data>-1)
	{
		gxxm[p_data + m] = m_data[p_data];
		gxxm_[p_data + m] = m_data[p_data];
		p_data--;		
	};
	p_data = p_data_;

	// Обрахунок r(x)
	int rx[100];
	int p_rx;

        //...

	
	// Обрахунок gxxm = gxxm_ + rx

        //...

}

sashk0 Надіслати повідомлення
imagemylivepage.com
Олександр
imageпомилка:
275 дні(в) тому 18.06.2009 19:09:44 Цитата('609011','4258944','6','2932')">Повідомити про спам

Build
  [C++ Error] Unit1.cpp(49): E2188 Expression syntax
  [C++ Warning] Unit1.cpp(62): W8004 'p_g_x_x_m' is assigned a value that is never used

 

 

Які ви бібліотеки підключали ?


beloshenko Надіслати повідомлення
Микита Бєлошенко
imageТут ніяких бібліотек
275 дні(в) тому 18.06.2009 19:52:01 Цитата('609011','609011','6','2933')">Повідомити про спам

Поки ніяких бібліотек не потрібно. Просто повставляв пробіли в [i ] та = >. (Прогляньте синтаксис gxxm[ i] = 0; gxxm_[ i]=0; i< =pgxxm ) Їх цей редактор як теги читає. Це був тільки фрагмент. З чисел отримується їх двійковий розклад (коефіцієнти поліномів).


beloshenko Надіслати повідомлення
Микита Бєлошенко
imageНа цей момент ...
275 дні(в) тому 18.06.2009 20:19:32 Цитата('609011','609011','6','2934')">Повідомити про спам
// Алгоритм кодування
// має виглядати приблизно так ...
int i;
int r,d;
int m;

int data;
int code;
int m_data[100], p_data, p_data_;
int m_code[100], p_code;

int gxxm[100], p_gxxm;
int gxxm_[100], p_gxxm_;
int rx[100], p_rx;
int minus[100], p_minus;

// m_code[] < gxxm_[]
bool b1()
{
	if(p_code > p_gxxm_)
	{
		return false;
	} else
	{
	};

	// Тут необхідно охайно прописати 
	// порівняння масивів
}

// minus[] < gxxm_[]
bool b2()
{
	if(p_minus > p_gxxm_)
	{
		return false;
	} else
	{
	};

	// Тут необхідно охайно прописати 
	// порівняння масивів
}

void main()
{
	data = 13; // 8 + 4 + 0 + 1

	d = data;
	p_data = 0;
	while(d>0)
	{
		r = d % 2; d = d / 2;
		m_data[p_data] = r;
		p_data ++;
	};

	code = 11; // 8 + 0 + 2 + 1

	d = code;
	p_code = 0;
	while(d>0)
	{
		r = d % 2; d = d / 2;
		m_code[p_code] = r;
		p_code ++;
	};

	m = p_code - 1; // Визначення степені полінома з кодом

	// Шукаємо g(x) * x ^ m
	p_gxxm = p_data + m;
	p_gxxm_ = p_gxxm;

	for(i=0; i< =p_gxxm - 1; i++)
	{
		gxxm[ i] = 0;
		gxxm_[ i]=0;
	};

	p_data_ = p_data;
	while(p_data >-1)
	{
		gxxm[p_data + m] = m_data[p_data];
		gxxm_[p_data + m] = m_data[p_data];
		p_data--;		
	};
	p_data = p_data_;

	// Обрахунок r(x)

	while(b1() == true)
	{
		for(i = 0; i< =p_code - 1; i++)
		{
			minus[i ] = m_code[ i];
		};
		p_minus = p_code;
		while (b2() == true)
		{
			for(i = p_minus; i > -1; i--)
			{
				minus[i+1] = minus[ i];
			};
			minus[0] = 0;
			p_minus++;
		};
		for(i = 0; i< =p_minus - 1; i++)
		{
			gxxm_[ i] = gxxm_[ i] - minus[ i];
		};
		// Сюди необхідно вставити корекцію gxxm_[]
	};

	for(i = 0; i< =p_gxxm_; i++)
	{
		rx[ i] = gxxm_[ i];
	};
	p_rx = p_gxxm_;


	
	// Обрахунок gxxm = gxxm_ + rx

}

beloshenko Надіслати повідомлення
Микита Бєлошенко
imageУсе втомився ...
275 дні(в) тому 18.06.2009 20:59:09 Цитата('609011','609011','6','2935')">Повідомити про спам
// Якась програма є ...
// Треба доробити останню дію (мабуть проксорити масив по r[]),
// тоді буде кодер, на декодер мене не вистачить бо треба писати диплом.
// Я вишлю код на EMAIL, скоріш за все там правильно, мінімум
// він компілюється, але треба протрасувати його.

int i;
int r,d;
int m;

int data;
int code;
int m_data[100], p_data, p_data_;
int m_code[100], p_code;

int gxxm[100], p_gxxm;
int gxxm_[100], p_gxxm_;
int rx[100], p_rx;
int minus[100], p_minus;

// m_code[] < gxxm_[]
bool b1()
{
	if(p_code > p_gxxm_)
	{
		return false;
	} else
	{
		if(p_code < p_gxxm_)
		{
			return true;
		} else
		{
			i = p_code;
			while((gxxm_[ i ]==m_code[ i ])&&(i>0))
			{
				i--;
			};
			if(gxxm_[ i ]>m_code[ i ])
			{
				return true;
			} else
			{
				return false;
			};
		};
	};	
}

// minus[] < gxxm_[]
bool b2()
{
	if(p_minus > p_gxxm_)
	{
		return false;
	} else
	{
		if(p_minus < p_gxxm_)
		{
			return true;
		} else
		{
			i = p_minus;
			while((minus[ i ]==gxxm_[ i ])&&(i >0))
			{
				i--;
			};
			if(gxxm_[ i ] > minus[ i ])
			{
				return true;
			} else
			{
				return false;
			};
		};
	};	
}

void main()
{
	data = 13; // 8 + 4 + 0 + 1

	d = data;
	p_data = 0;
	while(d>0)
	{
		r = d % 2; d = d / 2;
		m_data[p_data] = r;
		p_data ++;
	};

	code = 11; // 8 + 0 + 2 + 1

	d = code;
	p_code = 0;
	while(d>0)
	{
		r = d % 2; d = d / 2;
		m_code[p_code] = r;
		p_code ++;
	};

	m = p_code - 1; // Визначення степені полінома з кодом

	// Шукаємо g(x) * x ^ m
	p_gxxm = p_data + m;
	p_gxxm_ = p_gxxm;

	for(i=0; i< =p_gxxm - 1; i++)
	{
		gxxm[ i ] = 0;
		gxxm_[ i ]=0;
	};

	p_data_ = p_data;
	while(p_data>-1)
	{
		gxxm[p_data + m] = m_data[p_data];
		gxxm_[p_data + m] = m_data[p_data];
		p_data--;		
	};
	p_data = p_data_;

	// Обрахунок r(x)

	while(b1() == true)
	{
		for(i = 0; i< =p_code - 1; i++)
		{
			minus[ i ] = m_code[ i ];
		};
		p_minus = p_code;
		while (b2() == true)
		{
			for(i = p_minus; i>-1; i--)
			{
				minus[i+1] = minus[ i ];
			};
			minus[0] = 0;
			p_minus++;
		};
		for(i = 0; i< =p_minus - 1; i++)
		{
			gxxm_[ i ] = gxxm_[ i ] - minus[ i ];
		};
		
		// Корекція числа gxxm_[];
		i=0;
		while(i< =p_gxxm_)
		{
			while(gxxm_[ i ] < 0)
			{
				gxxm_[ i+1]--; // Займаємо одиничку з старшого розряду
				gxxm_[ i] = gxxm_[ i] + 2;				
			};
			i++;
		};
		if(gxxm_[p_gxxm_] >0)
		{
			p_gxxm_ = p_gxxm_;
		} else
		{
			p_gxxm_--; // При діленні вже використан старший розряд
		};
	};

	for(i = 0; i< =p_gxxm_; i++)
	{
		rx[ i] = gxxm_[ i];
	};
	p_rx = p_gxxm_;


	// Треба реалізувати обрахунок gxxm = gxxm_ + rx

}

beloshenko Надіслати повідомлення
Микита Бєлошенко
imageTO sahk0
274 дні(в) тому 20.06.2009 01:43:05 Цитата('609011','609011','6','2937')">Повідомити про спам
Якщо є можливість підкорегуйте алгоритм ділення в кодері.
Візміть його з паскалевського уніту.
А як робити списки у Сі можна подивитись у
програмі
http://www.beloshenko.org.ua/Lists.html .
Скоро здаю захист.
 
 
Ім'я Пароль
розширений... ( / Реєстрація )

Тема

В тексті можна використовувати Wiki або HTML теги




 
Хто на сайті?
 
Анонімні: 3, Зареєстровані: 0 (?)
Скарга | | Design by Drive | © Kolobok smiles, Aiwan