Matlab加扰器与解扰器转C代码后解扰输出异常问题咨询
问题描述
我正尝试将Matlab的加扰器(scrambler)和解扰器(descrambler)转换为C代码,目前已完成的加扰器代码如下:
#include <stdint.h> #include <stdio.h> /* Binary scramble input: array of size *size* to be processed output: array to store the result, must be as big as input poly: polynom to use: array of *order* size state: internal state: array of *order* size order: order of polynom */ void scramble (uint8_t *input, uint8_t *output,size_t size, uint8_t *poly, uint8_t *state, size_t order) { /* ignore the order 0 */ poly++; state++; order--; /* for each input bits */ for(int i = 0; i < size; i++) { /* compute the value to be xored to input */ uint8_t xor = 0; for(int n = 0; n < order; n++) { if(poly[n]) { xor ^= state[n]; } } /* shift the state */ for (int k = order-1; k > 0; k--) { state[k] = state[k-1]; } /* compute the ouput */ output[i] = state[0] = xor ^ input[i] ; } } int main(void) { uint8_t bin[10] = { 1, 0, 0, 1, 0, 0, 0, 1, 1, 0}; uint8_t out[10]; uint8_t poly[5] = {1, 1, 1, 0, 1}; uint8_t state[5] = {0}; scramble(bin, out, 10, poly, state, 5); for (int i = 0; i < 10; ++i) { printf("%d -> %d\n", bin[i], out[i]); } return 0; }
我尝试编写解扰部分,原本认为只要在输出赋值时对xor位取反,改为output[i] = state[0] = !xor ^ input[i],同时调用解扰函数前将state重置为全0即可正常工作,但实际运行后解扰输出和加扰器原始输入不一致,请问还需要修改其他部分吗?
解决方案
你的修改思路存在两处错误:
- 加扰的计算逻辑是
加扰输出 = 原始输入 ^ xor值,逆运算应为原始输入 = 加扰输出 ^ xor值,不需要对xor取反,取反操作会引入额外错误 - 加扰逻辑里state[0]存储的是加扰后的输出值,而解扰逻辑中state需要记录的是接收到的加扰输入值,不是解扰后的输出值,否则状态移位后计算的xor值会和加扰端不一致
正确的解扰函数实现如下:
void descramble (uint8_t *input, uint8_t *output,size_t size, uint8_t *poly, uint8_t *state, size_t order) { /* 和加扰端保持相同的 poly、state、order 处理逻辑 */ poly++; state++; order--; for(int i = 0; i < size; i++) { uint8_t xor = 0; for(int n = 0; n < order; n++) { if(poly[n]) { xor ^= state[n]; } } /* 移位逻辑和加扰端一致 */ for (int k = order-1; k > 0; k--) { state[k] = state[k-1]; } /* 解扰输出是输入 ^ xor,state[0]存接收到的加扰输入 */ output[i] = xor ^ input[i]; state[0] = input[i]; } }
可通过以下测试逻辑验证正确性:
int main(void) { uint8_t bin[10] = { 1, 0, 0, 1, 0, 0, 0, 1, 1, 0}; uint8_t scrambled[10], descrambled[10]; uint8_t poly[5] = {1, 1, 1, 0, 1}; uint8_t state_scramble[5] = {0}, state_descramble[5] = {0}; // 加扰 scramble(bin, scrambled, 10, poly, state_scramble, 5); // 解扰,注意重置state为和加扰端相同的初始全0状态 descramble(scrambled, descrambled, 10, poly, state_descramble, 5); printf("原始输入 -> 加扰结果 -> 解扰结果\n"); for (int i = 0; i < 10; ++i) { printf("%d -> %d -> %d\n", bin[i], scrambled[i], descrambled[i]); } return 0; }
运行后解扰输出会和原始输入完全一致。
内容的提问来源于stack exchange,提问作者beenvan
相关产品推荐
相关产品推荐

