//#include "StdAfx.h" #include "Serial.h" #include "math.h" //CRITICAL_SECTION cs; //FILE* pFile; //char filename[200]; CSerial::CSerial(void) { /*InitializeCriticalSection(&cs); EnterCriticalSection(&cs); unsigned short num = GetTickCount(); sprintf(filename, "STable_%i.txt", num); LeaveCriticalSection(&cs);*/ for (int i=0; i<50; i++) CreateChi2Test(); ResetAll(); P_Chi2 = 0.5; cumulativeSerialChi2 = 127.3339; } CSerial::~CSerial(void) { delete MetaChi2; } // Inserts a 32 bit word into the serial test void CSerial::InsertWord32(uint32_t InWord32) { wordStream >>= 32; wordStream |= (uint64_t)InWord32 << 32; // Shift through each bit to create a sub-word while ( bitPointer >= 1 ) { // Take an overlapping 8 and 7 bit word from stream uint32_t Bit8Word = ((uint32_t)(wordStream>>bitPointer)) & 0x000000ff; uint32_t Bit7Word = Bit8Word>>1; // Stuff these words into independent bins for this test block Bin8[Bit8Word]++; Bin7[Bit7Word]++; // Every 8192 words binned do a block and cumulative calc if ( (++blockWordCount)>=(16*262144) ) { // Calc chi^2 value for this block double BlockSerialChi2 = BlockSumBinsSquared8() - BlockSumBinsSquared7(); MetaChi2->Insert(BlockSerialChi2); // Insert into meta chi^2 test P_Chi2 = MetaChi2->GetPvalue(); // Calc cumulative chi^2 test totalBlockCount++; cumulativeSerialChi2 = QuickCompare8() - QuickCompare7(); ResetTest(); } bitPointer --; } bitPointer = 32; } // Resets cumulative testing void CSerial::ResetAll(void) { wordStream = 0; bitPointer = 24; cumulativeSerialChi2 = 127.3339; P_Chi2 = 0.5; totalBlockCount = 0; // ZeroMemory(CumulativeBin8, 256*sizeof(double)); memset(CumulativeBin8, 0, 256*sizeof(double)); // ZeroMemory(CumulativeBin7, 128*sizeof(double)); memset(CumulativeBin7, 0, 128*sizeof(double)); MetaChi2->Reset(); ResetTest(); } // Resets current block test void CSerial::ResetTest(void) { // ZeroMemory(Bin8, 256*sizeof(double)); memset(Bin8, 0, 256*sizeof(double)); // ZeroMemory(Bin7, 128*sizeof(double)); memset(Bin7, 0, 128*sizeof(double)); blockWordCount = 0; } // Returns sum of the bis squared for the block of 8bit words double CSerial::BlockSumBinsSquared8(void) { double Sum = 0; double val; for (int i=0; i<256; i++) { val = Bin8[i] - ((blockWordCount/256.)); Sum += val*val; } Sum /= ((blockWordCount/256.)); return Sum; } // Returns sum of the bis squared for the block of 7bit words double CSerial::BlockSumBinsSquared7(void) { double Sum = 0; double val; for (int i=0; i<128; i++) { val = Bin7[i] - ((blockWordCount/128.)); Sum += val*val; } Sum /= ((blockWordCount/128.)); return Sum; } // Adds new block to cumulative Squared 8bit words double CSerial::CumulativeBins8(void) { double MSBS8 = 0.; for (int i=0; i<256; i++) { CumulativeBin8[i] += Bin8[i]; MSBS8 += CumulativeBin8[i]*CumulativeBin8[i]; } return MSBS8; } // Adds new block to cumulative Squared 7bit words double CSerial::CumulativeBins7(void) { double MSBS7 = 0.; for (int i=0; i<128; i++) { CumulativeBin7[i] += Bin7[i]; MSBS7 += CumulativeBin7[i]*CumulativeBin7[i]; } return MSBS7; } double CSerial::QuickCompare8(void) { double Sum = 0; double val; for (int i=0; i<256; i++) { CumulativeBin8[i] += Bin8[i]; val = (CumulativeBin8[i] / (totalBlockCount * (blockWordCount/256.))) - 2.; Sum += val * CumulativeBin8[i]; } Sum += (blockWordCount*totalBlockCount); Sum = 0; for (int i=0; i<256; i++) { val = CumulativeBin8[i] - ((blockWordCount/256.)*totalBlockCount); Sum += val*val; } Sum /= ((blockWordCount/256.)*totalBlockCount); return Sum; } double CSerial::QuickCompare7(void) { double Sum = 0; double val; for (int i=0; i<128; i++) { CumulativeBin7[i] += Bin7[i]; val = (CumulativeBin7[i] / (totalBlockCount * (blockWordCount/128.))) - 2.; Sum += val * CumulativeBin7[i]; } Sum += (blockWordCount*totalBlockCount); Sum = 0; for (int i=0; i<128; i++) { val = CumulativeBin7[i] - ((blockWordCount/128.)*totalBlockCount); Sum += val*val; } Sum /= ((blockWordCount/128.)*totalBlockCount); return Sum; } double CSerial::QuickCompare88(void) { double Sum = 0; double val; for (int i=0; i<256; i++) { val = (CumulativeBin8[i] / (totalBlockCount * (blockWordCount/256.))) - 2.; Sum += val * CumulativeBin8[i]; } Sum += (blockWordCount*totalBlockCount); return Sum; } double CSerial::QuickCompare77(void) { double Sum = 0; double val; for (int i=0; i<128; i++) { val = (CumulativeBin7[i] / (totalBlockCount * (blockWordCount/128.))) - 2.; Sum += val * CumulativeBin7[i]; } Sum += (blockWordCount*totalBlockCount); return Sum; } void CSerial::CreateChi2Test(void) { double pTable[] = {0.019993076,0.019996996,0.020004305,0.020003831,0.019996602,0.020006223,0.020008612,0.019993278,0.020002222,0.020011793,0.019995081,0.020002287,0.019998775,0.020004405,0.019999817,0.020010438,0.019994155,0.020003369,0.020008374,0.019995879,0.020008228,0.019993876,0.020004749,0.020003208,0.019893452,0.020001708,0.020002342,0.020000863,0.020008678,0.020005665,0.020001275,0.02000936,0.020000663,0.019986486,0.020003196,0.020004123,0.020002657,0.020016139,0.019989378,0.020004423,0.019999113,0.019998812,0.020002742,0.020004996,0.020003909,0.019997932,0.020000403,0.020004695,0.019999863,0.020017545}; double boundryTable[] = { 162.960449218750, 157.338134765625, 153.770507812500, 151.080566406250, 148.885253906250, 147.007324218750, 145.352050781250, 143.862548828125, 142.498779296875, 141.234375000000, 140.051757812500, 138.935058593750, 137.873779296875, 136.858642578125, 135.883056640625, 134.940429687500, 134.027099609375, 133.137695312500, 132.268798828125, 131.417968750000, 130.581298828125, 129.757324218750, 128.942626953125, 128.135498046875, 127.337646484375, 126.538574218750, 125.740966796875, 124.942871093750, 124.141845703125, 123.336181640625, 122.523681640625, 121.701416015625, 120.867431640625, 120.019042968750, 119.151611328125, 118.261962890625, 117.345703125000, 116.396728515625, 115.410400390625, 114.376464843750, 113.285400390625, 112.123046875000, 110.870117187500, 109.499511718750, 107.970458984375, 106.216796875000, 104.117187500000, 101.411621093750, 97.322021484375, 0.0 }; MetaChi2 = new Chi2(50, pTable, false, boundryTable, true); }