C++ : Shift register, SNRZI 编码器/解码器

标签 c++ shift

编辑:解决了,感谢辩证法,正确的代码在第二个“框架”(?)中。

我必须编写一个程序来对文件中的大比特流进行编码和解码。编码为Scrambled Non Return to Zero Invert,用于串行视频数据传输。首先,我必须在一些简短的比特流上尝试我的算法的功能,例如前导码 3FF 000 000(10 位字),当写入二进制时表示 10 个 1 和 20 个 0。

这是加扰器图: 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

输出:0 1 0 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 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 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 1 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 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 1 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 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 输出:0 1 1 1 1 0 1 1 1 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

我不确定移动和写入输出的顺序,但无论哪种方式都行不通。非常感谢您的帮助,谢谢!

编辑:新版本的代码和控制台输出。现在解扰器的输出看起来与扰码器的输入相似,但它是旋转的,有 8 个而不是 10 个。如果我使输出 vector 更长,例如到 40 位。

最佳答案

我没有读过代码的解码部分,但在编码中,有一个大问题:执行移位后计算位 0 和 9,这是不正确的。您需要在移动主寄存器之前计算它们,将它们保存在临时变量中(实际上写#9 是安全的,但不是#0),移动 LFSR,将计算出的位放回原处。

您现在正在做的是有效地使用第 3 位和第 7 位作为抽头点,并将第 9 位计算为 bit#7 XOR bit#9 而不是指定的算法。

我预计解码端会出现类似的错误,但没有检查。

关于C++ : Shift register, SNRZI 编码器/解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397516/

相关文章:

c++ - opencv cvtColor 断言失败 C++

C++如何从函数返回和收集地址

c++ - 随机内存访问很昂贵?

c++ - 如何在 C++ 中初始化静态 const 成员?

c++ - 为什么括号在这个简单的代码中有所不同

perl - 在 perl 中,使用默认参数调用多个子例程是不好的做法吗?

html - Box2dweb,移动 Canvas ?

java - 移动数组中的元素

c++ - 执行按位与 int 和移位

javascript - 为什么 shift() 对一个数组起作用,但对另一个数组不起作用,除非一般应用于另一个数组