Перемножение битовых матриц. В чём ошибка? Есть сообщение, закодированное линейным кодом (16,7). В коде могут содержаться ошибки, и для их определения мне нужно найти синдром. Делается это следующим образом: S = Ri x Ht, где:
- Ri - вектор принятого сообщения, длиной 16 бит.
- Ht - транспонированная проверочная матрица линейного кода размером 16x9.
Если в принятом слове нет ошибок, синдром должен быть равен 0. Проведя рассчёты в SageMath, я убедился в том, что всё работает отлично. При нулевом векторе ошибки синдром равен 0, при двух ошибках синдром позволяет их исправить.
Проблемы начинаются, когда я пытаюсь воплотить алгоритм в коде на Си:static const uint16_t qr_16_7_check_matrix_T[16] = {
0x4F, // [0 0 1 0 0 1 1 1 1]
0x11E, // [1 0 0 0 1 1 1 1 0]
0x1B7, // [1 1 0 1 1 0 1 1 1]
0x1E2, // [1 1 1 1 0 0 0 1 0]
0x1C9, // [1 1 1 0 0 1 0 0 1]
0xE5, // [0 1 1 1 0 0 1 0 1]
0x73, // [0 0 1 1 1 0 0 1 1]
0x100, // [1 0 0 0 0 0 0 0 0]
0x80, // [0 1 0 0 0 0 0 0 0]
0x40, // [0 0 1 0 0 0 0 0 0]
0x20, // [0 0 0 1 0 0 0 0 0]
0x10, // [0 0 0 0 1 0 0 0 0]
0x8, // [0 0 0 0 0 1 0 0 0]
0x4, // [0 0 0 0 0 0 1 0 0]
0x2, // [0 0 0 0 0 0 0 1 0]
0x1, // [0 0 0 0 0 0 0 0 1]
};
uint16_t qr_16_7_get_syndrome(uint16_t received_data) {
uint16_t syndrome = 0x0;
bool syndrome_bit = false;
bool data_bit = false;
bool matrix_bit = false;
for (uint8_t cols = 0; cols < 9; cols++) {
for (uint8_t rows = 0; rows > rows) & 0x01;
matrix_bit = (qr_16_7_check_matrix_T[rows] >> cols) & 0x01;
syndrome_bit ^= data_bit & matrix_bit;
}
if (syndrome_bit) {
syndrome |= (1 << cols);
} else {
syndrome &= ~(1 <

21 Авг 2019 в 06:08
241 +1
0
Ответы
1

Проблема скорее всего заключается в неправильной реализации перемножения битовых матриц в вашей функции qr_16_7_get_syndrome(). Вам следует внимательно проверить работу вашего алгоритма перемножения битов в цикле, чтобы убедиться, что вы правильно вычисляете значение синдрома.

Также стоит обратить внимание на то, что в вышеуказанном коде вы используете оператор ^ для выполнения побитовой операции XOR, который не всегда является правильным выбором для умножения битов. Вместо этого, вам нужно использовать оператор & для проверки наличия соответствующего бита в обоих данных.

После тщательной проверки и исправления ошибок в алгоритме перемножения битов в вашей функции, вы должны получить правильные значения синдрома для всех слов из словаря.

20 Апр 2024 в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир