我必须编写一个程序,它将对文件中的大比特流进行编码和解码。编码是Scrambled Non Return to Zero Invert,它用于串行视频数据传输。首先,我必须在一些简短的比特流上尝试我的算法的功能,例如一个前导码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 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 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 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 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 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 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0
我不确定移位和写入输出的顺序,但它无论如何都不起作用。我非常感谢你的帮助,谢谢!
编辑:新版本的代码和控制台输出。现在,解扰器的输出看起来类似于扰码器的输入,但是它被旋转,有8个而不是10个。如果我使输出矢量更长,则无关紧要,例如到40位。
答案 0 :(得分:1)
我还没有读过代码的解码部分,但是在编码中,存在一个很大的问题:在执行移位后计算位0和9 ,这是不正确的。您需要在移动主寄存器之前计算它们,将它们保存在临时变量中(实际上写#9是安全的,但不是#0),移位LFSR,将计算后的位重新放入。
您现在正在做的是将第3位和第7位有效地用作分接点,并将第9位计算为bit#7 XOR bit#9
而不是指定的算法。
我希望在解码方面有类似的错误,但没有检查。
答案 1 :(得分:0)
好的,我发现了一个可能的错误。解码后,您在移位所有寄存器后计算输出,但在编码时计算移位前的输出。它是哪一个?不,我弄错了,第二次尝试:
编辑:想象一下输出只是另一个寄存器。我认为你需要计算输出值作为每个循环中的第一个操作。之后,计算所有寄存器的值。之后,将这些值分配给寄存器。在计算所有值之前不要指定值。
底线:首先计算所有值,然后才分配所有值。一般情况下意味着使用临时变量。只有在没有循环的情况下,才能远离使用temp。
解决方案:引入另一组寄存器(bTempReg),有11行代码,你可以为每个bTempReg [0..9]分配一个值并输出,然后在mini-loop [0..9]中将bTempReg的值赋给bShiftReg。