You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:24:08