信号系统综合实践报告.docx_第1页
信号系统综合实践报告.docx_第2页
信号系统综合实践报告.docx_第3页
信号系统综合实践报告.docx_第4页
信号系统综合实践报告.docx_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大连理工大学本科实验报告课程名称: 信号综合处理实践 学院(系): 信息与通信工程学院 专 业: 电子信息工程(英强) 班 级: 电英1401班 学 生 1 : 李帆 201483089 学 生 2 : 马壮 201483082 学 生 3 : 王瑞明 201483133 2017 年 10 月 12 日题目:实验39 字幕式文字显示一、 方法的原理本课题为字幕式文字显示,将提前设定的文字在显示器上动态显示,随着时间逐渐移动,实现弹幕的滚动效果。主要的方法原理是,对指定文字进行字符化处理,形成32px*32px的汉字阵列,在显示器上对平面坐标进行设定,确定字符的初始位置,并确定字符间的相对位置,设定二维平面内字幕的移动方向和速度,从而实现字幕的动态效果。同时,对显示器背景和字符的灰度进行调整,实现较好的演示效果。1、汉语文字的字符点阵处理:在灰度图像中,文字可以用像素点的形式显示,改变不同像素点位置的灰度值,可以实现文字的正确显示。我们对汉字进行像素点阵处理,将单个汉字表示成自由设定的大小,计算出汉字占据的像素点,从而显示出汉字的图形。利用汉字字模软件PCtoLCD2002,可以很简便地得到一般汉字的点阵表示。在软件中输入汉字内容,调整点阵背景大小和汉字的字体及大小,自动生成像素坐标形式,确定坐标可以进一步实现汉字的正确显示。我们对示例文字采用宋体,背景和汉字大小均为32px*32px,这样在屏幕上显示效果较好。在程序中,我们将三名组员的姓名的每个字分别用像素点表示,作为查询表进行显示。图1 生成汉字“李帆”像素点表示示例2、对显示器进行初始化设定对显示器参数进行设定,屏幕宽度设为720,高度设为576,帧间隔设为25,最大帧率为25000。由于是灰度图像显示,所以对显示器背景色和汉字颜色采用灰度级表示,我们设定背景色为纯黑0x00,将汉字设为纯白0xff,便于清楚地显示。3、 字幕文字位置及移动方式设定 对显示器进行二位平面坐标处理后,文字的位置以坐标的形式在显示器显示。将文字作为整体,实现移动效果。我们将中心字设为“马”,规定汉字第一个像素点的坐标为place_x和place_y,在(x,y)至(x+32,y+32)内的矩阵将显示汉字“马”。我们在每一行显示一个成员名字,这样之后每个的汉字只需对x累加32即可实现。确定行间距也为32px,这样在每一列上只需对中心字分别做处理(y+64)和(y-64)。由此实现了一个整体操作,改变place_x和place_y的数值,可以实现字幕的滚动。滚动方式设定为以对角线形式下降,所以在每帧上使横纵坐标均累加,实现语句为 place_x+=5; place_y+=5; 改变符号和大小,可以引起字幕文字移动的方向和快慢。显而易见,place_x累加则向右移动,place_x累减则向左移动,place_y累加则向下移动,place_y累减则向上。如果字幕文字接近边界,我们设定字幕坐标回到初始0点,实现语句为 if(place_x600) place_x=0; 这样可以实现往复滚动,这样更符合网站弹幕的设定。初始位置横纵坐标均设为100,实现语句为提前定义 int place_x=100; int place_y=100; 经过以上方法的讨论,可以将字幕正确转化为图像像素点,并在显示器上以平面坐标的形式显示,在显示后可以实现字幕的自由移动。二、 代码和效果图核心代码实现如下:/* * = video_encdec.c = * */* Codec Engine include files: */#include #include #include #include #include /* BIOS include files: */#include #include /* Run Time lib include files: */#include #include #include #include /* PSP include files: */#include #include #include #include /* BSL include files */#include /#include /* Video Params Defaults */#include /* Video Encoder initialization param: */#define VE_MAX_BR (4000000)/* Align on cache-line boundary since encoder uses DMA */#define BUFALIGN 128/* Number of buffers to allocate for video capture + display: */#define FRAME_BUFF_CNT 6/* This example supports either PAL or NTSC depending on position of JP1 */#define STANDARD_PAL 0#define STANDARD_NTSC 1/* Video Encoder parameters for D1, set depending on PAL vs NTSC: */static int intraFrameInterval;static int inputWidth;static int inputHeight;static int maxFrameRate;/* Encoder Input, Encoder output, and Decoder Output Frame sizes */static int framesize;/* Video Frame buffers: */static FVID_Frame *frameBuffTableFRAME_BUFF_CNT;static FVID_Frame *frameBuffPtr = NULL;/* Video Driver Handles: */static FVID_Handle hGioVpfeCcdc = NULL;static FVID_Handle hGioVpbeVid0 = NULL;static FVID_Handle hGioVpbeVenc = NULL;/* Intermediate buffer for the encoded video stream: */static XDAS_Int8 *encodedBuf;/* Codec Engine engine and codec labels, defined in cfg file: */static String decoderName = h264dec;static String encoderName = h264enc;static String engineName = encdec;static String progName = app;/* Function prototypes */static Void initVE_StaticParams(VIDENC_Params *vencParams);static Void initVE_DynamicParams(VIDENC_DynamicParams *encDynParams);static Void initVD_StaticParams(VIDDEC_Params *vdecParams);static Void initVD_DynamicParams(VIDDEC_DynamicParams *decDynParams);static Void encode_decode(VIDENC_Handle enc, VIDDEC_Handle dec);/static int read_JP1(void);/* * = video_encdec = */* ARGSUSED */Int video_encdec(Int argc, String argv) int status = 0; int result; int i; Engine_Handle ce = NULL; VIDDEC_Handle dec = NULL; VIDENC_Handle enc = NULL; VIDENC_Status encStatus; VIDENC_Params vencParams; VIDENC_DynamicParams encDynParams; VIDDEC_Status decStatus; VIDDEC_Params vdecParams; VIDDEC_DynamicParams decDynParams; int standard; /* Set video display/capture driver params to defaults */ PSP_VPFE_TVP5146_ConfigParams tvp5146Params = VID_PARAMS_TVP5146_DEFAULT; PSP_VPFECcdcConfigParams vpfeCcdcConfigParams = VID_PARAMS_CCDC_DEFAULT_D1; PSP_VPBEOsdConfigParams vpbeOsdConfigParams = VID_PARAMS_OSD_DEFAULT_D1; PSP_VPBEVencConfigParams vpbeVencConfigParams; printf(video_encdec started.n); / standard = read_JP1(); standard =STANDARD_PAL; /* Update display/capture params based on video standard (PAL/NTSC) */ if (standard = STANDARD_PAL) inputWidth = 720; inputHeight = 576; intraFrameInterval = 25; maxFrameRate = 25000; vpbeVencConfigParams.displayStandard = PSP_VPBE_DISPLAY_PAL_INTERLACED_COMPOSITE; else inputWidth = 720; inputHeight = 480; intraFrameInterval = 30; maxFrameRate = 30000; vpbeVencConfigParams.displayStandard = PSP_VPBE_DISPLAY_NTSC_INTERLACED_COMPOSITE; framesize = (inputWidth * inputHeight * 2 * sizeof(Int8); vpfeCcdcConfigParams.height = vpbeOsdConfigParams.height = inputHeight; vpfeCcdcConfigParams.width = vpbeOsdConfigParams.width = inputWidth; vpfeCcdcConfigParams.pitch = vpbeOsdConfigParams.pitch = inputWidth * 2; /* Initialize Video Display Driver: */ /* create video input channel */ if (status = 0) PSP_VPFEChannelParams vpfeChannelParams; vpfeChannelParams.id = PSP_VPFE_CCDC; vpfeChannelParams.params = (PSP_VPFECcdcConfigParams*)&vpfeCcdcConfigParams; hGioVpfeCcdc = FVID_create(/VPFE0,IOM_INOUT,NULL,&vpfeChannelParams,NULL); status = (hGioVpfeCcdc = NULL ? -1 : 0); /* create video output channel, plane 0 */ if (status = 0) PSP_VPBEChannelParams vpbeChannelParams; vpbeChannelParams.id = PSP_VPBE_VIDEO_0; vpbeChannelParams.params = (PSP_VPBEOsdConfigParams*)&vpbeOsdConfigParams; hGioVpbeVid0 = FVID_create(/VPBE0,IOM_INOUT,NULL,&vpbeChannelParams,NULL); status = (hGioVpbeVid0 = NULL ? -1 : 0); /* create video output channel, venc */ if (status = 0) PSP_VPBEChannelParams vpbeChannelParams; vpbeChannelParams.id = PSP_VPBE_VENC; vpbeChannelParams.params = (PSP_VPBEVencConfigParams *)&vpbeVencConfigParams; hGioVpbeVenc = FVID_create(/VPBE0,IOM_INOUT,NULL,&vpbeChannelParams,NULL); status = (hGioVpbeVenc = NULL ? -1 : 0); /* configure the TVP5146 video decoder */ if (status = 0) result = FVID_control(hGioVpfeCcdc, VPFE_ExtVD_BASE+PSP_VPSS_EXT_VIDEO_DECODER_CONFIG, &tvp5146Params); status = (result = IOM_COMPLETED ? 0 : -1); /* allocate display/capture frame buffers */ for (i=0; iFRAME_BUFF_CNT; i+) frameBuffTablei = NULL; if (status = 0) for (i=0; iFRAME_BUFF_CNT & status = 0; i+) result = FVID_allocBuffer(hGioVpfeCcdc, &frameBuffTablei); status = (result = IOM_COMPLETED & frameBuffTablei != NULL ? 0 : -1); /* prime up the video capture channel */ if (status = 0) FVID_queue(hGioVpfeCcdc, frameBuffTable0); FVID_queue(hGioVpfeCcdc, frameBuffTable1); FVID_queue(hGioVpfeCcdc, frameBuffTable2); /* prime up the video display channel */ if (status = 0) FVID_queue(hGioVpbeVid0, frameBuffTable3); FVID_queue(hGioVpbeVid0, frameBuffTable4); FVID_queue(hGioVpbeVid0, frameBuffTable5); /* grab first buffer from input queue */ if (status = 0) FVID_dequeue(hGioVpfeCcdc, &frameBuffPtr); if (status != 0) goto end; /* Allocate Encoder output buffer: */* encodedBuf = (XDAS_Int8 *)Memory_contigAlloc(framesize, BUFALIGN); if (encodedBuf = NULL) goto end; else Memory_cacheWbInv(encodedBuf, framesize); */ /* use engine to encode, then decode the data */ encode_decode(enc, dec);end: /* Free Video Driver resources: */ if (hGioVpfeCcdc) for (i=0; isize = sizeof(VIDENC_Params); vencParams-encodingPreset = XDM_DEFAULT; vencParams-rateControlPreset = IVIDEO_LOW_DELAY; vencParams-maxHeight = inputHeight; vencParams-maxWidth = inputWidth; vencParams-maxFrameRate = maxFrameRate; vencParams-maxBitRate = VE_MAX_BR; vencParams-dataEndianness = XDM_BYTE; vencParams-maxInterFrameInterval = 0; vencParams-inputChromaFormat = XDM_YUV_422ILE; vencParams-inputContentType = IVIDEO_PROGRESSIVE; return; /* * = initVE_DynamicParams = */static Void initVE_DynamicParams(VIDENC_DynamicParams *encDynParams) encDynParams-inputHeight = inputHeight; encDynParams-inputWidth = inputWidth; encDynParams-refFrameRate = maxFrameRate; encDynParams-targetFrameRate = maxFrameRate; encDynParams-targetBitRate = VE_MAX_BR; encDynParams-intraFrameInterval = intraFrameInterval; encDynParams-generateHeader = XDM_ENCODE_AU; encDynParams-captureWidth = 0; encDynParams-forceIFrame = 0; return;/* * = initVD_StaticParams = */static Void initVD_StaticParams(VIDDEC_Params * vdecParams) /* Set Constant Bit Rate, YUV422 Interlaced, little endian: */ vdecParams-size = sizeof(VIDDEC_Params); vdecParams-maxHeight = inputHeight; vdecParams-maxWidth = inputWidth; vdecParams-maxFrameRate = 0; vdecParams-maxBitRate = 0; vdecParams-dataEndianness = XDM_BYTE; vdecParams-forceChromaFormat = XDM_YUV_422ILE; return ; /* * = initVD_DynamicParams = */static Void initVD_DynamicParams(VIDDEC_DynamicParams *decDynParams) decDynParams-decodeHeader = XDM_DECODE_AU; decDynParams-displayWidth = 0; decDynParams-frameSkipMode = IVIDEO_NO_SKIP; return;void GrayImage(Uint8 *in_data)Uint32 i,j;for(i = 0; i 576; i+)for(j=0; j 720; j+)*(Uint8 *)(in_data + (i*720 + j) * 2) = 0x80;void GrayImage_y(Uint8 *in_data)Uint32 i,j;for(i = 0; i 576; i+)for(j=0; j 600) place_x=0; for(i = 0; i 576; i+)for(j=0; j 720; j+)*(Uint8 *)(in_data + (i*720 + j) * 2+1) = 0x00;for(i=0;i32;i+) for(j=0;j3)&(1(7-(i&7)3)&(1(7-(i&7)3)&(1(7-(i&7)3)&(1(7-(i&7)3)&(1(7-(i&7)3)&(1(7-(i&7)3)&(1(7-(i&7)3)&(1(7-(i&7)(i&7);/*for(i=0;i96;i+)for(j=0;j96;j+)*(Uint8 *)(in_data + (place_y+i)*720 + place_x+j) * 2 + 0) = 0x80;*/for(i = 0; i 576; i+)for(j=0; j 720; j+)*(Uint8 *)(in_data + (i*720 + j) * 2) &= 0xff;/*i=216;for(j = 180; j 541; j+)*(in_data + (i*720 + j) * 2 + 1) = 0x11;i=360;for(j =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论