Brauche Hilfe beim SNRI-Coder mithilfe von LFSR
-
Hallo an alle.
ich möchte solch einen Scrambler/Descrambler realisieren: http://i.stack.imgur.com/ef3XP.gif (kann man hier Bilder posten?)
Es handelt sich um Scrambled Non Return to Zero Invert, welches beim Übertragen von Video verwendet wird. Aus Testzwecken habe ich ein Programm geschrieben, das diese Struktur nachbaut, Encoder und Decoder. Der Decoder sollte die Folge zurückliefern, die ich beim Encoder eingepeist habe, jedoch klappt es nicht.
Ich speise eine typische Präambel ein 3FF 000 000 (10 Bit Worte), es sind 10 Einsen und 20 Nullen in binär.
Man hat mich in einem anderem Forum schon hingewiesen, dass der LFSR eine gewisse Anzahl von Takten zur Initialisierung braucht, deshalb habe ich auch aus Testzwecken die Eingangsfolge des Scramblers um 10 Nullen erweitert und in den Descrambler speise ich nur die letzten 30 Bits ausm Scrambler plus 10 Nullen ein.
Das Ziel ist, dass der Descrambler die Eingangsfolge des Scramblers wieder berechnet.hier ist der Code, hoffe es ist lesbar:
#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 }; //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 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++) { // 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; }Konsole liefert:
Encoder Input: 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 Output: 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 1 0 0 1 0 1 0 1 1 1 1 0 0 Decoder Input: 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 Output: 0 1 1 1 1 0 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 1 1 0 0 0 0 1 0 0ich hoffe es ist verständlich und bitte um Hilfe. Habe viel gesehen und gelesen in Google und Foren aber leider nicht passendes und/oder verständliches. Ich weiss nicht, in welcher Reihenfolge man bei einem LFSR die einzelnen Flipflops berechnen soll. Ich bedanke mich schon Mal.
Mfg
Max Krug
-
gelöst, dank einem kollegen auf stackoverflow.com

#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, 1, 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; }