C ++:移位寄存器,SNRZI编码器/解码器

| 编辑:解决了,向Dialecticus致谢,正确的代码在第二个\“ frame \”(?)中。 我必须编写一个程序来对文件中的大比特流进行编码和解码。编码为“加扰不归零反转”,已在串行视频数据传输中使用。首先,我必须在一些短而简单的比特流上尝试算法的功能,例如前导码3FF 000 000(10位字),当以二进制形式写入时代表10个1和20个零。 这是加扰器图: http://i.stack.imgur.com/ef3XP.gif 我就像在图上一样编写了一个测试控制台程序,该程序应该对此前同步码进行编码,然后对答案进行解码以获得起始前同步码比特流。这不起作用,即解码器不返回前同步码。这是它(我希望它是可读的): 像Dysaster这样的代码建议:
#include \"stdafx.h\"
#include<iostream>
#include<vector>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
// Encoder -----------------------------------------------------------------------------------------------------------------------------------
cout<< endl <<\" Encoder \"<< endl;

// create an input vector and initialize it with 3FF 000 000
bool bInput[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
vector< bool > vbInput( bInput, bInput + sizeof( bInput ) / sizeof( bool ) );

// create the shift register
bool bShiftReg[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

// create an output vector 
vector< bool > vbOutput(40);

// iterator for the input
vector<bool>::iterator itInput = vbInput.begin();
cout<<\"\\n Input: \";
for( itInput = vbInput.begin(); itInput < vbInput.end(); itInput++)
    cout << \" \" << *itInput;

cout<<endl<<endl;

// iterator for the output
vector<bool>::iterator itOutput = vbOutput.begin();

for( itInput = vbInput.begin(); itInput < vbInput.end(); itInput++)
{
    // handle first and last values separately
    bShiftReg[ 9 ] = bShiftReg[ 9 ] ^ bShiftReg[ 8 ];
    bShiftReg[ 0 ] = *itInput ^ ( bShiftReg[ 4 ] ^ bShiftReg[ 8 ] );

    bool bTempReg[2];
    bTempReg[0] = bShiftReg[0];
    bTempReg[1] = bShiftReg[9];

    // shift operation
    for( unsigned char ucIndex = 8; ucIndex > 0; ucIndex-- )
    {
        bShiftReg[ ucIndex ] = bShiftReg[ ucIndex - 1 ];
    }

    bShiftReg[0] = bTempReg[0];
    bShiftReg[9] = bTempReg[1];

    // write to output
    //*itOutput = static_cast< int > ( bShiftReg[ 9 ] );
    *itOutput = bShiftReg[ 9 ];

    cout<<\"\\n Schift Reg: \";
    for( int i=0;i<10;i++)
    { cout << \" \" << bShiftReg[i]; }

    cout<<\" Output: \" << *itOutput;

    itOutput++;
}
cout<<\"\\n Output: \";
for( itOutput = vbOutput.begin(); itOutput < vbOutput.end(); itOutput++)
    cout << \" \" << *itOutput;

cout<<endl<<endl;

// Decoder -----------------------------------------------------------------------------------------------------------------------------------

cout<< endl <<\" Decoder \"<< endl;

// load the old ouput to the new input but use only bits 10:40
itOutput = vbOutput.begin() + 10;
for( itInput = vbInput.begin(); itInput < vbInput.end() - 10; itInput++)
{
    *itInput = *itOutput;
    itOutput++;

}

cout<<\"\\n Input: \";
for( itInput = vbInput.begin(); itInput < vbInput.end(); itInput++)
    cout << \" \" << *itInput;

// reset the shift reg
for(int i = 0;i<10;i++) bShiftReg[i] = 1;

// set output iterator to the begin of the vector
itOutput = vbOutput.begin();

for( itInput = vbInput.begin(); itInput < vbInput.end(); itInput++)
{
    // shift operation
    for( unsigned char ucIndex = 9; ucIndex > 1; ucIndex-- )
    {
        bShiftReg[ ucIndex ] = bShiftReg[ ucIndex - 1 ];
    }

    // write to output
    *itOutput = ( ( *itInput ^ bShiftReg[0] ) ^ bShiftReg[5] ) ^ bShiftReg[9];

    // write the first and second values
    bShiftReg[ 1 ] = bShiftReg[ 0 ] ^ *itInput;
    bShiftReg[ 0 ] = *itInput;

    cout<<\"\\n Schift Reg: \";
    for( int i=0;i<10;i++)
    { cout << \" \" << bShiftReg[i]; }

    cout<<\" Output: \" << *itOutput;

    itOutput++;
}
cout<<\"\\n Output: \";
for( itOutput = vbOutput.begin(); itOutput < vbOutput.end(); itOutput++)
    cout << \" \" << *itOutput;

cout<<endl<<endl;


return 0;
}
控制台输出: 编码器 输入:1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 输出:0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 解码器 输入:0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 输出:1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 -------------------终端控制台输出 像Dialecticus这样的代码建议:
#include \"stdafx.h\"

#include<iostream>
#include<vector>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
// Encoder -----------------------------------------------------------------------------------------------------------------------------------
cout<< endl <<\" Encoder \"<< endl;

// create an input vector
bool bInput[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//bool bInput[] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 };
vector< bool > vbInput( bInput, bInput + sizeof( bInput ) / sizeof( bool ) );

// create the shift register
//bool bShiftReg[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
bool bShiftReg[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

// create an output vector 
vector< bool > vbOutput(40);

// iterator for the input
vector<bool>::iterator itInput = vbInput.begin();
cout<<\"\\n Input: \";
for( itInput = vbInput.begin(); itInput < vbInput.end(); itInput++)
    cout << \" \" << *itInput;

cout<<endl<<endl;

// iterator for the output
vector<bool>::iterator itOutput = vbOutput.begin();

for( itInput = vbInput.begin(); itInput < vbInput.end(); itInput++)
{
    // calculate values of every flipflop and the output and save them in a temp array
    bool bTempReg[10];
    bTempReg[0] = *itInput ^ ( bShiftReg[ 4 ] ^ bShiftReg[ 8 ] );
    bTempReg[1] = bShiftReg[0];
    bTempReg[2] = bShiftReg[1];
    bTempReg[3] = bShiftReg[2];
    bTempReg[4] = bShiftReg[3];
    bTempReg[5] = bShiftReg[4];
    bTempReg[6] = bShiftReg[5];
    bTempReg[7] = bShiftReg[6];
    bTempReg[8] = bShiftReg[7];
    bTempReg[9] = bShiftReg[8] ^ bShiftReg[9];
    *itOutput = bShiftReg[ 9 ];

    // assign values of the temp array to the flipflops
    for( unsigned char ucIndex = 0; ucIndex < 10; ucIndex++ )
    {
        bShiftReg[ ucIndex ] = bTempReg[ ucIndex ];
    }

    /*cout<<\"\\n Schift Reg: \";
    for( int i=0;i<10;i++)
    { cout << \" \" << bShiftReg[i]; }

    cout<<\" Output: \" << *itOutput;*/

    itOutput++;
}
cout<<\"\\n Output: \";
for( itOutput = vbOutput.begin(); itOutput < vbOutput.end(); itOutput++)
    cout << \" \" << *itOutput;

cout<<endl<<endl;

// Decoder -----------------------------------------------------------------------------------------------------------------------------------

cout<< endl <<\" Decoder \"<< endl;

// load the old ouput to the new input 
vbInput = vbOutput;

cout<<\"\\n Input: \";
for( itInput = vbInput.begin(); itInput < vbInput.end(); itInput++)
    cout << \" \" << *itInput;

// reset the shift reg
for(int i = 0;i<10;i++) bShiftReg[i] = 1;

// set output iterator to the begin of the vector
itOutput = vbOutput.begin();

for( itInput = vbInput.begin(); itInput < vbInput.end(); itInput++)
{
    // calculate values of every flipflop and the output and save them in a temp array
    bool bTempReg[10];
    bTempReg[0] = *itInput;
    bTempReg[1] = bShiftReg[ 0 ] ^ *itInput;
    bTempReg[2] = bShiftReg[1];
    bTempReg[3] = bShiftReg[2];
    bTempReg[4] = bShiftReg[3];
    bTempReg[5] = bShiftReg[4];
    bTempReg[6] = bShiftReg[5];
    bTempReg[7] = bShiftReg[6];
    bTempReg[8] = bShiftReg[7];
    bTempReg[9] = bShiftReg[8];
    *itOutput = ( ( *itInput ^ bShiftReg[0] ) ^ bShiftReg[5] ) ^ bShiftReg[9];

    // assign values of the temp array to the flipflops
    for( unsigned char ucIndex = 0; ucIndex < 10; ucIndex++ )
    {
        bShiftReg[ ucIndex ] = bTempReg[ ucIndex ];
    }

    /*cout<<\"\\n Schift Reg: \";
    for( int i=0;i<10;i++)
    { cout << \" \" << bShiftReg[i]; }
    cout<<\" Output: \" << *itOutput;*/

    itOutput++;
}
cout<<\"\\n Output: \";
for( itOutput = vbOutput.begin(); itOutput < vbOutput.end(); itOutput++)
    cout << \" \" << *itOutput;

cout<<endl<<endl;


return 0;
}
控制台输出: 编码器 输入:1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 输出:1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 解码器 输入:1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1  输出:0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 我不确定转移和写入输出的顺序,但是无论哪种方式都行不通。我真的很感谢您的帮助,谢谢! 编辑:新版本的代码和控制台输出。现在解扰器的输出看起来像加扰器的输入,但是它被旋转了,有8个而不是10个。如果我把输出向量加长,例如到40位     
已邀请:
        好的,我发现了一个可能的错误。解码时,您在移位所有寄存器之后计算输出,而编码时,您在移位之前计算输出。哪一个?不,我看错了,第二次尝试: 编辑:想象一下,输出只是另一个寄存器。我认为您需要计算输出值,作为每个循环中的第一个操作。之后,计算所有寄存器的值。之后,将这些值分配给寄存器。计算所有值之前,请勿分配值。 最重要的是:首先计算所有值,然后才分配所有值。通常情况下,这意味着使用临时变量。只有在没有循环的情况下,您才能摆脱使用临时的状态。 解决方案:引入另一组寄存器(bTempReg),具有11行代码,您可以在其中为每个bTempReg [0..9]分配值并输出,然后在mini-loop [0..9]中分配值。 bTempReg回到bShiftReg。     
        我尚未阅读代码的解码部分,但是在编码中,存在一个大问题:执行移位后,您需要计算位0和9,这是不正确的。您需要先计算它们,然后再移位主寄存器,将它们保存在临时变量中(实际上是安全的,写#9,但不写#0),移位LFSR,然后将计算出的位放回去。 您现在正在做的是有效地使用第3位和第7位作为抽头点,并将第9位计算为
bit#7 XOR bit#9
,而不是指定的算法。 我希望在解码端出现类似的错误,但是没有检查。     

要回复问题请先登录注册