⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 LDPC码的实现,包括编码器和解码器,使用了DCT.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[1], pDecodedFrame[1], &fPSNRU) );
			SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[2], pDecodedFrame[2], &fPSNRV) );
			sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", fRateY*BITPLANES, pRateQuadOracle[4]*BITPLANES, pRateQuadOracle[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
			// Update RD file
			fprintf(codingOption.pLogFileRD, "%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t", fRateY*BITPLANES, pRateQuadOracle[4]*BITPLANES, pRateQuadOracle[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); fflush(codingOption.pLogFileRD);

			// Save decoded frame and motion field
			if (codingOption.bSaveDecodedFrame) {
				SAFE_FUNC( saveDecodedFrame(&codingOption, "oracle", (const short**)pDecodedFrame) );
			}
			if (codingOption.bSaveMotionField) {
				SAFE_FUNC( saveDecodedMotion(&codingOption, "oracle", (const short**)pOracleShiftsXQuad, (const short**)pOracleShiftsYQuad, NULL) );
			}

			// Store for future reference
			pVideoOracleY[nWZFrame] = pDecodedFrame[0];
			pVideoOracleU[nWZFrame] = pDecodedFrame[1];
			pVideoOracleV[nWZFrame] = pDecodedFrame[2];
		}

		//------------------------------------------------------------
		// Decode with motion learning
		//------------------------------------------------------------
		sprintf(pTextBuffer, "Decode with motion learning"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);
		
		if (codingOption.bTestMotionLearning) {
			// Decode
			pWZFrame[0] = pVideoY[nWZFrame];
			pWZFrame[1] = pVideoU[nWZFrame];
			pWZFrame[2] = pVideoV[nWZFrame];
			pSIFrame[0] = pVideoLearningY[nSIFrame];
			pSIFrame[1] = pVideoLearningU[nSIFrame];
			pSIFrame[2] = pVideoLearningV[nSIFrame];
			for (int nChannel = 0; nChannel < 3; nChannel++) {
				pDecodedFrame[nChannel] = new short[PIXELS];
			}
			for (int nQuad = 0; nQuad < 6; nQuad++) {
				// Use motion oracle rate as lower bound
				if (codingOption.bTestMotionOracle) {
					pRatePredict[nQuad] = pRateQuadOracle[nQuad] - (float)(0.5/132.0);
				}
				// Use conditional entropy as lower bound
				else {
					pRatePredict[nQuad] = pEntropyQuad[nQuad];
				}
			}
			// Turn on motion learning
			codingOption.bMotionEstimate = true;
			// Turn off motion oracle
			codingOption.bMotionOracle = false;
			SAFE_FUNC( pixelQuads_decodeFrameYUV(&codingOption, (const short**)pSIFrame, (const uchar**)pAccumSyndQuad, pScaledQArray, pRatePredict, (const float**)pLambdaQuad, codingOption.pLadderFileName, (const short**)pOracleShiftsXQuad, (const short**)pOracleShiftsYQuad, pDecodedFrame, pRateQuadLearning, pDecodedShiftsX, pDecodedShiftsY, pDecodedShiftProb) );

			// Measure statistics
			fRateY = 0.0;
			for (int nQuad = 0; nQuad < 6; nQuad++) {
				if (nQuad < 4) fRateY += (float)(0.25 * pRateQuadLearning[nQuad]);
				sprintf(pTextBuffer, "quad %d rate (bpp): %.2f \n", nQuad, pRateQuadLearning[nQuad]*BITPLANES);
				printf(pTextBuffer); fprintf(codingOption.pLogFile, pTextBuffer); fflush(codingOption.pLogFile);
			}
			SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[0], pDecodedFrame[0], &fPSNRY) );
			SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[1], pDecodedFrame[1], &fPSNRU) );
			SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[2], pDecodedFrame[2], &fPSNRV) );
			sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", fRateY*BITPLANES, pRateQuadLearning[4]*BITPLANES, pRateQuadLearning[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
			// Update RD file
			fprintf(codingOption.pLogFileRD, "%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t", fRateY*BITPLANES, pRateQuadLearning[4]*BITPLANES, pRateQuadLearning[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); fflush(codingOption.pLogFileRD);

			// Save decoded frame and motion field
			if (codingOption.bSaveDecodedFrame) {
				SAFE_FUNC( saveDecodedFrame(&codingOption, "learning", (const short**)pDecodedFrame) );
			}
			if (codingOption.bSaveMotionField) {
				SAFE_FUNC( saveDecodedMotion(&codingOption, "learning", (const short**)pDecodedShiftsX, (const short**)pDecodedShiftsY, (const float**)pDecodedShiftProb) );
			}

			// Store for future reference
			pVideoLearningY[nWZFrame] = pDecodedFrame[0];
			pVideoLearningU[nWZFrame] = pDecodedFrame[1];
			pVideoLearningV[nWZFrame] = pDecodedFrame[2];
		}

		//------------------------------------------------------------
		// Decode with no compensation
		//------------------------------------------------------------
		sprintf(pTextBuffer, "Decode with no compensation"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);

		if (codingOption.bTestZeroMotion) {
			// Decode
			pWZFrame[0] = pVideoY[nWZFrame];
			pWZFrame[1] = pVideoU[nWZFrame];
			pWZFrame[2] = pVideoV[nWZFrame];
			pSIFrame[0] = pVideoOracleY[nSIFrame];
			pSIFrame[1] = pVideoOracleU[nSIFrame];
			pSIFrame[2] = pVideoOracleV[nSIFrame];
			for (int nChannel = 0; nChannel < 3; nChannel++) {
				pDecodedFrame[nChannel] = new short[PIXELS];
			}
			for (int nQuad = 0; nQuad < 6; nQuad++) {
				// Use motion oracle rate as lower bound
				if (codingOption.bTestMotionOracle) {
					pRatePredict[nQuad] = pRateQuadOracle[nQuad] - (float)(0.5/132.0);
				}
				// Use conditional entropy as lower bound
				else {
					pRatePredict[nQuad] = pEntropyQuad[nQuad];
				}
			}
			// Turn off motion learning
			codingOption.bMotionEstimate = false;
			// Turn off motion oracle
			codingOption.bMotionOracle = false;
			SAFE_FUNC( pixelQuads_decodeFrameYUV(&codingOption, (const short**)pSIFrame, (const uchar**)pAccumSyndQuad, pScaledQArray, pRatePredict, (const float**)pLambdaQuad, codingOption.pLadderFileName, (const short**)pOracleShiftsXQuad, (const short**)pOracleShiftsYQuad, pDecodedFrame, pRateQuadNoComp, pDecodedShiftsX, pDecodedShiftsY, pDecodedShiftProb) );

			// Measure statistics
			fRateY = 0.0;
			for (int nQuad = 0; nQuad < 6; nQuad++) {
				if (nQuad < 4) fRateY += (float)(0.25 * pRateQuadNoComp[nQuad]);
				sprintf(pTextBuffer, "quad %d rate (bpp): %.2f \n", nQuad, pRateQuadNoComp[nQuad]*BITPLANES);
				printf(pTextBuffer); fprintf(codingOption.pLogFile, pTextBuffer); fflush(codingOption.pLogFile);
			}
			SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[0], pDecodedFrame[0], &fPSNRY) );
			SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[1], pDecodedFrame[1], &fPSNRU) );
			SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[2], pDecodedFrame[2], &fPSNRV) );
			sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", fRateY*BITPLANES, pRateQuadNoComp[4]*BITPLANES, pRateQuadNoComp[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
			// Update RD file
			fprintf(codingOption.pLogFileRD, "%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t", fRateY*BITPLANES, pRateQuadNoComp[4]*BITPLANES, pRateQuadNoComp[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); fflush(codingOption.pLogFileRD);

			// Save decoded frame
			if (codingOption.bSaveDecodedFrame) {
				SAFE_FUNC( saveDecodedFrame(&codingOption, "noComp", (const short**)pDecodedFrame) );
			}

			// Store for future reference
			pVideoOracleY[nWZFrame] = pDecodedFrame[0];
			pVideoOracleU[nWZFrame] = pDecodedFrame[1];
			pVideoOracleV[nWZFrame] = pDecodedFrame[2];
		}

		//------------------------------------------------------------
		// Decode with intra
		//------------------------------------------------------------
		sprintf(pTextBuffer, "Decode with intra"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);

		if (codingOption.bTestIntra) {
			sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", pIntraRateY[nWZFrame], pIntraRateU[nWZFrame], pIntraRateV[nWZFrame], pIntraPSNRY[nWZFrame], pIntraPSNRU[nWZFrame], pIntraPSNRV[nWZFrame]); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
			// Update RD file
			fprintf(codingOption.pLogFileRD, "%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t", pIntraRateY[nWZFrame], pIntraRateU[nWZFrame], pIntraRateV[nWZFrame], pIntraPSNRY[nWZFrame], pIntraPSNRU[nWZFrame], pIntraPSNRV[nWZFrame]); fflush(codingOption.pLogFileRD);
		}

		//------------------------------------------------------------
		// Clean up frame memory
		//------------------------------------------------------------
		for (int nQuad = 0; nQuad < 6; nQuad++) {
			delete [] pAccumSyndQuad[nQuad];
			delete [] pLambdaQuad[nQuad];
			delete [] pOracleShiftsXQuad[nQuad];
			delete [] pOracleShiftsYQuad[nQuad];
			delete [] pDecodedShiftsX[nQuad];
			delete [] pDecodedShiftsY[nQuad];
			delete [] pDecodedShiftProb[nQuad];
		}
		// Update RD file
		fprintf(codingOption.pLogFileRD, "\n"); fflush(codingOption.pLogFileRD);

	} // end codingOption.nCurrFrame

	//------------------------------------------------------------
	// Report overall simulation time
	//------------------------------------------------------------
	sprintf(pTextBuffer, "Report overall simulation time"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);

	time(&nEndTime);
	int nTimeElapsed = (int)(nEndTime - nStartTime);
	sprintf(pTextBuffer, "encode/decode time (sec) = %d \n", nTimeElapsed); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);

	//------------------------------------------------------------
	// Clean up memory
	//------------------------------------------------------------
	if (pScaledQArray != NULL) delete [] pScaledQArray;
	if (pIntraRateY != NULL) delete [] pIntraRateY;
	if (pIntraRateU != NULL) delete [] pIntraRateU;
	if (pIntraRateV != NULL) delete [] pIntraRateV;
	if (pIntraPSNRY != NULL) delete [] pIntraPSNRY;
	if (pIntraPSNRU != NULL) delete [] pIntraPSNRU;
	if (pIntraPSNRV != NULL) delete [] pIntraPSNRV;
	for (int nFrame = 0; nFrame < nFrames; nFrame++) {
		if (pVideoIntraY[nFrame] != NULL) delete [] pVideoIntraY[nFrame];
		if (pVideoIntraU[nFrame] != NULL) delete [] pVideoIntraU[nFrame];
		if (pVideoIntraV[nFrame] != NULL) delete [] pVideoIntraV[nFrame];
		if (pVideoY[nFrame] != NULL) delete [] pVideoY[nFrame];
		if (pVideoU[nFrame] != NULL) delete [] pVideoU[nFrame];
		if (pVideoV[nFrame] != NULL) delete [] pVideoV[nFrame];
		if (pVideoLearningY[nFrame] != NULL) delete [] pVideoLearningY[nFrame];
		if (pVideoLearningU[nFrame] != NULL) delete [] pVideoLearningU[nFrame];
		if (pVideoLearningV[nFrame] != NULL) delete [] pVideoLearningV[nFrame];
		if (pVideoOracleY[nFrame] != NULL) delete [] pVideoOracleY[nFrame];
		if (pVideoOracleU[nFrame] != NULL) delete [] pVideoOracleU[nFrame];
		if (pVideoOracleV[nFrame] != NULL) delete [] pVideoOracleV[nFrame];
		if (pVideoNoCompY[nFrame] != NULL) delete [] pVideoNoCompY[nFrame];
		if (pVideoNoCompU[nFrame] != NULL) delete [] pVideoNoCompU[nFrame];
		if (pVideoNoCompV[nFrame] != NULL) delete [] pVideoNoCompV[nFrame];
	}
	if (pVideoIntraY != NULL) delete [] pVideoIntraY;
	if (pVideoIntraU != NULL) delete [] pVideoIntraU;
	if (pVideoIntraV != NULL) delete [] pVideoIntraV;
	if (pVideoY != NULL) delete [] pVideoY;
	if (pVideoU != NULL) delete [] pVideoU;
	if (pVideoV != NULL) delete [] pVideoV;
	if (pVideoLearningY != NULL) delete [] pVideoLearningY;
	if (pVideoLearningU != NULL) delete [] pVideoLearningU;
	if (pVideoLearningV != NULL) delete [] pVideoLearningV;
	if (pVideoOracleY != NULL) delete [] pVideoOracleY;
	if (pVideoOracleU != NULL) delete [] pVideoOracleU;
	if (pVideoOracleV != NULL) delete [] pVideoOracleV;
	if (pVideoNoCompY != NULL) delete [] pVideoNoCompY;
	if (pVideoNoCompU != NULL) delete [] pVideoNoCompU;
	if (pVideoNoCompV != NULL) delete [] pVideoNoCompV;

	// Close Matlab engine and log files
	SAFE_FUNC( ChenImageMatlab_closeEngine() );
	fclose(codingOption.pLogFile);
	fclose(codingOption.pLogFileRD);

	return GOOD_RETURN;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -