0

編集: 解決しました。Dialecticus に感謝します。正しいコードは 2 番目の「フレーム」(?) にあります。

ファイルとの間で大きなビット ストリームをエンコードおよびデコードするプログラムを作成する必要があります。符号化は、シリアル ビデオ データ伝送で使用されている Scrambled Non Return to Zero Invert です。最初に、いくつかの短く単純なビット ストリームでアルゴリズムの機能を試す必要がありました。たとえば、プリアンブル 3FF 000 000 (10 ビット ワード) は、2 進数で記述した場合に 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 1 0 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 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 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 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 1 1 1 1 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 1 0 0 0 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 1 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0

シフトして出力に書き込む順序についてはわかりませんが、どちらの方法でも機能しません。私は本当にあなたの助けに感謝します、ありがとう!

編集: 新しいバージョンのコードとコンソール出力。現在、デスクランブラーの出力はスクランブラーの入力と似ていますが、回転しており、10 個ではなく 8 個あります。たとえば 40 ビットなど、出力ベクトルを長くしても問題ありません。

4

2 に答える 2

1

コードのデコード部分を読んでいませんが、エンコードには大きな問題があります。シフトを実行した後にビット0と9を計算するのですが、これは正しくありません。メインレジスタをシフトする前にそれらを計算し、一時変数に保存し(実際には、#9を書き込むのは安全ですが、#0は安全ではありません)、LFSRをシフトし、計算されたビットを元に戻す必要があります。

現在行っているのは、ビット3と7をタップポイントとして効果的に使用しbit#7 XOR bit#9、指定されたアルゴリズムの代わりにビット#9を計算することです。

デコード側でも同様のエラーが発生することが予想されますが、チェックしませんでした。

于 2011-06-19T12:18:48.870 に答える
0

さて、私は1つの可能なバグを見つけました。デコード中はすべてのレジスタをシフトした後に出力を計算しますが、エンコード中はシフト前に出力を計算します。どちらですか?いいえ、間違っています。2回目の試行:

編集:出力が単なる別のレジスタであると想像してください。各ループ内の最初の操作として、出力の値を計算する必要があると思います。その後、すべてのレジスタの値を計算します。その後、それらの値をレジスタに割り当てます。すべてを計算する前に値を割り当てないでください。

結論:最初にすべての値を計算し、次にすべての値を割り当てます。一般的に、これは一時変数の使用を意味します。ループがない場合にのみ、一時的な使用を回避できます。

解決策:別のレジスタセット(bTempReg)を導入し、各bTempReg [0..9]と出力に値を割り当て、ミニループ[0..9]で次の値を割り当てる11行のコードを用意します。 bTempRegをbShiftRegに戻します。

于 2011-06-18T19:32:39.820 に答える