zombieType::zombieType() { startRandom(); init(); state = W_UP; anim_frame=0; frameDelay=0; health = 1; }
int main(int argc,char* argv[]){ startRandom(); // control SNR step const double s_snr = -0.5; const double step = 0.02; const int snr_size = 500; // control the certain Frame and the bp int frame = 2; int t_lvl = 0; double _snr = 0; if(argc >= 3 ) _snr = strtod(argv[2],NULL); if(argc >= 4) frame = strtod(argv[3],NULL); if(argc >= 5) t_lvl = strtod(argv[4],NULL); // for video encode const int puncture = 0; // puncture or not const double rate = 1/(double)(2-puncture); // code rate const double a = 1; // Fading amplitude. a=1 -> AWGN channel double EbN0,L_c,sigma; // for basical info char buffer[50]; const int h = __HEIGHT, w = __WIDTH, f = frame+1 ; const int lm = h*w; const int lu = lm+(G_L-1); int ** G = getGenerator(); double * Ly = (double*) malloc(sizeof(double)*2*lu); int*** Y = new3d<int>(f,h,w); int* map_out = (int*) malloc(sizeof(int)*lm); double* Lu = (double*) malloc(sizeof(double)*lu); for(int i=0; i<lu ;++i) Lu[i] = 0; // pstate, pout const int Ns = pow(2,G_L-1); int ** pout = new2d<int>(Ns,4); int ** pstate = new2d<int>(Ns,2) ; double* Le1 = (double*)malloc(sizeof(double)*lu); double* Le2 = (double*)malloc(sizeof(double)*lu); trellis(G,G_N,G_L,Ns,pout,pstate); // frame buffer int*** imgr_bp = new3d<int>(PXL,h,w); double** Lu_c = new2d<double>(PXL,lu); //channel decoder output // buffer for Ia, Ie double* Le = (double*) malloc(sizeof(double)*lm); double* Ia_pc = (double*) malloc(sizeof(double)*snr_size); double* Ie_pc = (double*) malloc(sizeof(double)*snr_size); int idx = 0; double tmp_sum = 0, tmp ; // read YUV sprintf(buffer,"%s_cif.yuv",argv[1]); yuv_read(buffer,h,w,f,Y,NULL,NULL); // video_encode(Y,f,h,w,_snr,G,Ly,map_out) for frame and t_lvl EbN0 = pow(10,_snr/10); // convert Eb/N0[dB] to normal number L_c = 4*a*EbN0*rate; // reliability value of the channel sigma = 1/sqrt(2*rate*EbN0); // standard deviation of AWGN noise int* x = (int*) malloc(sizeof(int)*2*lu); img2bp_frame(Y[frame],h,w,imgr_bp); random_sequence(0,lm-1,map_out); rsc_encode(G,G_L,imgr_bp[t_lvl],map_out,w,lm,1,x); for(int i = 0 ; i < 2*lu ; ++i) Ly[i] = 0.5*L_c*((2*x[i] - 1)+ sigma*gaussian_noise()); printf("processing ...%2.2f%%\n",0); for(double snr = s_snr; idx < snr_size ; snr+=step, idx++ , tmp_sum=0){ printf("\tprocessing ...%2.2f%%\n",100*(snr-s_snr)/step/snr_size); // encode EbN0 = pow(10,snr/10); // convert Eb/N0[dB] to normal number L_c = 4*a*EbN0*rate; // reliability value of the channel sigma = 1/sqrt(2*rate*EbN0); // standard deviation of AWGN noise // img2bp_frame(Y[frame],h,w,imgr_bp); for(int i = 0 ; i < lm ; ++i){ tmp = (2*imgr_bp[t_lvl][map_out[i]/w][map_out[i]%w] - 1); Lu[i] = 0.5*L_c*( tmp + sigma*gaussian_noise()); tmp_sum+=log2(1 + exp(-Lu[i]*tmp)); } Ia_pc[idx] = 1 - tmp_sum/lm; // decode computeLe(Lu,Le1,Le2,lu); logmap(Ns, lu, 1, Ly, Le1, Le2, pstate, pout, Lu_c[t_lvl]); for(int i = 0 ; i < lm ; ++i) Le[map_out[i]] = Lu_c[t_lvl][i] - Lu[i]; tmp_sum = 0; for(int i=0; i < lm ; ++i) tmp_sum+=log2(1 + exp(-Le[i]*(2*imgr_bp[t_lvl][i/w][i%w]-1))); Ie_pc[idx] = 1 - tmp_sum/lm; } printf("\r100%% completed!\n"); FILE *file = fopen("output/exit_curve_pc.txt","a+"); fprintf(file,"============================\n%s:SNR=%lf, frame#%d,bp#%d\nIa=\n",argv[1],_snr,frame+1,t_lvl+1); for(int i = 0 ; i < snr_size ; ++i) fprintf(file,"%lf,",Ia_pc[i]); fprintf(file,"\nIe=\n"); for(int i = 0 ; i < snr_size ; ++i) fprintf(file,"%lf,",Ie_pc[i]); fprintf(file,"\n\n"); fclose(file); write_pc_for_matlab(Ia_pc,Ie_pc,snr_size); // free memory free(Ly); free(map_out); delete2d<int>(G); deleteY(Y); delete3d<int>(imgr_bp); delete2d<double>(Lu_c); delete2d<int>(pstate); delete2d<int>(pout); free(Le); free(Lu); free(Le1); free(Le2); free(Ia_pc); free(Ie_pc); free(x); }
int main(int argc,char* argv[]){ startRandom(); // control SNR step const double s_snr = -1; const double step = 0.05; const int snr_size = 500; // control the certain Frame and the bp int frame = 2; if(argc >= 4) frame = strtod(argv[3],NULL); // for video encode const int puncture = 0; // puncture or not const double rate = 1/(double)(2-puncture); // code rate const double a = 1; // Fading amplitude. a=1 -> AWGN channel double EbN0,L_c,sigma; // for basical info char buffer[50]; const int h = __HEIGHT, w = __WIDTH, f = frame+2 ; const int lm = h*w; const int lu = lm+(G_L-1); int*** Y = new3d<int>(f,h,w); int** MV_prev = new2d<int>(2,lm/64,0); int** MV = new2d<int>(2,lm/64,0); double** Lu = new2d<double>(PXL,lu,0); double** Lu_prev = new2d<double>(PXL,lu,0); double** Lu_next = new2d<double>(PXL,lu,0); // frame buffer int*** imgr_bp = new3d<int>(PXL,h,w); int*** imgr_bp_prev = new3d<int>(PXL,h,w); int*** imgr_bp_next = new3d<int>(PXL,h,w); int*** img = new3d<int>(PXL,h,w); int*** img_prev = new3d<int>(PXL,h,w); int*** img_next = new3d<int>(PXL,h,w); int** imgr = new2d<int>(h,w); int** imgr_prev = new2d<int>(h,w); int** imgr_next = new2d<int>(h,w); double** Lu_c = new2d<double>(PXL,lu); //channel decoder output // buffer for Ia, Ie double** Le = new2d<double>(PXL,lm); // source extrinsic informatiom double** Le_s_inter = new2d<double>(PXL,lm,0); // source extrinsic information double** Le_s_inter_next = new2d<double>(PXL,lm,0); // source extrinsic information double** Le_s_intra = new2d<double>(PXL,lm,0); // source extrinsic information double** Ia = new2d<double>(PXL,snr_size); double** Ie = new2d<double>(PXL,snr_size); int idx = 0; double tmp_sum = 0, tmp ; double* beta_t = (double*) malloc(sizeof(double)*PXL); double* beta_s = (double*) malloc(sizeof(double)*PXL); double* beta_t_prev = (double*) malloc(sizeof(double)*PXL); // read YUV sprintf(buffer,"%s_cif.yuv",argv[1]); yuv_read(buffer,h,w,f,Y,NULL,NULL); img2bp_frame(Y[frame],h,w,imgr_bp); img2bp_frame(Y[frame-1],h,w,imgr_bp_prev); img2bp_frame(Y[frame+1],h,w,imgr_bp_next); printf("processing ... %2.2f%%",0); for(double snr = s_snr; idx < snr_size ; snr+=step, idx++ ){ printf("\rprocessing ... %2.2f%%",100*(snr-s_snr)/step/snr_size); // encode EbN0 = pow(10,snr/10); // convert Eb/N0[dB] to normal number L_c = 4*a*EbN0*rate; // reliability value of the channel sigma = 1/sqrt(2*rate*EbN0); // standard deviation of AWGN noise for(int t_lvl = 0 ; t_lvl <PXL ; ++t_lvl){ tmp_sum = 0; for(int i = 0 ; i < lm ; ++i){ tmp = (2*imgr_bp[t_lvl][i/w][i%w] - 1); Lu[t_lvl][i] = 0.5*L_c*( tmp + sigma*gaussian_noise()); tmp_sum+=log2(1 + exp(-Lu[t_lvl][i]*tmp)); tmp = (2*imgr_bp_prev[t_lvl][i/w][i%w] - 1); Lu_prev[t_lvl][i] = 0.5*L_c*( tmp + sigma*gaussian_noise()); } Ia[t_lvl][idx] = 1 - tmp_sum/lm; } // decode for(int i = 0, j=0, t_lvl=0; i <h ; ++i) for(j = 0 ; j < w ; ++j) for(t_lvl=0 ; t_lvl < PXL ; ++t_lvl){ img[t_lvl][i][j] = ((Lu[t_lvl][j+i*w]>=0)?1:0); img_prev[t_lvl][i][j] = ((Lu_prev[t_lvl][j+i*w]>=0)?1:0); } bin2dec_img(img,h,w,imgr); bin2dec_img(img_prev,h,w,imgr_prev); motionEstES(imgr,imgr_prev,h,w,8,5,MV_prev); intra_inter_beta_estimation(img,img_prev,MV_prev,beta_s,beta_t,h,w,8); motionComp(Lu_prev,MV_prev,h,w,8,Lu_c); mrf_siso_inter(Lu,Lu_c,beta_t,h,w,Le_s_inter,0); mrf_siso_intra(Lu,beta_s,h,w,Le_s_intra,0); for(int i = 0, t_lvl = 0 ; i < lm ; ++i) for(t_lvl = 0 ; t_lvl < PXL ; ++t_lvl) Le[t_lvl][i] = (Le_s_inter[t_lvl][i] + Le_s_intra[t_lvl][i]); // Le_s_prev in the next frame // prepare for next frame decode // encode for(int t_lvl = 0 ; t_lvl <PXL ; ++t_lvl){ for(int i = 0 ; i < lm ; ++i){ tmp = (2*imgr_bp_next[t_lvl][i/w][i%w] - 1); Lu_next[t_lvl][i] = 0.5*L_c*( tmp + sigma*gaussian_noise()); // reuse as Lu_next } } for(int i = 0, j=0, t_lvl=0; i <h ; ++i) for(j = 0 ; j < w ; ++j) for(t_lvl=0 ; t_lvl < PXL ; ++t_lvl){ img_next[t_lvl][i][j] = ((Lu_next[t_lvl][j+i*w]>=0)?1:0); } bin2dec_img(img_next,h,w,imgr_next); motionEstES(imgr,imgr_next,h,w,8,5,MV); if(frame==1){ intra_inter_beta_estimation(imgr_bp,imgr_bp_next,MV,beta_s,beta_t,h,w,8); for(int i = 0 ; i < PXL ; ++i) beta_t_prev[i] = 0; } else intra_inter2_beta_estimation(imgr_bp_next,imgr_bp,imgr_bp_prev,MV,beta_s,beta_t,beta_t_prev,h,w,8); motionComp(Lu_next,MV,h,w,8,Lu_c); mrf_siso_inter(Lu,Lu_c,beta_t,h,w,Le_s_inter_next,0); mrf_siso_intra(Lu,beta_s,h,w,Le_s_intra,0); for(int i = 0, t_lvl = 0 ; i < lm ; ++i) for(t_lvl = 0 ; t_lvl < PXL ; ++t_lvl) Le[t_lvl][i] = (Le_s_inter_next[t_lvl][i] + Le_s_intra[t_lvl][i] + Le_s_inter[t_lvl][i]*beta_t_prev[t_lvl]); // compute Ie for(int t_lvl = 0 , i = 0; t_lvl < PXL ; ++t_lvl){ tmp_sum = 0; for(i=0; i < lm ; ++i){ tmp_sum+=log2(1 + exp(-Le[t_lvl][i]*(2*imgr_bp[0][0][i+t_lvl*lm]-1))); } Ie[t_lvl][idx] = 1 - tmp_sum/lm; } } printf("\r100.00%% completed!\n"); FILE *file = fopen("output/exit_curve_ps.txt","a+"); for(int t_lvl = 0 ; t_lvl < PXL ; ++t_lvl){ fprintf(file,"==== v2 ========================\n%s: frame#%d,bp#%d\nIa=\n",argv[1],frame+1,t_lvl+1); for(int i = 0 ; i < snr_size ; ++i) fprintf(file,"%lf,",Ia[t_lvl][i]); fprintf(file,"\nIe=\n"); for(int i = 0 ; i < snr_size ; ++i) fprintf(file,"%lf,",Ie[t_lvl][i]); fprintf(file,"\n\n"); } fclose(file); write_ps_for_matlab(Ia,Ie,snr_size); // free memory deleteY(Y); delete3d<int>(imgr_bp); delete3d<int>(imgr_bp_prev); delete3d<int>(imgr_bp_next); delete3d<int>(img_next); delete3d<int>(img_prev); delete3d<int>(img); delete2d<int>(imgr_next); delete2d<int>(imgr_prev); delete2d<int>(imgr); delete2d<double>(Lu_c); delete2d<double>(Lu_next); delete2d<double>(Lu); delete2d<double>(Lu_prev); delete2d<double>(Ia); delete2d<double>(Ie); delete2d<int>(MV_prev); delete2d<int>(MV); delete2d<double>(Le); delete2d<double>(Le_s_inter); delete2d<double>(Le_s_inter_next); delete2d<double>(Le_s_intra); free(beta_s); free(beta_t); free(beta_t_prev); }