реклама на сайте
подробности

 
 
6 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Алгоритм CRC16
ASN
сообщение Apr 15 2010, 10:07
Сообщение #31


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



vallav
А вот с тем, что посчитать 16 битную сумму намного проще и быстрее, чем правильное 16 битное CRC несогласен.
На аппаратной логике практически любая CRC считается (и проверяется) "влёт". Не факт, что 16 битное сложение (и выше) будет легче.
Для быстрого расчёта на ЭВМ есть эффективные табличные методы вообще без арифметических операций (кроме XOR).
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 15 2010, 10:31
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ASN @ Apr 15 2010, 13:22) *
А вот с тем, что посчитать 16 битную сумму намного проще и быстрее, чем правильное 16 битное CRC несогласен.

Действительно - есть методы ускоряющие расчет CRC... Но, имхо, скорость их работы не превысит скорости выполнения операции типа: Sum+=Data[i];
Впрочем, могу изменить своё мнение, если Вы приведете исходный текст и временные характеристики программ подсчета CRC, и программы подсчета простой суммы.
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 15 2010, 11:26
Сообщение #33


Частый гость
**

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(ASN @ Apr 15 2010, 14:22) *
vallav
А вот с тем, что посчитать 16 битную сумму намного проще и быстрее, чем правильное 16 битное CRC несогласен.
На аппаратной логике практически любая CRC считается (и проверяется) "влёт". Не факт, что 16 битное сложение (и выше) будет легче.
Для быстрого расчёта на ЭВМ есть эффективные табличные методы вообще без арифметических операций (кроме XOR).


На аппаратной логике и БПФ делается влет.
Go to the top of the page
 
+Quote Post
ASN
сообщение Apr 15 2010, 11:33
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Палыч
Пример на аппаратной логике расчёта обсуждаемой CRC16 для однобитного входного потока:
Код
function nextCRC16
    (Data: std_logic;
       crc:  std_logic_vector(15 downto 0))
return std_logic_vector is

    variable d:      std_logic_vector(0 downto 0);
    variable c:      std_logic_vector(15 downto 0);
    variable newcrc: std_logic_vector(15 downto 0);

  begin
    d(0) := Data;
    c      := crc;
    newcrc(0) := d(0) xor c(15);
    newcrc(1) := c(0);
    newcrc(2) := c(1);
    newcrc(3) := c(2);
    newcrc(4) := c(3);
    newcrc(5) := d(0) xor c(4) xor c(15);
    newcrc(6) := c(5);
    newcrc(7) := c(6);
    newcrc(8) := c(7);
    newcrc(9) := c(8);
    newcrc(10) := c(9);
    newcrc(11) := c(10);
    newcrc(12) := d(0) xor c(11) xor c(15);
    newcrc(13) := c(12);
    newcrc(14) := c(13);
    newcrc(15) := c(14);
    return newcrc;
  end nextCRC16;

Требуется 16 триггеров. Не больше чем для простой суммы.

Расчёт для 8-ми битной ЭВМ табличным способом:
Код
void set_fcs(uint16 fcs_init, uint8 *buff, uint16 len)
{
while(len--)
     fcs_init = (fcs_init >> 8) ^ fcs_table[(fcs_init ^ *buff++)];
fcs_init ^= 0xFFFF;
*buff++ = (uint8)fcs_init;
*buff     = (uint8)(fcs_init>>8);}

Сложение 8 битного числа с 16 битным Sum+=*Data++ чуть быстрее.
Именно поэтому и не согласен, что посчитать 16 битную сумму намного проще и быстрее, чем правильное 16 битное CRC.
Поскольку особого преимущества нет, IMHO, лучше использовать проверенные алгоритмы.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Apr 15 2010, 13:34
Сообщение #35


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(vallav @ Apr 15 2010, 12:49) *
С чего Вы взяли, что я настаиваю именно на таком вычислении контрольной суммы?
Я просто спросил - почему CRC лучше прямой суммы.
...
Так что скажите для случая 16 битной суммы?

Есть такое понятие - кодовое расстояние. Это число разрядов в двух битовых последовательностях которые отличается. Если у Вас в принимаемой последовательности сбойнул один бит, то кодовое расстояние между правильной и ошибочно принятой последовательности равно 1, если два бита - то 2 и т.д. Так вот, математически доказано, что CRC (которое является фактически делением на определенные полиномы) покрывает максимально возможное кодовое расстояние ошибок для данной длины корректирующего кода . То есть, обнаруживает максимально возможно количество единичных искажений. Если принято какое-то значение CRC, то для получения того же значения CRC нужно исказить некоторое количество бит (ЕМНИП, 14 битов минимум для приведенной CRC-16). Если же у Вас просто сумма, то достаточно исказить всего два бита (например, инвертировать младшие биты в байтах в которых эти биты несовпадают) и ошибка уже не будет обнаружена. Вот поэтому CRC намного лучше простой суммы.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 15 2010, 14:06
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(VslavX @ Apr 15 2010, 16:49) *
для получения того же значения CRC нужно исказить некоторое количество бит (ЕМНИП, 14 битов минимум для приведенной CRC-16)
Имхо, Вам память - изменяет. Насколько помню: кодовое расстояние CRC уменьшается с увеличением длины блока данных, и для приведенной CRC16-CCITT при длине блока данных 256 байт оно равно 3.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Apr 15 2010, 14:56
Сообщение #37


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Палыч @ Apr 15 2010, 17:21) *
Имхо, Вам память - изменяет. Насколько помню: кодовое расстояние CRC уменьшается с увеличением длины блока данных, и для приведенной CRC16-CCITT при длине блока данных 256 байт оно равно 3.

Очень может быть - я лет 10 назад про выбор CRC читал, возможно, цифра была приведена для более коротких блоков, и, может быть, вообще не для полинома выбранного CCITT (он вроде как не самый удачный). Но то что CRC обеспечивает максимально возможное для линейных кодов минимальное кодовое расстояние - это вроде бы на сегодня так.
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 15 2010, 17:17
Сообщение #38


Частый гость
**

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(VslavX @ Apr 15 2010, 17:49) *
Есть такое понятие - кодовое расстояние. Это число разрядов в двух битовых последовательностях которые отличается. Если у Вас в принимаемой последовательности сбойнул один бит, то кодовое расстояние между правильной и ошибочно принятой последовательности равно 1, если два бита - то 2 и т.д. Так вот, математически доказано, что CRC (которое является фактически делением на определенные полиномы) покрывает максимально возможное кодовое расстояние ошибок для данной длины корректирующего кода . То есть, обнаруживает максимально возможно количество единичных искажений. Если принято какое-то значение CRC, то для получения того же значения CRC нужно исказить некоторое количество бит (ЕМНИП, 14 битов минимум для приведенной CRC-16). Если же у Вас просто сумма, то достаточно исказить всего два бита (например, инвертировать младшие биты в байтах в которых эти биты несовпадают) и ошибка уже не будет обнаружена. Вот поэтому CRC намного лучше простой суммы.


Одиночные ошибки обоими способами обнаруживаются все.
Для двойных - зависит от статистики ошибок. Вполне допускаю, что есть такие CRC, которые обнаруживают их все.
Но ничто не дается даром. Эти CRC будут проигрывать простой сумме в обнаружении достаточно типичных ошибок, вызванных помехой -
одиночных многобитных сбоев. Прямая сумма будет обнаруживать все такие сбои длиной меньше или равной длине контрольного слова.
CRC, заточенная на двойные разнесенные ошибки, часть из таких сбоев не заметит.
И больше похоже на правду, что для такого CRC число это не 14 а 3.
Так что, что лучше - зависит от того - а какие именно ошибки нужно обнаруживать.

Цитата(ASN @ Apr 15 2010, 15:48) *
Палыч
Пример на аппаратной логике расчёта обсуждаемой CRC16 для однобитного входного потока:
Требуется 16 триггеров. Не больше чем для простой суммы.


А разве ктот то утверждал, что на плиске алгоритм CRC нереализуем?

Цитата(ASN @ Apr 15 2010, 15:48) *
Расчёт для 8-ми битной ЭВМ табличным способом:
Сложение 8 битного числа с 16 битным Sum+=*Data++ чуть быстрее.
Именно поэтому и не согласен, что посчитать 16 битную сумму намного проще и быстрее, чем правильное 16 битное CRC.
Поскольку особого преимущества нет, IMHO, лучше использовать проверенные алгоритмы.


А расзве кто то утверждал, что табличного алгоритма вычисления CRC не существует?
Он есть, и он в разы медленнее и больше по объему кода, чем вычисление простой суммы.

А то, что одна из причин использования CRC ( если не единственная ) -
Поскольку особого преимущества нет, IMHO, лучше использовать проверенные алгоритмы - с этим тоже вроде никто не спорит.

Речь о другом - в чем преимущества CRC при обнаружении ошибок при блочной передаче.
И стьль ли они подавляющи ( если есть ) чтобы принебрегать вариантом с простой суммой?
Go to the top of the page
 
+Quote Post
ASN
сообщение Apr 15 2010, 17:39
Сообщение #39


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



vallav
Пример на VHDL приведён как подтверждение того факта, что реализация на аппаратной логике вычисления CRC как минимум не уступает по производительности и ресурсам вычислению прямой суммы.
Пример кода на С приведёт как подтверждение того факта, что реализация табличным способом не намного сложнее и медленнее, чем прямая сумма. Для данного конкретного случая он в разы не медленнее.
Поясните почему специалисты, разработавшие STANAG5066, не стали использовать обычное сложение, а применили для контроля целостности пакета CRC16 и CRC32. Поскольку STANAG5066 использует в качестве основы STANAG4285, где применён свёрточный код, ошибки при его декодировании пакетные (длина искажённой последовательности как больше длины проверочного слова, так и меньше).
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 16 2010, 05:20
Сообщение #40


Частый гость
**

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(ASN @ Apr 15 2010, 21:54) *
vallav
Пример на VHDL приведён как подтверждение того факта, что реализация на аппаратной логике вычисления CRC как минимум не уступает по производительности и ресурсам вычислению прямой суммы.
Пример кода на С приведёт как подтверждение того факта, что реализация табличным способом не намного сложнее и медленнее, чем прямая сумма. Для данного конкретного случая он в разы не медленнее.
Поясните почему специалисты, разработавшие STANAG5066, не стали использовать обычное сложение, а применили для контроля целостности пакета CRC16 и CRC32. Поскольку STANAG5066 использует в качестве основы STANAG4285, где применён свёрточный код, ошибки при его декодировании пакетные (длина искажённой последовательности как больше длины проверочного слова, так и меньше).


Вообще то реализация сумматора на логике заметно сложнее реализации CRC.
Речь о ситуации, когда сумматор в системе уже есть. И реализован достаточно эффективно.

То есть, там не важно обнаружение двойных разрозненных ошибок а важно определение еденичных поражений порядка длины поверочного
слова? Тогда не знаю почему.
Может исходя из - поскольку особого преимущества нет, IMHO, лучше использовать проверенные алгоритмы.

Сообщение отредактировал vallav - Apr 16 2010, 05:24
Go to the top of the page
 
+Quote Post
VslavX
сообщение Apr 16 2010, 06:02
Сообщение #41


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(vallav @ Apr 16 2010, 08:35) *
То есть, там не важно обнаружение двойных разрозненных ошибок а важно определение еденичных поражений порядка длины поверочного слова? Тогда не знаю почему.

ИМО, "единичные поражения порядка длины поверочного слова" CRC выловит ничуть не хуже простой суммы. Ну и как бонус выловит _ВСЕ_ единичные ошибки числом менее или равное кодовому расстоянию для данных длин блока и суммы.
Можно сделать простой эксперимент - берем блок, вычисляем сумму и CRC. Потом вносим определенное "поражение длиной в кодовое слово" - и смотрим сколько вариантов "поражения" не поймает сумма и сколько CRC. Если сумма 16-битная, сложение побайтовое и 16-битовое "поражение" выровнять на границе байта, то будет 255 "непойманных" вариантов для простой суммы, для CRC-16, думаю, будут единичные значения (так как CRC это остаток от деления - нужно будет подобрать такое значение искажения чтобы делилось на образующий полином с нулевым остатком, а таких значений для полиномов применяемых для CRC может быть одно-два).
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 16 2010, 07:35
Сообщение #42


Частый гость
**

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(VslavX @ Apr 16 2010, 10:17) *
ИМО, "единичные поражения порядка длины поверочного слова" CRC выловит ничуть не хуже простой суммы. Ну и как бонус выловит _ВСЕ_ единичные ошибки числом менее или равное кодовому расстоянию для данных длин блока и суммы.
Можно сделать простой эксперимент - берем блок, вычисляем сумму и CRC. Потом вносим определенное "поражение длиной в кодовое слово" - и смотрим сколько вариантов "поражения" не поймает сумма и сколько CRC. Если сумма 16-битная, сложение побайтовое и 16-битовое "поражение" выровнять на границе байта, то будет 255 "непойманных" вариантов для простой суммы, для CRC-16, думаю, будут единичные значения (так как CRC это остаток от деления - нужно будет подобрать такое значение искажения чтобы делилось на образующий полином с нулевым остатком, а таких значений для полиномов применяемых для CRC может быть одно-два).


А что не побитовое сложение?
Разница еще разительнее получится.
Вы где то нашли микроконтроллер, в котором затруднительно делать 16 битные сложения?
Полная сумма не пропустит ни одного еденичного многобитового поражения длиной меньше или равного 16 бит.
CRC же, в зависимости от вида перемешивания битов.
Чем лучше заточена на отлов двойных разрозненных ошибок, тем более короткие еденичные многобитные будет пропускать.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Apr 16 2010, 08:17
Сообщение #43


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(vallav @ Apr 16 2010, 10:50) *
А что не побитовое сложение?
...
Вы где то нашли микроконтроллер, в котором затруднительно делать 16 битные сложения?

А Вы где-то четко указали что сложения идут 16-битными словами? Обычно программа упрощена - идет поток байтов и складываются байты - не надо рассматривать случаи с нечетным количеством и т.д. И не уводите ситуацию в сторону - я просто привел Вам пример когда простая сумма оказалась многократно хуже CRC. Разумеется и наоборот, можно натянуть условия, и показать что CRC хуже суммы для каких-то конкретных условий, но все равно - не столь кратно. И тут еще вопрос - насколько типично такое "многобитовое поражение", исследования проводили? Линии передачи ведь разные бывают, и вероятности возникновения различных ошибок тоже разные. Я думаю, CCITT несколько более осведомлен в этом вопросе, раз уж выбрана CRC (как я понимаю - для модемных соединений).
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 16 2010, 09:02
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(VslavX @ Apr 16 2010, 11:32) *
И тут еще вопрос - насколько типично такое "многобитовое поражение", исследования проводили?
Присоединюсь к мнению, что единичное многобитовое поражение - скорее, нетипичная ситуация. А то у Вас прям какая-то интеллектуальная помеха: строго инвертирует последовательность бит в данных... Такая ситуация вероятнее всего, если в потоке данных имеется большая последовательность нулей (или единиц), а помеха привела к декодированию на приёмнике единиц (нулей). Но, это - уже недостатки кодирования данных, а не проверки их целостности.
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 16 2010, 10:25
Сообщение #45


Частый гость
**

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(Палыч @ Apr 16 2010, 13:17) *
Присоединюсь к мнению, что единичное многобитовое поражение - скорее, нетипичная ситуация. А то у Вас прям какая-то интеллектуальная помеха: строго инвертирует последовательность бит в данных... Такая ситуация вероятнее всего, если в потоке данных имеется большая последовательность нулей (или единиц), а помеха привела к декодированию на приёмнике единиц (нулей). Но, это - уже недостатки кодирования данных, а не проверки их целостности.


Я разве говорил, что многобитовая помеха - это когда все 16 бит перевернуты?
Не, не обязательно, часть бит из этих 16 может быть не перевернутой.
На то она и помеха.



Цитата(VslavX @ Apr 16 2010, 12:32) *
А Вы где-то четко указали что сложения идут 16-битными словами? Обычно программа упрощена - идет поток байтов и складываются байты - не надо рассматривать случаи с нечетным количеством и т.д. И не уводите ситуацию в сторону - я просто привел Вам пример когда простая сумма оказалась многократно хуже CRC. Разумеется и наоборот, можно натянуть условия, и показать что CRC хуже суммы для каких-то конкретных условий, но все равно - не столь кратно. И тут еще вопрос - насколько типично такое "многобитовое поражение", исследования проводили? Линии передачи ведь разные бывают, и вероятности возникновения различных ошибок тоже разные. Я думаю, CCITT несколько более осведомлен в этом вопросе, раз уж выбрана CRC (как я понимаю - для модемных соединений).


Дык если не указано, из примерно одинакового рассматривать надо лучшее а не худшее.
Или Вы все же настаиваете, что для микроконтроллеров 16 битное сложение реализуется существенно сложнее 8 битного?
А с нечетным числом байт в блоке фиксированной длины - полагаете, непреодолимо?

И еще раз - я не утверждаю, что CRC хуже прямой суммы, я утверждаю, что прямая сумма не хуже CRC во многих случаях но много
проще в реализации.
По поводу - какие ошибки - как раз сторонники CRC должны привести обоснование, что в данной конкретной ситуации ( где применен
более сложный в реализации метод ) ошибки таковы, что усложнение оправдано.
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 05:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01529 секунд с 7
ELECTRONIX ©2004-2016