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 0
    

    ich 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;
    }
    

Anmelden zum Antworten