代码生成系统

2024-07-03

代码生成系统(共12篇)

代码生成系统 篇1

摘要:介绍基于数字信号处理器TMS320F2812的普通单相并网逆变器主电路原理和控制方法,并由该电路拓扑结构建立仿真的统一模型,使用MATLAB中Embedded Coder工具箱,针对该系统进行实时仿真,并利用生成的控制代码进行了实验。

关键词:单相并网逆变器,嵌入式代码,数字信号处理器

0 引言

单相并网逆变器的实时控制系统由于主电路拓扑和控制结构的复杂性,其嵌入式测控软件的开发周期一般较长。而目前的单相并网逆变器的实时控制系统基本上都是首先采用电力电子仿真进行算法验证,然后嵌入式C语言直接编程的方法进行控制,两个研发步骤之间存在脱节现象[1]。

Math Works公司推出的针对DSP应用控制系统而开发的嵌入式目标模块(Embedded Target for T DSP C2000系列)能够帮助解决这些问题,使用该系统中的模块,不仅能够进行控制系统的系统级离线状态下仿真,还能够直接生成相对应的C程序代码,将该程序代码直接下载到DSP目标板,从而对所研究的算法和设计思路进行快速地验证,使开发效率得到很大程度的提高。采用MATLAB—Embedded Targets—Processors—Texas Instrument C2000库中能够下载到DSP2812处理器的模块,使用这些模块进行系统仿真,应用该库中的模块进行算法仿真,仿真成功后,直接进行代码生成,能够很好地实现控制,大大地缩减研发周期[2]。

1 单相并网逆变器

1.1 单相并网逆变器控制结构

单相并网逆变器系统由主电路、DSP控制器、驱动电路、信号采集调理电路等组成。其中,主电路采用DC/DC,DC/AC两级结构;控制器以DSP为控制核心,一方面控制DC/DC环节,以实现光伏电池的最大功率点跟踪,另一方面控制DC/AC环节,以使直流母线电压稳定,并将电能转化为220V/50Hz正弦交流电。系统保证并网逆变器输出的正弦电流与电网的相电压同频同相[3]。

控制结构如图1所示,UN为电网电压,Udc为光伏阵列两端的电压经Boost电路升压后得到的稳定的直流电压(本系统采用直流电源代替光伏阵列和Boos主电路),此电压需经单相全桥电路进行逆变变为交流电,然后才能接入电网,D1~D4为整流桥中的续流二极管,Cpv和Cdc为稳压电容,Dd为直流侧的续流二极管,L1为滤波电感,L2为并网电感。

需要控制IGBT通态和断态情况下的电容电压和电感电流,通过PID控制器,进行电容电压外环与电感电流内环的双闭环控制[4]。

1.2 在Matlab中单相并网逆变器的实现

对于单相并网逆变器,稳定可靠、对电网影响小是其基本要求,PID控制器以其结构原理简单、使用方便、适用性强、鲁棒性强、抗干扰能力强等优点,广泛应用于工业控制系统中。

PID反馈控制的原理如图2所示。PID控制器可使被控量快速地跟随参考量,改善系统的稳态性能。用PID控制器对直流母线电压的实际值Udc与其参考值U*dc的偏差进行控制,可使Udc跟随且趋向U*dc,控制器的输出是并网参考电流的幅值。同理,可使系统输出电流iL2不断地跟随参考电流i*L2的变化而变化。

在Matlab工具箱中有专门的PID控制模块,采用PID控制器实现逆变器输出电流的控制[5],控制的拓扑结构如图3所示。

图中主要用到了Embedded Target库中的PID controller控制模块[6]。设置PID参数,代入仿真中观察PID跟踪效果,从而判断出系统控制效果的好坏。

2 基于Matlab代码生成模型的仿真设计

2.1 MATLAB仿真的设计

在实际控制系统中用C语言编写控制程序要比用汇编语言编程方便得多,而用MATLAB又比用C语言编程方便得多[7]。

在使用MATLAB代码生成实现系统的控制之前,能够对系统模型的搭建实现算法的仿真,从而判断算法的可行性及实际的控制效果,克服了C语言编程控制调试时间长、能观性较差等缺点,并对硬件电路的搭建起到指导作用[8]。应用MATLAB的单相并网逆变器的仿真模型如图4所示。

此仿真模型,主要包括两大部分:电力电子部分和代码生成部分。其中,电力电子部分的主要作用是对实际硬件电路进行配置;而代码生成部分的主要作用是对控制器中所执行的算法和实际控制器TMS320F2812的输入和输出进行配置[9]。

2.2 仿真结果

系统采用220V直流电源代替光伏组件和Boos电路,L2取12m H,Cdc取6000μF。电压和电流的PID控制器控制效果的仿真波形分别如图5、图6所示。仿真模型并网电流波形如图7所示。

通过仿真结果可以看出:采用PID控制,能够跟踪给定的值,从而控制输出电压的大小,并且PID控制器输出较稳定,系统控制效果好,基本能保证输出电流与电网电压同相位、同频率。

3 实验结果

将实验仿真通过TMS320F2812在实际系统中进行了实验,并用示波器记录了实验结果图形,如图8所示。

由图8可以看出,实验的结果与仿真的结果基本上相同,通过计算得到逆变器的输出功率因数约为0.96,完全满足实际需求,并且输出电流与电网电压的相位和频率基本一致。所以本系统的控制方法基本能保持输出电流与电网电压同频率、同相位,是一种较好的控制方法,并且实现了由控制器中所执行的算法和实际控制器DSP2812的输入和输出的有效配置。

参考文献

[1]于丹,孙艳,代玉银.Matlab嵌入式系统的代码生成[J].电脑知识与技术,2010.16:4576-4577[1]于丹,孙艳,代玉银.Matlab嵌入式系统的代码生成[J].电脑知识与技术,2010.16:4576-4577

[2]张雄伟.DSP芯片的原理与开发应用(2版)[M]北京:电子工业出版社,1997[2]张雄伟.DSP芯片的原理与开发应用(2版)[M]北京:电子工业出版社,1997

[3]任广林,杨诗凤.基于交流比例积分控制器的单相逆变器[J].自动化应用,2012,(09):75-77[3]任广林,杨诗凤.基于交流比例积分控制器的单相逆变器[J].自动化应用,2012,(09):75-77

[4]A G Y,F D F,et al.High-Performance Digital Resonant Controllers Implemented With Two Integrators[J].IEEE Trans.Power Electron.,2011,26(2):563-576[4]A G Y,F D F,et al.High-Performance Digital Resonant Controllers Implemented With Two Integrators[J].IEEE Trans.Power Electron.,2011,26(2):563-576

[5]张兴,曹仁贤,等.太阳能光伏并网发电及其逆变器控制[M].北京:机械工业出版社,2010[5]张兴,曹仁贤,等.太阳能光伏并网发电及其逆变器控制[M].北京:机械工业出版社,2010

[6]刘海生,佟仕忠.单相中功率光伏并网逆变器的设计[J].可再生能源,2008,(04):49-52[6]刘海生,佟仕忠.单相中功率光伏并网逆变器的设计[J].可再生能源,2008,(04):49-52

[7]朱俊杰,陈程,李智,等.新型的单相光伏并网发电装置[J].自动化仪表,2010,31(8):41-44[7]朱俊杰,陈程,李智,等.新型的单相光伏并网发电装置[J].自动化仪表,2010,31(8):41-44

[8]滕国飞,肖国春,张志波,等.一种抑制电网扰动的单相并网逆变器控制方法[J].电源学报,2012,(03):6-11[8]滕国飞,肖国春,张志波,等.一种抑制电网扰动的单相并网逆变器控制方法[J].电源学报,2012,(03):6-11

[9]张强,张崇巍,张兴,等.风力发电用大功率并网逆变器研究[J].中国电机工程学报,2007,27(16):54-59[9]张强,张崇巍,张兴,等.风力发电用大功率并网逆变器研究[J].中国电机工程学报,2007,27(16):54-59

代码生成系统 篇2

char xm[7];char xb[3];char sr[15];char whcd[13];char zc[17];char sfzh[19];char lxdh[12];int gl;int nl;};struct member_info member[N+1];int CurrentCount=0;void input(){ char sfjx=1;

while(sfjx!=0)

{

if(CurrentCount==N)

{

printf(“n人数已达上限,不能添加!!n”);

sfjx=0;

}

else

{

CurrentCount++;

printf(“n请输入员工信息(姓名 性别 生日 年龄 文化程度 联系电话 身份证号码 工龄 职称):n”);

scanf(“%s%s%s%d%s%s%s%d%s”,member[CurrentCount].xm,member[CurrentCount].xb,member[CurrentCount].sr,&member[CurrentCount].nl,member[CurrentCount].whcd,member[CurrentCount].lxdh,member[CurrentCount].sfzh,&member[CurrentCount].gl,member[CurrentCount].zc);

printf(“n是否继续(0--结束,其它--继续):”);

scanf(“%d”,&sfjx);

}

} printf(“人员已排序”);int i,j;

for(i=1;i

for(j=CurrentCount;j>i;j--)

if(strcmp(member[j].sfzh,member[j-1].sfzh)<0)

{

member[0]=member[j];

member[j]=member[j-1];

member[j-1]=member[0];

}

printf(“n

人事基本信息表n”);

printf(“ 序号 姓名 性别

生日 年龄 文化程度 联系电话 身份证号码

工龄

职称n”);

for(i=1;i<=CurrentCount;i++)

printf(“%4d %6s%3s%11s%3d%8s%12s%20s%3d%5sn”,i,member[i].xm,member[i].xb,member[i].sr,member[i].nl,member[i].whcd,member[i].lxdh,member[i].sfzh,member[i].gl,member[i].zc);

system(“pause”);} void save(){

FILE *fp;

fp=fopen(“ygjbxx.txt”,“w”);

if(fp==NULL)

printf(“n文件打开不成功,信息无法保存!!n”);

else

{

fprintf(fp,“%d”,CurrentCount);

for(int i=1;i<=CurrentCount;i++)

fprintf(fp,“n%8s%4s%16s%4d%14s%13s%20s%4d%18s”,member[i].xm,member[i].xb,member[i].sr,member[i].nl,member[i].whcd,member[i].lxdh,member[i].sfzh,member[i].gl,member[i].zc);

fclose(fp);

printf(“n信息已成功保存!!n”);

}

system(“pause”);} void read(){

FILE *fp;

fp=fopen(“ygjbxx.txt”,“r”);

if(fp==NULL)

printf(“n文件打开不成功,信息无法读取!!n”);

else

{

fscanf(fp,“%d”,&CurrentCount);

for(int i=1;i<=CurrentCount;i++)

{

fscanf(fp,“%s%s%s%d%s%s%s%d%s”,member[i].xm,member[i].xb,member[i].sr,&member[i].nl,member[i].whcd,member[i].lxdh,member[i].sfzh,&member[i].gl,member[i].zc);

printf(“姓名:%s 性别:%s 生日:%s 年龄:%d 文化程度: %s 联系电话: %s 身份证号码: %s 工龄: %d 职称: %sn”,member[i].xm,member[i].xb,member[i].sr,member[i].nl,member[i].whcd,member[i].lxdh,member[i].sfzh,member[i].gl,member[i].zc);

}

fclose(fp);

printf(“n信息已成功读取!!n”);

}

system(“pause”);} void search(){

char dcsfzh[19];

int sfjx=1,i;

while(sfjx!=0)

{

printf(“n请输入一个待查员工的身份证号码:”);

scanf(“%s”,dcsfzh);

strcpy(member[0].sfzh,dcsfzh);

i=CurrentCount;

while(strcmp(member[i].sfzh,dcsfzh)!=0)

i--;

if(i==0)

printf(“查无此人!!n”);

else

{

printf(“n此人详细信息如下:n”);

printf(“姓名:%s 性别:%s 生日:%s 年龄:%d 文化程度: %s 联系电话: %s 身份证号码: %s 工龄: %d 职称: %sn”,member[i].xm,member[i].xb,member[i].sr,member[i].nl,member[i].whcd,member[i].lxdh,member[i].sfzh,member[i].gl,member[i].zc);

}

printf(“n是否继续(0--结束,其它--继续):”);

scanf(“%d”,&sfjx);

}

system(“pause”);} void del(){

char dcsfzh[19];

int sfjx=1,i,j;

while(sfjx!=0)

{

printf(“n请输入一个待删员工的身份证号码:”);

scanf(“%s”,dcsfzh);

strcpy(member[0].sfzh,dcsfzh);

i=CurrentCount;

while(strcmp(member[i].sfzh,dcsfzh)!=0)

i--;

if(i==0)

printf(“查无此人!!n”);

else

{

printf(“n此人详细信息如下:n”);

printf(“姓名:%s 性别:%s 生日:%s 年龄:%d 文化程度: %s 联系电话: %s 身份证号码: %s 工龄: %d 职称: %sn”,member[i].xm,member[i].xb,member[i].sr,member[i].nl,member[i].whcd,member[i].lxdh,member[i].sfzh,member[i].gl,member[i].zc);

printf(“n按任意键开始删除......n”);

system(“pause”);

for(j=i+1;j<=CurrentCount;j++)

member[j-1]=member[j];

CurrentCount--;

printf(“n已成功删除......n”);

system(“pause”);

}

printf(“n是否继续(0--结束,其它--继续):”);

scanf(“%d”,&sfjx);

}

system(“pause”);} void modify(){

char dcsfzh[19];

int sfjx=1,i;

while(sfjx!=0)

{

printf(“n请输入一个待修改员工的身份证号码:”);

scanf(“%s”,dcsfzh);

strcpy(member[0].sfzh,dcsfzh);

i=CurrentCount;

while(strcmp(member[i].sfzh,dcsfzh)!=0)

i--;

if(i==0)

printf(“查无此人!!n”);

else

{

printf(“n此人详细信息如下:n”);

printf(“姓名:%s 性别:%s 生日:%s 年龄:%d 文化程度: %s 联系电话: %s 身份证号码: %s 工龄: %d 职称: %sn”,member[i].xm,member[i].xb,member[i].sr,member[i].nl,member[i].whcd,member[i].lxdh,member[i].sfzh,member[i].gl,member[i].zc);

printf(“n请输入新内容......n”);

printf(“n请输入人员相关信息(姓名 性别 生日 年龄 文化程度 联系电话 身份证号码 工龄 职称):”);

scanf(“%s%s%s%d%s%s%s%d%s”,member[CurrentCount].xm,member[CurrentCount].xb,member[CurrentCount].sr,&member[CurrentCount].nl,member[CurrentCount].whcd,member[CurrentCount].lxdh,member[CurrentCount].sfzh,&member[CurrentCount].gl,member[CurrentCount].zc);

printf(“n已成功修改......n”);

system(“pause”);

}

printf(“n是否继续(0--结束,其它--继续):”);

scanf(“%d”,&sfjx);

}

system(“pause”);} int check(){

int count=0,name,pass;

while(count<=2)

{

printf(“n请输入用户名及密码:”);

scanf(“%d%d”,&name,&pass);

count++;

if((name==1)&&(pass==1))

count=10;

else

if(count>2)

count=5;

}

if(count==10)

return 0;

else

return 1;} struct mem_gz {

float jbgz;float cql;float jj;float kk;float grsd;float sf;};struct mem_gz mem[N+1];void inputgz(){ char sfjx=1;CurrentCount=0;

while(sfjx!=0)

{

if(CurrentCount==N)

{

printf(“n工资已添加完毕,无法添加!!n”);

sfjx=0;

}

else

{

CurrentCount++;

printf(“请输入身份证号码为:%s的员工工资资料n”,member[CurrentCount].sfzh);

printf(“n请输入员工工资信息(基本工资 考勤 奖金 扣款 个人所得税):n”);

scanf(“%f%f%f%f%f”,&mem[CurrentCount].jbgz,&mem[CurrentCount].cql,&mem[CurrentCount].jj,&mem[CurrentCount].kk,&mem[CurrentCount].grsd);

mem[CurrentCount].sf=mem[CurrentCount].jbgz*mem[CurrentCount].cql+mem[CurrentCount].jj-mem[CurrentCount].kk-mem[CurrentCount].grsd;

}

printf(“n是否继续(0--结束,其它--继续):n”);

scanf(“%d”,&sfjx);

}

system(“pause”);} void savegz(){

FILE *fq;

fq=fopen(“yggzxx.txt”,“w”);

if(fq==NULL)

printf(“n文件打开不成功,信息无法保存!!n”);

else

{

fprintf(fq,“%d”,CurrentCount);

for(int i=1;i<=CurrentCount;i++)

fprintf(fq,“n%f %f %f %f %f %f”,mem[i].jbgz,mem[i].cql,mem[i].jj,mem[i].kk,mem[i].grsd,mem[i].sf);

fclose(fq);

printf(“n信息已成功保存!!n”);

}

system(“pause”);} void readgz(){

FILE *fq;

fq=fopen(“yggzxx.txt”,“r”);

if(fq==NULL)

printf(“n文件打开不成功,信息无法读取!!n”);

else

{

fscanf(fq,“%d”,&CurrentCount);

for(int i=1;i<=CurrentCount;i++)

{

fscanf(fq,“%f%f%f%f%f%f”,&mem[i].jbgz,&mem[i].cql,&mem[i].jj,&mem[i].kk,&mem[i].grsd,&mem[i].sf);

printf(“基本工资: %f 考勤: %f 奖金: %f 扣款: %f 个人所得税: %f 实发工资:%fn”,mem[i].jbgz,mem[i].cql,mem[i].jj,mem[i].kk,mem[i].grsd,mem[i].sf);

}

fclose(fq);

printf(“n信息已成功读取!!n”);

}

system(“pause”);} void searchgz(){

int dcbh;

int sfjx=1;

while(sfjx!=0)

{

printf(“n请输入一个待查员工编号(身份证号从小到大的顺序):”);

scanf(“%d”,&dcbh);

if(dcbh<1||dcbh>CurrentCount)

printf(“查无此人!!n”);

else

{

printf(“n此人工资信息如下:n”);

printf(“基本工资: %f 考勤: %f 奖金: %f 扣款: %f 个人所得税: %f 实发工资:%fn”,mem[dcbh].jbgz,mem[dcbh].cql,mem[dcbh].jj,mem[dcbh].kk,mem[dcbh].grsd,mem[dcbh].sf);

}

printf(“n是否继续(0--结束,其它--继续):”);

scanf(“%d”,&sfjx);

}

system(“pause”);} void delgz(){

int dcbh;

int sfjx=1,j;

while(sfjx!=0)

{

printf(“n请输入一个待删工资的编号:”);

scanf(“%d”,&dcbh);

if(dcbh<1||dcbh>CurrentCount)

printf(“查无此人!!n”);

else

{

printf(“n此人工资信息如下:n”);

printf(“基本工资: %f 考勤: %f 奖金: %f 扣款: %f 个人所得税: %f 实发工资:%fn”,mem[dcbh].jbgz,mem[dcbh].cql,mem[dcbh].jj,mem[dcbh].kk,mem[dcbh].grsd,mem[dcbh].sf);

printf(“n按任意键开始删除......n”);

system(“pause”);

for(j=dcbh+1;j<=CurrentCount;j++)

mem[j-1]=mem[j];

CurrentCount--;

printf(“n已成功删除......n”);

system(“pause”);

}

printf(“n是否继续(0--结束,其它--继续):”);

scanf(“%d”,&sfjx);

}

system(“pause”);} void modifygz(){

int dcbh;

int sfjx=1;

while(sfjx!=0)

{

printf(“n请输入一个待修改工资员工的编号:”);

scanf(“%d”,&dcbh);

if(dcbh<1||dcbh>CurrentCount)

printf(“查无此人!!n”);

else

{

printf(“n此人工资信息如下:n”);

printf(“基本工资: %f 考勤: %f 奖金: %f 扣款: %f 个人所得税: %f 实发工资:%fn”,mem[dcbh].jbgz,mem[dcbh].cql,mem[dcbh].jj,mem[dcbh].kk,mem[dcbh].grsd,mem[dcbh].sf);

printf(“n请输入新内容......n”);

printf(“n请输入人员工资信息(基本工资 考勤 奖金 扣款 个人所得税 实发工资):”);

scanf(“%f%f%f%f”,&mem[CurrentCount].jbgz,&mem[dcbh].cql,&mem[dcbh].jj,&mem[dcbh].kk,&mem[dcbh].grsd,&mem[dcbh].sf);

printf(“n已成功修改......n”);

system(“pause”);

}

printf(“n是否继续(0--结束,其它--继续):”);

scanf(“%d”,&sfjx);

}

system(“pause”);} void listgz(){ int i;

printf(“n

员工工资信息表n”);

printf(“ 序号 基本工资 考勤 奖金 扣款 个人所得税 实发工资n”);

for(i=1;i<=CurrentCount;i++)

printf(“%4d %8f%8f%8f%8f”,i,mem[i].jbgz,mem[i].cql,mem[i].jj,mem[i].kk,mem[i].grsd,mem[i].sf);

system(“pause”);}

void main(){

int xz=1;

printf(“

*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*n”);printf(“

*

欢迎使用人事工资管理系统

*n”);printf(“

***************************************nnn”);

if(check()!=0)

{

printf(“n你无权使用本系统......nn”);

system(“pause”);

}

else

{

while(xz!=0)

{

printf(“n请选择相应功能:n”);

printf(“1-录入n2-查询n3-修改n4-删除n5-保存n6-读取n7-输入员工工资n8-保存工资信息n9-读取工资信息n10-修改工资信息n11-删除工资信息n12-工资列表n0-结束n请输入选择:”);

scanf(“%d”,&xz);

switch(xz)

{

case 1:

input();break;

case 2:

search();break;

case 3:

modify();break;

case 4:

del();break;

case 5:

save();break;

case 6:

read();break;

case 7:

inputgz();break;

case 8:

savegz();break;

case 9:

readgz();break;

case 10:

modifygz();break;

case 11:

delgz();break;

case 12:

listgz();break;

case 0:

printf(“nn谢谢使用本系统!nn”);system(“pause”);break;

default:

printf(“n无此功能,请重新选择......n”);

system(“pause”);

}

}

代码生成系统 篇3

关键词:发那科;西门子;数控程序;格式对比

笔者公司多年来购买了许多种类的数控加工中心,最初主要以FANUC0i—MA系统为主,后来多为西门子840D系统,编程员就需要经常将原来的FANUC程序转换成西门子程序后再下发机床,经验较丰富的编程员可以很快地完成,但初次接触西门子系统的编程员经常将格式搞错,要么导致程序无法下发,要么加工中程序格式报警,下面笔者结合自己平时的编程经验,将两种系统放在一起,通过对比说明,以共同提高编程水平。

一、程序命名规则

FANUC:%O1234(WP1-CUXI)

……………

SIEMENS:%_N_WP1_CUXI_MPF

…………..

FANUC机床将“WP1-CUX I”读取为程序名,字符串间用“-”连接;西门子机床将“WP1_CUXI”读取为程序名,字符串间用“_”连接,“MPF”表示为主程序,若为“SPF”则自动放入子程序文件夹。此外,在任意程序段,需要书写字符串的地方都应遵循FANUC使用“-”、西门子使用“_”。

二、刀具长度与半径补偿

FANUC程序需使用“H1”对刀具T1进行长度补偿,使用“D1”对刀具T1进行半径补偿,H值与D值分别存储在OFFSET面板的长度补偿与半径补偿栏。而西门子程序只需在调用刀具后移动刀具前执行“D1”即可同时进行长度和半径补偿,西门子的“D1”表示的含义是“刀沿1”,其在OFFSET面板中对应了一组刀具长度和刀具半径,每把刀均拥有若干组刀具长度和刀具半径,即若干个“刀沿”D1~D9(840D有9个,810D、802D有3个),一般刀具都使用各自的D1即可。需要特别指出的是,840D每个刀沿包含3个长度补偿值,通常“长度补偿1”保存当前加工平面(由G17、G18、G19决定)对应刀具轴的铣刀长度补偿值,不同刀具种类3个长度补偿值含义不同。

三、程序段注释符号与选择性跳段

FANUC程序段注释格式为“(注释内容)”,西门子程序段注释格式为“;注释内容”,两者均可放置在程序行任意位置,注释内容不以数控代码执行。程序段选择性跳跃标识符均为“/”,当面板上选择性跳跃按键激活,当前程序段“/”后面的程序段不执行。

四、圆弧插补

FANUC程序走圆弧示例“G02X10Y20R-5”,西门子用“CR=”代替“R”,就变为“G02X10Y20CR=-5”。

走整圆(圆弧通用)程序格式相同,均可使用“G02/G03 X..Y..Z..I..J..K..”,通过赋值I 、J 、K ,表达圆心相对起点的相对坐标值, 确定圆心位置。此外, 西门子提供了另一种确定圆心位置的表达方法“G02/G03 X..Y..Z..I=A C(..)J=A C(..)K=A C(..)”,A C(..)可以表示圆心的绝对坐标值。当然,此赋值方法也可使用在别的字段上,例如:“G01X=A C(..)Y=A C(..)”,若当前为“G91”表示相对坐标状态,则可通过“=A C(..)”暂时赋值绝对坐标值;相反,若当前为“G90”表示绝对坐标状态,则可通过“=I C(..)”暂时赋值相对坐标值,我们可以根据已知条件选择合适的赋值格式,提高编程效率。

五、螺旋插补

FANUC螺旋线程序示例“G17G03X10Y0Z2I-10”,机床会在X Y 平面走圆弧的同时再同步运行Z 轴,执行出一条不超过360°的螺旋线;西门子相应示例为“G17G03X10Y0Z2I-10J0T U R N=0”,其中“T U RN=0”表示此段螺旋线无整圆部分,即不超过360°,通过改变字符串“T U R N”的赋值,可以控制螺旋线整圆数量。

六、固定循环

FANUC钻孔循环使用ISO标准的G代码,西门子钻孔循环使用自家的CYCLE循环,固定循环执行步骤与参数含义大同小异,这里就不细讲,我们主要讨论一下循环的模态调用问题。FANUC的钻孔循环默认为模态调用,而西门子的CYCLE循环默认只执行一次,必须使用“MCALL”封装CYCLE循环及其点位,才能实现模态调用,例如:

N10 MCALL CYCLE81(RTP,RFP,SDIS,DP)

N15 X10 Y20 ;第一个点位

N20 X30 Y40 ;第二个点位

N25 MCALL ;撤销模态调用

七、倒角、倒圆

FANUC程序若在直线圆弧的拐角处插入倒角的话,可以在拐角点之前程序末尾加上“, C…”,若倒圆则加上“,R…”;西门子对应上述指令,倒角为“CHR=”,倒圆为“RND=”。另外西门子在倒角时还可给定其本身的直线长度进行倒角“CHF=”。

八、宏程序

FANUC程序中局部变量用“#n”(1≤n≤3 3)表示,西门子程序中局部变量用“Rn”(默认0≤n≤99)。FANUC程序若给字段赋值直接在字段后跟变量,例如:“G01X #1Y#2Z#3”;而西门子程序必须使用赋值符号“=”,例如:“G01X=R1 Y=R2 Z=R3”。FANUC程序中表达式封装使用“[ ]”,如:“#1=SIN[[#2+#3]*#4]”,而西门子程序表达式封装用“( )”,上面范例就变为:

“R1 = SIN ( ( R2 + R3 ) * R4 )”。FANUC程序的跳转语句为“GOTO”,而西门子除了“GOTO”,还可使用“GOTOB”与“GOTOF”。“GOTO”的含义两者都一样:先朝程序结束方向搜索,再跳转到程序开始处继续搜索;而使用“GOTO B”可直接控制向“程序开始方向”搜索,“GOTOF”直接控制向“程序结束方向”搜索。FANUC程序中跳转目标直接用程序段号表示:“GOTO123”表示跳转至“N123”处,西门子程序的跳转目标可以用程序段号表示:“GOTO N123”,也可以用字符串所标记位置,例如:“GOTOLB1”意为跳转到字符串“L B1”标记处“L B1:……….”。这里必须指明西门子字符串的命名规则:名称前两位必须是字母或者“_”,以示其与普通字段的区别,例如:“X1”的含义变为了加工轴X 1,不能作为字符串名称。另外需要注意的格式问题是,FANUC程序条件判断语句中的条件需要用“[ ]”封装;西门子程序中需要用空格隔开,例如:

FANUC:IF[#4>0]GOTO1

西门子: IF R4>0 GOTOB LB1

九、轨迹控制

注:单方向精确定位,适合钻孔时消除反向间隙。

FANUC机床默认为G64,西门子机床默认为G60。要想得到准确的尖角,必须在准停状态走刀;想提高加工效率,不需要精确的尖角,则可取消准停,机床在拐角处不减速,从而提高表面加工质量。对于西门子机床,若使用较多点位模拟加工曲线或曲面,则适合在G64状态下加工,同时配合使用加速度控制指令SOFT(恒定加速度方式),消除点位间停顿,减小冲击,得到较好表面质量,如表所示。

十、进给控制

FANUC程序中G62开启内拐角自动倍率功能,但需在相应机床参数中设置相关值;而西门子机床有较为完善的拐角进给控制指令:CFTCP、CFC、CFIN。CFTCP:刀具中心点按给定F值进给;CFC:走内R 减速,走外R 加速,保持刀具外廓(即刀具与工件接触点)按给定F 值进给;CFIN:走内R 减速,走外R 时刀具中心点按给定F 值进给。因西门子默认为CFC模式,所以当使用大直径刀具加工外R 时,F 值加速会比较明显,编程时应考虑此因素,如有必要则应执行CFTCP或CFIN命令。

十一、结语

经以上对比,虽未涵盖两数控系统所有类型指令,但却是实际应用中最应该注意和掌握的。虽然西门子提供了ISO代码执行模式(G291),但很多特色功能代码还是必须在西门子模式(G290,默认状态)下才能执行。

参考文献

[1] 廖效果,朱启逑. 数字控制机床[M]. 武昌:华中科技大学出版社,1992.

密钥生成与管理系统 篇4

随着全球信息化的飞速发展, 各种信息化系统已经成为国家或企业的关键基础设施, 它已经成为衡量一个国家或企业综合实力的标志之一。同样在我们的日常生活中, 网络应用已经成为人们谈论当中最令人兴奋的一个话题, 人们己经不仅仅满足于通过浏览器读读新闻, 而是开始进行在线购物、在线银行、在线贸易等活动。但是目前的网络存在不安全的因素, 给许多外部攻击者提供了便利的条件。因此, 信息安全已成为急待解决的涉及国家全局和长远利益的关键问题之一。

目前, 密码技术的发展给信息安全提供了许多很好的解决方案。特别是PKI (Public Key Infrastructure) 技术和PMI (Privilege Management Infrastructure) 技术的发展和应用, 能够全面地满足网络用户的认证、不可否认、加/解密、授权服务和审计服务等方面的需求。

1密钥管理

1.1密钥管理概述

现代信息系统中采用密码技术对信息进行保密, 其安全性实际取决于对密钥安全保护。只要密钥没有被泄露, 保密的信息仍是安全的;一旦密钥丢失或出错, 不但合法用户无法得到需要使用的信息, 而且非法用户可能会窃取信息。因此, 密钥管理成为信息安全系统中的一个关键问题。密钥的管理不仅影响系统的安全性, 而且涉及到系统的可靠性、有效性和经济性。

密钥管理包括处理密钥自产生到最终销毁的整个过程的所有问题, 其中密钥的分配和存储是最大的难题。具体的密钥管理包括:

(1) 产生与所要求安全级别相称的合适密钥;

(2) 根据访问控制的要求, 决定每个密钥应该由哪个实体接受密钥拷贝;

(3) 用可靠办法使这些密钥对开放系统中的实体是可用的, 即安全地将这些密钥分配给用户;

(4) 某些密钥管理功能将在网络应用实现环境之外执行, 包括用可靠的手段对密钥进行物理的分配。

1.2密钥管理的内容

1.2.1 密钥的生成

在密钥生成时一般需要考虑随机性、密钥强度和密钥空间。一个合适的密钥不仅有利于信息的保密, 而且使得攻击者难以破解。目前密钥生成技术实现了生成的自动化, 不仅减轻了人工制造密钥的工作负担, 而且消除了人为差错引起的泄露。

通过主机本身安装软件、规定的协议标准等软件手段, 产生密钥或者密钥所需的随机数。分组密码和公钥密码等一般采用此类方式生成密钥。ANSIX 9.17标准是软件技术产生密钥的一种方法。

1.2.2 密钥的分配

密钥分配是密钥管理系统中最为复杂的问题, 其分配方式根据不同用户的要求、网络规模的大小、拓扑结构的差异、通信方式的不同以及采取何种密码体制等等因素, 又有不同的解决方案。总体来说, 密钥分配可以分为三类:人工密钥分发、基于中心的密钥分发和基于认证的密钥分发。

1.2.3 密钥的更换

如果超过了密钥使用的有效期, 那么就应该立即更换密钥。更换时, 必须清除原有密钥的存储区或重写。更换密钥应该按新密钥生效后, 旧密钥才废除的原则进行。应检查更换的密钥是否有错, 存储位置是否正确, 以便能够及时发现人为的错误和防止敌对势力的破坏。

1.2.4 密钥的吊销

不同的密钥寿命不同, 有些密钥不需要对它进行吊销。例如会话密钥由于本身的特性使用完后自动就会被删除;或者一些密钥的有效期到期后系统不再对过期密钥有任何反应, 即使攻击者得到创门也没有任何用途。但是当发生密钥丢失或者被攻击时, 密钥的吊销是必需的。

1.2.5 密钥的分类管理

密钥的种类繁杂, 不同的情况有不同的分类。比如, 按照密钥使用的层次可将其分为:基本密钥、会话密钥、密钥加密密钥和主机主密钥;按照用途可分为工作密钥、消息密钥和结构密钥等等。不过按照密码算法, 我们可以简单的将密钥分为:对称密钥和非对称密钥。

(1) 对称密钥的管理

对于对称密钥有关密钥管理要考虑的要点包括, 使用密钥管理协议中的机密性服务来传送密钥;分解责任, 使得没有一个人具有重要密钥的完全拷贝;多层型的密钥体系;加密密钥的密钥决不应该用来保护数据, 而加密数据的密钥也决不应该成为保护加密密钥的密钥。

(2) 非对称密钥的管理

公开密钥密码体制所产生的密钥我们称为非对称密钥。主要是针对对称密钥管理十分困难所提出的。它是由两个密钥组成:公钥和私钥。公钥可以公开自由的分发, 不需要进行保密措施;私钥只能是用户专有, 必须妥善保管。公钥和私钥是成对的, 通过公钥加密的信息只有配对的私钥才能解密, 反之亦然。在实际应用中, 用户的组织往往是一种等级体制, 即按其安全等级分成等级组。上级用户可以得到下级用户的加密信息, 反之不一定成立[1]。

2系统设计

2.1密钥生成的算法设计

要构造RSA加解密算法中的公钥和私钥, 必须首先构造两个大素数。RSA加解密算法的安全性与所使用的大素数有密切关系[2]。

2.1.1 RSA密钥生成算法

(1) 确定密钥的宽度。

(2) 随机选择两个不同的素数p处q, 它们的宽度是密钥宽度的二分之一。

(3) 计算出p和q的乘积n。

(4) 在2和Φ (n) 之间随机选择一个数e, e必须和Φ (n) 互素, 整数e用做加密密钥 (其中Φ (n) = (p-1) * (q-1) ) 。

(5) 从公式ed≡1 mod Φ (n) 中求出解密密钥d。

(6) 得公钥 (e, n) , 私钥 (d, n) 。

(7) 公开公钥, 但不公开私钥。

2.1.2 随机生成素数

素数的判定:著名的费马小定理为素数判定提供了一个有力的工具。

定理1:费马小定理:如果p是一个素数, 且0

利用费马小定理, 对于给定的整数n, 可以设计素数判定算法, 通过计算d=2n-1mod n来判定整数的素性。当d≠1时, n肯定不是素数;当d=1时, n很可能是素数。但也存在合数n使得2n-1≡1 (mod n) 。例如, 满足此条件的最小合数是n=341。为了提高测试的准确性, 可以随机的选取整数1

费马小定理毕竟只是素数判定的一个必要条件。满足费马小定理的整数n未必全是素数。有些合数也满足费马小定理的条件, 这些合数被称为Carmichael数, 利用二次探测定理可以对素数判定算法做进一步的改进, 以避免将Carmichael数作为素数。

定理2:二次探测定理:如果p是一个素数, 且0

由此可知, (x-1) (x+1) ≡0 (mod p) 故p必须整除x-1或x+1。由p是素数且0

通过对上面两个定理的理解可以看出素数判断主要依靠费马小定理, 二次探测定理是对费马小定理的重要补充以实现素数判定的准确性。

根据以上的两个定理, 可以得出下面用于计算apmod n的power算法, 并在计算过程中实施对n的二次探测。

2.2密钥管理系统的数据库设计

2.2.1 具体表各个字段的设计

字段 (field) :标记实体属性的命名单位称为字段或数据项。它是可以命名的最小信息单位, 所以又称为数据元素或初等项。字段的命名往往和属性相同, 如:学生有学号、姓名、年龄、性别等字段。

实体 (entity) :是指客观存在可以相互区别的事物。实体可以是具体的对象。

属性 (attribute) :实体有很多特性, 每一个特性称为属性。每个属性有一个值域, 其类型可以是整数型、实数型、字符串型。

记录 (record) :字段的有序集合称为记录。一般用一个记录描述一个实体, 所以记录又可以定义为能完整地描述一个实体的字段集。

下面是部分表的设计:

表users用于存储能够访问系统的用户, 其具体设计如表1所示。

表keys用于存储生成的密钥, 其具体设计如表2所示。

3系统实现

3.1密钥管理系统软件的主要源码

ADOConn.cpp文件定义了与数据库相连接以及操纵数据库的函数。

4结论

本系统利用费马小定理、二次探测定理实现了密钥的安全生成, 大大地提高了用户密钥的安全可靠程度;并利用数据库系统编程实现了密钥的分配、更换、吊销等过程, 避免人为因素带来的安全威胁, 解决了用户在使用网络时经常会遇到的安全威胁问题, 有效地对用户信息进行保护, 防止关键信息的泄露及其它更严重的损失。相信今后随着安全技术的不断发展, 密钥生成及管理软件将会不断完善、不断改进, 成为网络安全的一个重要的技术保障。

参考文献

[1]蒙杨, 卿斯汉.等级加密体制中的密钥管理研究[J].软件学报, 2001, 12 (8) :1147-1153.

代码生成系统 篇5

“ALSR不仅是VistaBeta的新特性,也将成为Vista的标准功能之一。我们采用ASLR技术的时间颇晚,但是我们决定从Beta开始启用这一开源技术,同时我们也可以进一步检验该技术的实际性能,

”微软安全程序经理MichaelHoward表示。

不过,Howard也表示,ASLR并非解决不安全代码问题的万能药,但是如果和其他安全技术共同使用,无疑能构成防御恶意软件攻击的“有效屏障”。

ASLR可以在内存中随机保存系统代码,而非以前的固定内存段方式,这样就避免了特定类型恶意软禁搜索特定段系统代码进行攻击的行为。

代码生成系统 篇6

关键词:三维全景;虚拟校园漫游;生成和运用;研究分析

l 三维全景的含义和用途

三维全景全称为三维全景漫游技术,其核心正是三维全景图像。通过利用拍摄设备所获得的多张360度和180度的照片,拼接为一张图像,从而构成一个全景空间。与传统的二维场景相比,其具有多个优点:一是真实感强。二是互动性强。观众可以凭借自己的喜好进行随意操作。三是文件体积小,方便传输,对丁硬件的要求也不是太高。对丁学校来说,近年来,虚拟校园漫游系统的开发和运用就被提上了日程。而整个系统的构建的关键和基础,则是三维全景的牛成,其能够将众多360度拍摄的照片组合成为一个全景图像,然后再通过一些软件和插件,在计算机、于机等媒体上予以真实的还原。而且观看者还可以根据自己的喜好,进行上下左右、前后远近的调整,获得一种身临其境之感。所以从这个角度来说,没有三维全景,也就没有虚拟校同漫游系统的牛成,发挥着关键的基础性作用。

2 虚拟校园漫游系统中三维全景的生成和运用

2.1 图像采集

图像是三维全景牛成的原始素材,一般来说,图像的获得包含两种形式。第一种是运用全景相机拍摄。全景相机可以直接获得全景图像,免去了后续制作的麻烦,但是其弊端也是显而易见的,即全景相机本身是十分昂贵的,拍摄成本较高,所以一般很少使用。第二种是采用普通相机拍摄。可以将普通的照相机或摄像机架设在一个可以水平选装的支架上,然后进行转动拍摄。所拍摄出来的照片是有一定重合部分的,所以需要在电脑上利用软件进行拼接处理。因为普通照相机和摄像机的价格相对低廉,所以这也是当下主流的图像采集方式。例如,可以运用多个鱼眼镜头,分别拍摄建筑物、雕塑等立方体上下左右前后的六个面,然后再将安装了鱼眼镜头的相机同定在支架上,进行背景的拍摄,每旋转90度拍一张。之所以采用这方式,是因为180度的鱼眼镜头拍摄出的照片没有重叠区域,很容易让后期的拼接处理出现偏差,而每隔90度拍摄一张,就可以将其和鱼眼拍摄照片进行比对,更加方便与后期的制作。在获得了带有重叠区域的图像素材之后,因为每一幅图片坐标不同,所以为了获得统一化的效果,必须将其统一到同一个坐标体系中。对此通常采用球面投影和柱面投影的方式。球面投影是将多幅图像拼接投射到一个球面上,获得图像像素点在空间中的方位信息。其对于图像素材本身并没有什么特殊的要求,所以是一种广为采用的方式。柱式投影可以视为是球面投影的变形,其将准备拼接的图像投射在一个网柱体上,与球面投影相比,其在获得空间方位信息的同时,还能够快速地去除重复的信息。经过上述处理后,整个三维全景图的骨架也就搭设完毕了。

2.2 图像拼接

因为全景照相机的价格较为昂贵,所以在图像采集过程中,还是多采用普通相机拍摄加后期拼接处理的方式为主。其根本原理是将众多图像汇集在一起,然后删除掉其重叠部分,使之成为了一个新的整体。其中的关键就在丁重叠位置和区域的查找。如果查找的不准确,就会出现重复表现和遗漏表现的结果,也就难以称为是全景图了。且因为在具体的拍摄过程中,受到硬件本身和具体环境的影响,使得最终的图片效果还以做到百分百精确,经常出现一些平移、扭曲、变形、色彩等情况,这也再一次凸显出了图像拼接的重要性。一般来说,图像拼接包含两种方式,即区域拼接和特征拼接。区域拼接是对面面灰度信息的运用,以此来作为特征和区分,但是涉及层面众多。特征拼接则是针对图像的点、线、面、轮廓等特征进行匹配,因为是一种点对点的处理,所以运算量较小,也是当下一种主流的处理方式。在具体拼接方法上,第一种是帧到帧的合成。又被称为是静态图像拼接技术。其能够以批量的形式将所有的图像变换为同一个坐标体系,然后利用不同的时空滤波器进行拼接。既可以是自动获得,也可由设计者于动选择。第二种是帧到图像合成。鉴丁帧到帧的组合很容易小现累积误差,所以一些设计者对帧到图像的方式进行了尝试,也就是动态拼接技术,其将图像帧和拼接图像放置到同一个坐标体系内进行处理,既减少了累积误差的出现,而且在一些运动场景的表现时,往往有着更加出色的效果。第三种是拼接图像到帧的合成。其可以视为是帧到图像合成的反运用。是以帧图像的坐标体系为标准,让拼接图像与之相配准,所以也更加适用丁一些视频传输和动态图像拼接。第四种是拼接图像到拼接图像的合成。还是为了避免帧图像所出现的误差,所以设计者们探索出了拼接图像到拼接图像的合成,其将图像按照一定的特点和规则进行分段,先形成子图像,然后再将子图像进行组合,可谓是一种误差小且方便快捷的方式。当所有的全景地图制作完毕之后,则要进一步将其转换为Flash格式,对此Pan02vr是一个十分得力的T具,可以将全部素材都输入到该软件中,然后选择球面或柱式投影,最终牛成高质量的Flash。

2.3漫游发布

制作三维全景的最终日的是整个漫游系统的牛成,所以要将主要景点、建筑物、硬件设施等组合成单个节点的三维全景图,以实现单个场景的交互式漫游。其优势在丁能够全面、快速而流畅的实现自动和于动漫游控制。而制作方也可以将整个系统整合在一个网页下,放置在校同网站中,再辅以百度地图等工具,实现从宏观到局部的全面展示。最后,为了获得更好的使用感受,也需要定期对整个系统的界面进行优化,以达到互动性强、特色鲜明的日的。具体来说,系统的整体风格是要与学校整体形象相一致,比如校同建筑物的色彩、学校一些宣传材料中常用到的图案和背景等,使浏览者不看名字,就能够凭借印象和感觉知道这是哪一所学校,使学校的特色得到最大化的彰显。除此之外,也应该在整个系统中适当加入一些音乐和音效。一些优美的轻音乐能够增强浏览者的身临其境之感,从单纯的视觉感受变为了视听合一。而一些音效的加入,如转入下一节点时发出的美妙声响等,则能够让人感受到一种人性化关怀。

人脸面部表情自动生成系统 篇7

1 人脸三维建模

采用3DMAX三维建模工具建立人脸模型, 在VC++条件下使用Open GL编程完成了3DMAX模型的读取与重现, 再用Open GL对其进行控制。对于三维建模工具数据量较大的情况, 采用细节层次 (Level Of Details) 算法进行简化, 删除不必要的边、线、面[1]。

1.1 3DMAX数据文件的存储格式与读取

3DMAX默认的数据文件是*.max文件[2]。*.max文件结构复杂, 数据量庞大, 不仅包括模型网格结构的点和面的信息, 还包括模型的颜色等, 读取比较困难。比较简单直观的文件存储格式是*.ASC。

1.2 在Open GL中读取3DMAX模型

在Open GL中建立自己的数据结构存储数据, 从模型中读取数据将其存储到Open GL的程序中, 建立起Open GL的显示列表[3]。

1.3 关于简化网格算法

通过1.2得到的模型数据量是非常大的, 不适合用作标准模型。要将这一模型进行简化, 去除一些多余的点、边、面, 以简化这一模型的网格数量。这里使用层次细节 (Level Of Details, 缩写为LOD) 简化技术[4]。这一技术通过动态地确定阀值来选取不同精度的LOD模型, 降低场景的复杂度, 以求得更合适的图像质量。

1.4 人脸特征的提取

特征可被视为由数据、规则方法和关系三类属性描述的面向几何的物体, 特征参数化的关键是特征及其相关尺寸的变量化描述[5,6,7]。在具体特征分类的基础上, 确定结构特征的特征点, 特征点的相互位置关系形成造型特征中的特征尺寸。修改特征尺寸的同时, 对结构特征的其它点的位置和局部几何形状也进行了改变。根据人体头部的器官组成和外形特点, 从建模的方便出发, 将头特征分类为结构特征和造型特征。结构特征包含眼、鼻、嘴和耳;相应的造型特征有头高、头围、眼宽、眼高、两眼距、鼻宽、鼻高、鼻长、嘴宽、上下嘴唇厚、耳长、耳宽、耳厚等, 头特征分类。我们在正面和侧面图像中定义了45个特征点来表征人脸的形状。手工设置特征点, 然后进行参数化, 得到了标准化的人脸模型。

2 面部表情合成

采用MPEG-4的参数变化进行面部表情的合成, 面部表情的分析与合成的研究主要集中于基本的情感, 包括悲伤、愤怒、喜悦、恐惧、厌恶和惊奇。MPEG-4标准表示了一种关于面部表情建模和表达潜在的情绪的方法。利用在MPEG-4框架里以面部动画为目的的面部动画参数是与运动单元 (AUS) 密切相关的[8,9]。运动单元包括核心的面部动作编码系统 (FACS) [10,11,12]。

2.1 通过特定的FAPs描述基本表情

为了做到这一点, 我们对面部肌肉运动进行翻译——通过肌肉运动来描述表情——FAPs, 并为每个基本表情创建一个FAPs词汇[13]。为描述基本表情所需的FAPs还通过分析基本数据集进行实验验证。为了与真实的表情序列进行比较, 我们定义了特定功能点对应的面部表情形式的FAPs。选定的FAPs可以通过实时图像或视频序列自动检测。派生模型也可以作为表情分析和表情综合学科之间的桥梁。

在一般情况下, 面部表情和情绪通过一套测量和转换加以描述。测量和转换可以考虑基于MPEG-4标准。在这种方式中, 我们可以描述一个人的解剖面, 基本上是通过FAPS以及动画参数, 组独特的标记, 消除指定的需要底层的几何拓扑结构[8]。这些符号则可以被映射到自动检测的测量和对视频序列的运动迹象, 因而通过人工合成近似真实的表情。

基本的面部表情和潜在的情绪, 通过FAPs描述有以下几个目的:

1) 提供合成序列的兼容性, 创建与使用建议的方法, 符合MPEG-4标准;

2) 基本的表情很少发生, 大多数情况下, 情绪通过特别FAPs直接相关的几个离散五官的变化加以表示。此外, 不同的FAPs可以被用在人机交互的多种语言环境中, 即通过面部表情进行交互。

3) FAPs不符合具体型号或拓扑结构, 合成表情可以由不同的动画模型或字符加以描述。

基本表情建模时, 应解决两个基本问题:

1) 估计形成该表情的FAPs;

2) 定义FAP的强度。

面部动作编码系统 (FACS) 很大程度上影响表情分析的研究。利用面部解剖学的知识, FACS是一个试图区分视觉分辨的面部动作的系统。FACS使用运动单元 (AU) 为计量单位。AU能够结合两块肌肉运动或反向的方式工作, 也就是分成几个肌肉的运动。

2.2 所涉及的FAPs在每个模型中表达的估计范围的表情

这是通过分析实时图像和视频序列得以实现的。

情感分析和综合系统中的一个重要问题是关于面部表情形成的FAPs变化范围[8]。从合成的角度来看, 关于FAP的范围定义的研究已经展开。然而, 所提出的变化范围是相当松散的, 不能用于分析。为了给关于FAP的的实时视频序列一个特定的变化范围, 我们分析了2个著名的数据集——埃克曼 (静态) 的以及Media Lab (动态) 的数据集。这两个数据集套设置了用于形成极端情况下的表情, 而不是通常的情况。然而, 它们可用于设置特定表情的FAPs。然而, 为了实现这一目标, 通过面部运动点的FAPs建模是必需的。实时图像和视频序列的FAP变化范围的分析主要用于两个目的:

1) 核实并定义每个基本表情的词汇;

2) 为基本表情定义配置文件。

2.3 中级表情模型

这是通过结合加以实现的, 在一个以规则为基础的系统和一个激活参数与基本表情描述的FAPs框架。

在本节中我们提出一种创建中级表情配置的方法, 用于描述相应情绪的视觉部分。由计算机科学家和工程师进行的处理除了基本情绪外的其他情绪的研究渗透到了其他的学科。心理学家研究了更为广泛的情绪集合, 但对于计算机图形学和机器视觉领域只有非常少结论可供借鉴。其中Whissel的一项研究[8]中提到, 情绪好比是空间中具有一定规模的点, 其中最接近的有两个值:激活和程度。激活是与术语相关的兴奋程度。如平静为中指示的中间点, 惊讶代表高度激活, 害羞代表低度激活。程度是与术语相关的愉悦程度, 例如羞怯的“动机”列代表负向, 而高兴代表正向。从实际的角度来看, 似乎程度要表达的主题和估计得到的情感能够一致是件很棘手的事。另一方面激活与面部肌肉的运动相关, 并可以基于面部特征很容易估计到。

为创建中级情绪配置我们要考虑两种情况:

1) 在自然界中, 情绪与其中一个原型类似, 例如, 他们可能会有不同肌肉强度的动作;

2) 不能被视为与任何原型的情绪。

在这两种情况下, 我们按照以下步骤进行:

1) 利用激活参数或Plutchik的角度测量作为推理有关的几个情绪的面部动作的强度的知识。这方面的知识与基本表情配置相结合, 通过基于规则的系统, 创建中级情绪配置。

2) 动画绘制配置以检测所要求的情绪与视觉的相似性是否合适。

3 程序用户界面

采用MFC技术设计一个包含悲伤、愤怒、喜悦、恐惧、厌恶和惊奇六种表情的按钮以及一个表情显示框的界面。我们采用GUI的设计模式, 把表情变化的代码对应转换成C++形式, 并嵌入在MFC中, 在对应的按钮按下时候能产生相应的消息响应。

3.1 界面设计

首先建立一个MFC应用程序的工程, 利用插件画出基本的界面图形, 包含悲伤、愤怒、喜悦、恐惧、厌恶和惊奇六种表情的按钮以及一个表情显示框并设置相应的属性[14,15]。

3.2 消息及消息映射

Windows应用程序中的消息主要有三种类型。

1) 窗口消息 (Windows Message) 。这类消息主要是指由WM_开头的除WM_COMMAND之外的消息, 例如WM_CREATE (窗口对象创建时产生) 、WM_DESTROY (窗口对象清除前发生) 、WM_PAINT (窗口更新时产生绘制消息) 等, 一般由窗口类和视图类对象来处理。

2) 控件的通知消息 (Control notifications) 。当控件的状态发生改变 (例如, 用户在控件中进行输入) 时, 控件就会向其父窗口发送WM_COMMAND通知消息。应用程序框架处理控件消息的方法和窗口消息相同, 但按钮的BN_CLICKED通知消息除外, 它的处理方法与命令消息相同。

3) 命令消息 (Command message) 。命令消息主要包括由用户交互对象 (菜单、工具条的按钮、快捷键等) 发送的WM_COMMAND通知消息。

命令消息的处理方式与其他两种消息不同, 它能够被多种对象接收和处理, 这些对象包括文档类、文档模板类、应用程序本身以及窗口和视类等;而窗口消息和控件的通知消息是由窗口对象接收并处理的, 这里的窗口对象是指从窗口类CWnd中派生的类的对象, 它包括CFrame Wnd、CMDIFrame Wnd、CMDIChild Wnd、CView、CDialog以及从这些派生类对象等。

4 结束语

浅谈辅助生成竣工图系统 篇8

1 系统功能

辅助生成竣工图系统采用插件式方式加载DLL。可根据需要, 将所需功能的动态库放置安装目录下, 系统就会自动加载功能菜单, 不需要使用移除相应动态库。

1.1 配置模块功能

主要分为连接配置和出图配置, 连接配置提供设置出图系统所使用的数据库的连接信息, 包括Oracle连接和SDE连接两种, 其中SDE连接所用的用户名和表空间与Oracle连接一致。出图配置主要提供对管道出竣工图进行相关选项配置, 包括图面各个要素显示位置、要素颜色、标注字体、块的使用、图纸范围、坐标投影、存放路径、文件压缩、DEM、DLG、DOM、FME文件的位置以及基础数据切割方式等信息, 以及出图系统各个功能得以按照用户自定义方式执行的选项配置功能。

1.2 管道层级结构

管道层级结构模块, 主要提供对管道、站场的增、删、改操作, 对管道上下级关系、站列顺序的修改变更功能。

1.3 数据处理模块

数据处理模块, 主要提供对用户填报上来的数据进行坐标与里程相互转换、中线密集度抽稀、数据导入导出等一系列针对数据本身的操作的功能。

1.4 出图模块

出图模块是出图系统的核心功能, 主要提供管道竣工图的出图功能, 包括起始、终止里程固定的普通图纸和起始、结束里程任意的单出图图纸。

1.5 辅助工具模块

辅助工具模块, 主要提供给用户在进行出图业务操作时, 使用的必要的辅助工具, 包括中线控制点角度计算、坐标里程的相互转换、生成分段中线、矩形框、切割DOM和DLG的功能。

2 系统应用

2.1 该系统的应用打破了以往手工绘图的方式, 实现系统自动出竣工图, 避免了因施工单位、设计单位独立编制竣工图存在不足, 给参建各方协同作战提供了一个安全、平稳的平台, 为编制高质量的竣工图打下坚实的基础。

2.2 系统出具的竣工图信息涵盖量更加丰富、准确、全面, 系统通过施工单位直接提交的管道专业竣工数据, 依据线性参考性确立各要素 (如焊口、里程桩) 的线性关系, 既能保证基础数据信息的现势性, 又能更直观的表现竣工后管道沿线地区的地形地貌。

2.3 竣工数据是经过复测后的数据, 也是系统提取出来的数据, 因此有效的减少了仪器和测量条件造成的偏差, 同时也纠正了一些人为造成的错误数据。

2.4 系统出图过程中不需要用户人工干预, 一切配置均在出图前配置好, 包括字体, 线型颜色等等。

2.5 系统出图过程中的错误保存在日志文件当中, 以备查出出错原因。

2.6 系统总体采用插件式构架方式, 各个业务模块耦合度低, 可根据需要组合使用, 极大的提高了管道建设阶段的管理水平, 相对节省了人力、时间等成本, 具有可扩展性强、升级方便、出图效率高等优点。

2.7 用竣工数据出具的电子版竣工图存档后, 有效解决了纸质竣工图存档查找困难的难题。

2.8 系统出具的竣工图真实地反映管道设计与施工过程中产生的变更, 有效避免以往使用大量人力资源进行手工绘图过程中产生的错误, 同时为后期运营提供了数字化成果, 提高查询检索效率。

3 结论

3.1 辅助生成竣工图系统, 实现了系统自动出图, 节约手动出图所耗费的设计单位、施工单位人力物力投入。

3.2 改善基础数据准确性, 真实反映管道中线所经地区的近期情况, 为后期运营维护节约基础数据与专业数据更新成本。

3.3 电子版竣工图的存档, 更能满足业主监管需求, 提高调取竣工图纸效率, 为运营维护人员查找和利用竣工图节约时间。

LTE系统密钥生成算法研究 篇9

3GPP长期演进(LTE)代表了UMTS标准的最新发展方向。相比UMTS,LTE系统通过分层的密钥构架实现接入层与非接入层密钥的分离,强制实行基于密钥的数据加密保护、信令加密与完整性保护,以增强系统的安全性能[1]。在LTE系统中,所有保密措施所需要的密钥均由基于单向散列函数的密钥生成算法产生[2],并采用单向散列函数SHA-256作为其核心算法[2],该算法必须具备单向散列函数的所有安全特性,以保证系统足够的安全性能。

重点实现了SHA-256算法的C程序设计,并在Visual C++环境下进行仿真测试,通过测试结果分析了SHA-256算法的单向散列函数特性。

1 单向散列函数的特性

单向散列函数可以把任意长的输入消息串转换成固定长度的输出串,且对于任意输入数x,可以轻易地得到函数值f(x),但其逆运算的实现却非常困难,因此具有较理想的安全性能。理想单向散列函数具有以下特征[3]:

1)单向性:从预映射能够简单迅速得到散列值,而其逆运算在计算上是不可行的。即:H(x)=h;H(h)-1=x不可行。

2)抗冲突性:在统计上无法产生2个散列值相同的预映射。即:对已给定的数值:x≠y→H(x)=H(y)不可行;对已给定的一对数值:(x,y)→H(x)=H(y)不可行。

3)分布均匀性:散列结果中为0的bit和为1的bi总数应该大致相等。输入中一个bit的变化尽量均匀地反映到输出的每一个bit上去;输出中的每一个bit,都是输入中尽可能多bit的信息起作用的结果。

2 SHA-256算法程序设计[4]

SHA-256算法要求输入数据流D长度不超过264 bit。首先,对输入数据流D根据其长度进行填充预处理,并被分为长度为512 bit的若干个块Bi,每一个块被分为长度为32 bit的16个字Wi,j(j=0,1,…,15)。然后,以块为单位对每一个块Bi进行64次迭代压缩运算。SHA-256通过压缩函数不断重复对输入块和前一次压缩处理结果的“压缩”过程,最后输出256 bit整个消息的散列值。

其主要步骤如图1所示。

1)填充预处理

对于输入数据流D,需要填充适当的比特流,使其长度为512的整数倍。

首先在输入数据流D后填充1 bit数字“1”。记填充后的数据流长度为LD,设r=LD/512:如果r≤447,则填充(447-r)bit的数字“0”;如果r>447,填充(959-r)bit的数字“0”。最后,余下的64 bit填充原始输入数据流D的比特长度。

2)压缩运算

填充后的输入数据流D′以512 bit为单位分块后,再对每一个块进行压缩运算:

首先将块Bi包含的16个字Wi,j(0≤j≤15)记为Z0,Z1,…,Z15,即Z0=Wi,0,Z1=Wi,1,…,Z15=Wi,15。根据Z0,Z1,…,Z15,计算Zi(16≤i≤63):Zi=e5(Zi-2)+Zi-7+e4(Zi-15)+Zi-16。

初始化变量X:Xi=Yi(0≤i≤7),其中Yi为常量。循环计算,更新变量X,0≤i≤63:

K1=X7+e3(X4)+e0(X4,X5,X6)+Ci+Zi,其中Ci为常量;

更新初始值Y:Yi=Yi+Xi(0≤i≤7)。然后使用更新的初始值,进行下一个分块Bi+1的压缩运算,完成所有分块的压缩运算。

上述计算过程中使用了一些简单的逻辑函数:

3)散列值的生成

当填充后的数据流D′所有分块Bi压缩运算完成后,生成最终整个数据流的256 bit散列值:

根据SHA-256算法的原理,SHA-256算法C语言程序设计可用如下伪代码实现:

3 SHA-256性能分析

在完成SHA-256程序设计的基础上,对SHA-256算法的单向散列函数特性进行分析。

首先选取输入数据,根据基础输入数据D产生24组不同的输入数据序列,并保证相邻两组序列仅有1 bit不同。然后通过设计的SHA-256算法程序分别获取各个序列对应的散列值。最后分析各散列值的差异,以衡量SHA-256算法的单向散列函数特性。

3.1 选取输入数据

24组输入数据序列Input1~Input24由基础输入数据D产生,且相邻2个序列保证只有1 bit差异。然后24组输入数据序列通过SHA-256算法运算,得到对应的散列值。其步骤如下:

1)设基础输入数据D=“abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnop”,其对应的十六进制表示为:

2)根据如下规则改变基础输入数据(带下划线部分)中的1 bit,产生24组不同的输入数据序列Input1~Input24:

Input1~Input8:基础输入数据0x61(即(01100001)2)8 bit从最高位到最低位依次取反,其他位不变;

Input9~Inpout16:基础输入数据0x86(即(10000110)2)8 bit从最高位到最低位依次取反,其他位不变;

Input17~Input24:基础输入数据0x70(即(01110000)2)8 bit从最高位到最低位依次取反,其他位不变。

3.2 获取散列值

根据设计的SHA-256算法程序,获取24组输入数据的散列值。基础输入数据D散列值的仿真如图2所示。

程序实现24组输入数据序列的SHA-256算法运算,得到其散列值如表1所示。

3.3 抗冲突性分析

抗冲突性通过统计改变1 bit输入数据时,输出的散列值变化的位数来衡量。差异越小的输入数据,产生的输出散列值差异越大,说明其冲突程度越小,抗冲突性能越强。

24组输入数据序列输出的散列值中,变化位数的统计结果如表2所示。

上述24组散列值中,变化位数的平均值为128.583 bit。即1 bit的输入数据的改变,将带来近似129 bit的输出散列值的变化。说明SHA-256算法具有较好的抗冲突性能。

3.4 均匀分布性分析

分布均匀性通过统计输出散列值中的“1”与“0”出现的概率来衡量。“1”和“0”出现的概率越逼近均匀分布(即0.5),其分布均匀性越好。理想散列函数均匀分布应为0.5。

24组输入数据序列输出的散列值中,出现的“1”与“0”个数比值统计如表3所示。

上述24组散列值中,“0”与“1”出现的概率近似逼近0.5,0/1标准偏差为0.171,逼近于均匀分布。说明SHA-256算法具有较好的均匀分布性能。

4 小结

笔者设计了SHA-256算法C语言程序,对24组输入数据序列进行了程序仿真,并对仿真结果进行了单向散列函数特性分析。

分析表明,SHA-256算法具有较好的抗冲突性以及均匀分布性。1 bit位的输入数据的改变带来近似129 bi位的输出散列值的变化,输出的散列值中bit数“0”与bi数“1”逼近0.5的概率分布,能够有效地抵御“碰撞攻击”。同时,SHA-256算法最终生成256 bit消息散列值,理论上能够有效抵御2 128次“碰撞攻击”。LTE系统采用SHA-256算法作为密钥生成函数(KDF)核心算法,具备较高的安全性能。

但是,最新理论研究表明,采用Chabaud.Joux攻击,SHA-256部分碰撞概率的下界可达到2-42~2-39[5]。SHA-256在理论上需要更深入的研究,改进算法以提升其安全性能。另一方面,SHA-256算法在LTE系统中高效率、大吞吐量的研究与实现,也具有重要的实用价值。

参考文献

[1]3GPP.3GPP TS 33.401 V9.2.0,3rd Generation PartnershipProject;Technical Specification Group Radio Access Network;Evolved Universal Terrestrial Radio Access(E-UTRA);PhysicalChannels and Modulation[S/OL].(2009-12-09)[2010-01-09].http://www.3gpp.org.

[2]3GPP.3GPP TS 33.102 V9.1.0,3rd Generation PartnershipProject;Technical Specification Group Services and System Asp-ects;3G Security;Security architecture.[S/OL].(2009-12-09)[2010-01-09].http://www.3gpp.org.

[3]ELKAMCHOUCHI H M,NASR M E,ABDELFATAH R I.Anew secure and fash hashing algorithm(SFHA-256)[C]//25th Nati-onal Radio Science Conference.Tanta:[s.n].,2008.

[4]ISO/IEC.ISO/IEC FDIS 10118-3.Information technology-Securitytechniques-Hash-functions-Part 3:Dedicated hash-functions.[S].2003.

信息系统代码差异现状及改进建议 篇10

一、完善信息系统代码标准化建设势在必行

信息系统代码标准化是对一些重要且基础性的元素信息进行代码化、科学化管理, 逐渐减少并消除现有业务系统中的代码差异。为了进一步规范管理, 解决各类应用系统中代码不一致带来的问题, 国家外汇管理局已于2009年6月出台了《国家外汇管理局信息系统代码标准管理实施细则 (暂行) 》, 明确了对各类外汇信息系统代码的规范性管理, 为外汇局标准代码数据库的建立提供了重要的参考依据。然而在代码标准化管理的推进过程中却发现了很多代码差异问题, 代码在系统间重复维护、数据逻辑设计与代码标准化实施要求不符、以及由代码不一致引发的大量不规范历史数据等。这些问题的出现对信息系统代码标准化的完善提出了更高的要求, 指明了下一步实施代码管理的重点任务。

二、信息系统代码差异现状

(一) 代码重复维护造成系统间差异表现

由于各个应用系统前期规划不尽相同, 加之新的业务系统不断建立, 使得不同系统有不同的数据采集功能, 口径和项目均不一致, 这类问题在代码变更维护时体现得更为明显。如外换银行由于改制为外商独资银行, 需变更外汇局所属各业务系统的基础信息, 涉及到的外汇业务系统包括贸易信贷登记、直接投资、个人结售汇、外汇账户信息交互平台、外债统计监测等几个系统。不同业务系统都有自己独立的代码维护入口, 维护任务由不同部门的人员担任, 同一类代码信息在不同系统中重复维护, 不仅增加了操作人员的工作量, 而且由于不同人员的多次操作也极易导致信息要素在系统间的差异表现, 给后续信息交换和整合带来困难。

(二) 现有系统中数据逻辑设计与代码标准化实施要求不符

在外汇局现有的几个系统中如个人结售汇、外汇账户系统, 部分数据的逻辑意义与代码标准化实施要求不一致。就金融机构标识码而言, 前六位在系统中被认为是外汇局代码, 但在代码标准化管理过程中, 前六位只有在初次设置时是按照所属外汇局代码定义, 其参数不作为外汇局代码的依据, 也不随金融机构的迁址而变更。如工商银行黄河街支行 (金融机构标识码为210213000214) 因迁址申请进行金融机构相关信息要素的维护, 所属外汇局由金州支局 (外汇局代码为210213) 迁至大连市分局 (外汇局代码为210200) , 按照外汇局信息系统代码标准管理实施细则第六十条的规定, 金融机构标识码初始赋码时按照本编码法进行编制, 发布后将不得变更。但个人结售汇系统在数据设计中将金融机构标识码的前六位视为所属外汇局代码, 因此无法完成210213开头的金融机构迁入大连市分局。究其原因, 是在旧系统开发阶段, 没有形成完善的代码标准建设方案, 使得一些数据的逻辑设计与代码标准系统的具体实施要求相悖。同样不符合代码标准化建设要求的还有外汇账户系统。

(三) 不规范历史数据的清理、建档工作繁重

由于代码差异表现使部分外汇业务系统中存在大量不规范历史数据, 造成新旧系统间的记录不一致, 容易引起不同业务系统之间交换数据的障碍, 也给数据报送部门带来困难。如金州支局外汇局代码先后使用过210288和210213, 并最终规范为210213, 但在部分旧系统中仍存在210288的业务数据, 导致银行在进行外汇账户数据上报时, 需要将其原本从金宏系统中生成的210213的业务数据转为210288后方可导入系统。目前, 外汇账户系统中涉及210288外汇局代码的数据量非常庞大, 而且数据之间有交叉使用, 这给清理工作带来很大的困难。但不及时清理, 也会影响系统间的信息共享和交互使用, 信息的汇总难度加大。

三、信息系统代码差异改进建议

(一) 规范数据采集, 建立数据同步机制

为了解决数据重复维护带来的信息冗余和不一致问题, 需要建立统一的数据采集入口, 可以利用金宏系统中的外汇代码标准管理系统, 建立代码标准库并不定期更新、完善代码操作维护规程, 确保代码设置的规范性;另一方面, 还需要使代码在相关联的系统中同步起来, 可以采用后台任务计划、tuxedo调度、系统crontab、程序编写等方式, 使变更的代码信息能够在一定时间内同步到需要关联的业务系统中。由于现有系统数据结构不一致且代码同步有可能会影响业务操作, 可以先进行公共代码和基础档案代码的信息同步, 而对与实际业务操作关系紧密的代码变更及同步需要对业务数据的进一步分析。

(二) 改进系统功能, 梳理与代码标准化不符的数据结构

在与代码标准化实施要求不符的系统中, 如个人结售汇系统、外汇账户系统等都为目前外汇业务运行的重要系统, 因此在梳理其中不规范的数据结构时, 需要对系统做进一步的分析, 得到系统的功能模型和数据模型, 并对其进行功能增强和模型改造, 以此逐步梳理出符合代码标准化管理的系统规范。

(三) 以代码标准库为依据, 清理不规范历史数据

目前存在不规范历史数据的主要是外汇账户系统、出口核报系统、进口付汇系统, 如何在不影响日常外汇业务操作和各系统间关联性的前提下进行数据清理是此项工作的难点。清理工作应当以外汇局信息系统代码标准库为依据, 因为其中包含比较完整的收支交易代码, 业务项目划分较为详细, 以此为基础统一各类不规范代码和历史数据, 有利于实现代码的全标准化管理。因为涉及不同业务系统间的数据交换, 而数据库版本、数据结构又不尽相同, 因此此项工作需要在分局提出整体清理方案的基础上, 由总局给予一定的技术支持。

(四) 加强信息系统代码标准库的贯彻和推广

课堂生成感动,灵感生成亮点 篇11

关键词:课堂教学 课堂生成 有效利用

新课程提倡的课堂是一个绿色的生态环境。在新课程理念指导下,教师应该站在关注生命的高度,关注学生的发展、关注和提倡动态生成,时刻关注教学过程中可变因素的动态发展,使课堂教学焕发出最真实的生命活力,流淌出最精彩的生命激情。

所谓动态生成,是指在课堂教学动态发展的过程中,随机生成的问题(教学内容)或教学活动。

《语文新课程标准》倡导在整个学习过程中,学生应作为一种活生生的力量,带着自己的知识、经验、思考、灵感、兴致参与到课堂活动中来,从而使课堂呈现出丰富性、多变性和复杂性。课堂中,教师应该关注那些生成性的资源,根据教学中生成的资源随时调整自己的教学行为。

如何坚持课堂教学中的动态生成,我从以下三个方面加以阐述。

一、精心预设,生成亮点

坚持动态生成,不是不要教学预设。生成与预设是一组对应的概念,没有好的预设很难有精彩的生成;期待更多的“生成”精彩,就应该在备课时做周详巧妙的教学“预设”。

在教学《春雨的色彩》一课时,曾预设了好几个不同的导课方式,自己都不满意。直到学完《春晓》这首诗,忽然想到利用《春晓》的课后作业——学生的绘画作品。于是我这样导入新课:“春天是一首优美的诗歌,春天是一幅七彩的画,春天又是一个讲不完的故事。今天就让我们一起来读一篇和春天有关的童话故事——春雨的色彩。”自己感觉这样很自然、很流畅。

课堂总结时,我问:“学了《春雨的色彩》这篇美丽的童话,你知道了什么?又想到了什么?”一个学生说想到了《春雨沙沙》这首歌。于是我的灵感促使着我把“绿、红、黄”三个表示颜色的词,画成一棵刚发芽的种子。接着,让学生齐读课文最后一段“春雨听了大家的话下得更欢了”;与此同时,我在黑板上边唱《春雨沙沙》这首歌边板画春雨。此时此刻,师生都感觉更愉快更有意思了!

如此预设,看似微不足道,却是神来之笔。教师的灵感生成了教学的亮点,学生思维自主生成,焕发了师生的生命活力。

二、捕捉灵感,生成精彩

精彩往往缘自生成,课堂教学中的生成比预设更有意义和价值。在生成的过程中,师生双方超越了传统的教与学的理念,积极互动,课堂中充满了对智慧的挑战和对好奇心的满足。

教学《绿叶的梦》第一课时后,布置学生走进大自然,采集喜爱的叶子,编织自己的“绿叶之梦”。到了第二天,大部分学生都带来了自己的创作。我发现如果都在课堂上展示,没有那么多时间,于是把做的最好的几个学生的作品留在他们手中,让他们在课上展示介绍;其他学生的作品都在教室南北窗台上展览开来。这样,学生的“绿叶之梦”都得到了展示,教室里也满是绿叶。这样处理,给人一种走进了大自然的感觉,学生能更快地融入到课文的情境中去。

在课堂教学中的“展示自我”的环节中,朱宏博同学在展示自己的作品时说道:“我认为绿叶的梦是友谊的梦。”当我问他为什么时,他低下了头,已经激动得泣不成声了。当我看到作品中,一个小孩儿上面写着于洋的名字,另一个小孩儿上面写着“我”字。我懂了,虽然于洋同学转学了,但是他们的友谊却更深了。

这感人的一幕,牵动了我的心,我再也说不出安慰他的话,因为我的泪水也在眼睛里打转了。在课堂上,我只能说:“由于对于洋的思念,朱宏博让自己与于洋一起坐在了大自然的课堂里。”

学生在与文本、教师、同学的对话、交流中,分享着彼此的思考与经验,交流相互的情感与体验,提升着各自的认识与审美,这样的课堂充满了鲜活与灵动,透射出生命的活力。

三、放飞思想,生成智慧

课堂应有“思想”的火花,有“智慧”的灵光。教师只有在课堂教学规定时间内,能够合理运用各种教学资源,营造积极、和谐的学习氛围,提供多种学习形式,关注学生的过程体验,组织学生进行有效的教学活动,才能促使课堂教学的有效性落到实处,才能引导教学在动态生成的轨道上有所发展。语文学习需要打开学生的思维,让思想的骏马奔驰于时空中,让他们展现自己的智慧。

在执教《星星和哨兵》一课时,先让学生自由读课文,读完后说说文中写了什么?结果“星星、哨兵、奶奶、我”这些关键词都被学生抓出来了。

于是,我马上想到了第二个问题“奶奶喜欢谁,文中的我喜欢谁,你又喜欢谁?”第二遍读课文又开始了,自己感觉这个问题既能抓住文本重点,又能抓住学生的心。读完这遍之后,有的学生说喜欢星星,有的说喜欢哨兵,大概各占一半吧!

接下来,我领着学生边读边比较星星和哨兵的区别,按照文本的意思就是哨兵比星星勇敢、不怕累。所以,我问“现在,星星和哨兵你更喜欢谁?”大部分学生都说喜欢哨兵,我也跟着一个劲的往哨兵上引导,意想不到的事发生了。贾党松同学在没人举手的情况下,手还在举着,因为我一向都会让学生把想说的说完,所以我让他接着说。他说:“其实,星星也不太怕累。因为它可以照亮大地,让哨兵能看清楚并抓住坏人。”我这才恍然大悟,原来我并没有真正理解文本,更没有灵活地运用文本。学生说得太好了,太有个性,太精彩了。

有了这精彩的回答,我感觉整个课堂都充满了活力。因为我明白了文本的内涵,懂得了多角度解读文本,发现了童心才能看到的完美世界。放飞了学生的思维,生成了智慧的火花,留下了美丽的瞬间!

课堂上坚持“动态生成”,是开放式课堂教学的一朵奇葩,是教师教学机智的体现,更是课堂教学质量和效率的要求。

关注生成,让课堂走向幸福;让课堂走向灵动;让课堂走向永恒。

关注生成,让课堂呈现出动态变化、生机勃勃的景象;让课堂焕发出浪花闪耀、高潮迭起的精彩;让课堂演绎出活力四射、激情飞扬的乐章。

汉字错字字形动态生成和编辑系统 篇12

汉语以其独特的魅力引来世人广泛关注,作为一种结构复杂的文字,学习起来具有一定的难度,其中以汉字书写最难学。对于初学者来说很容易写错字,而不同汉语学习者出现的书写错误又有不同的规律,但目前还没有大规模的错字书写偏误统计分析研究成果为汉字教学提供指导和参考。究其原因,一方面是错字的计算机处理(错字的编辑、编码,错字的输入输出,错字的印刷排版等)还存在很多困难;另一方面是目前该领域内缺乏符合国际标准的错字编码方案和简易有效的错字输入方法,由此给计算机处理汉字错字信息方面造成了困难。因此研究设计一种简单有效的汉字错字生成与处理方案就显得极为必要。

1 汉字错字生成系统的应用需求与现状

利用计算机进行汉字输入、排版和印刷,是目前办公自动化和印刷领域内一件极平常的事。但是,如果要输入并印刷计算机字库中没有的汉字,往往需要大费周折,常用的办法有两种一是利用造字程序制造字库中没有的汉字;二是临时做一个汉字图片来替代。错字属于字库中没有的字,少量的错字可以用上述方法来进行,但随着我国汉语教学特别是对外汉语教学的发展,学写汉字的人越来越多,由于汉字学习的复杂性,出现了汉字书写的错误种类和数量成倍增长的现象,使用字库制造错字和编辑错字图片的方式远远不能适应数字化汉语教学的需要。

为此许多学者开始在错字编辑和识别方面进行研究,并且已经取得了一些成果。比较典型的有李小庆等人的“基于国际标准的错字处理方案”[1,2],在该方案中,基于Unicode 5.1标准的表意文字变体序列标准IVS(ideographic variation sequences)设计并实现了以正字为中心、使用正字加变体选择符IVS表示错字编码,并应用Open Type字库技术进行输入输出的错字处理方案。

上述错字处理方法是在原有字库的基础上利用标准字库中的空闲区域或不常使用的汉字内码区域来存放错字,这类方法最大的不足就是占用了汉字宝贵的编码空间,随着错字规模的扩大,这些预留区间很快会被用完。例如,Unicode编码的自定义区域为[E000-F8FF]共6400个[3],即使每个汉字取一个错字也只能存放6400个,而实际情况是,错字的数量远不是一个汉字只有一个错字。因此现有的错字输入和处理方案在处理大批量错字方面还存在很多缺陷。另外现代汉字字形库是以字体文件为单位,每一个字体文件包含一类不同编码的汉字,每一个汉字是以字形的轮廓来描述,但是汉字错字产生的缘由决定了其种类繁多,用字形轮廓来描述会变得更加麻烦。轮廓字形虽然保证了字形输出的质量,但不利于错字字形的编辑和动态生成[4,5,6]。

因此,需要找到一种基于字形描述的汉字错字输入和编辑方法[7,8,9],借以开放错字的编辑数量,方便用户输入,更好地服务于汉字错字的出版和印刷,为汉语教学特别是对外汉语教学提供数字化的错字编辑和印刷环境。

2 错字字形动态描述库

针对上述需求,我们提出了一种基于错字字形进行编码的方法,该方法首先通过建立错字字形动态描述库DDL,使用有向笔段和笔元对错字字形进行动态矢量化描述[10,11],然后在字形骨架上找出特征点,并通过特征点进行量化和存储,最终实现错字的字形编码。DDL的应用,解决了由于使用字形轮廓描述汉字错字而存在的字形动态编辑和字形变换的困难,解决了汉字错字教学中的编辑难、书写难的问题。

2.1 错字字形描述

参照现代汉字的书写方法,在错字字形动态描述库中引入有向笔段和笔元的概念来描述错字的字形骨架。有向笔段是一条有方向的线段,将笔段定义为有向的意义在于错字字形生成过程中的起笔、运笔和落笔的识别。每个笔段的起始点和结束点的坐标分别用势点和驻点来表示,设(Xi,Yi)是势点,(Xj,Yj)是驻点,则这个有向笔段用一维向量Sij描述如下:

笔元是由一个或者多个有向笔段组成的一个完整的笔画结构,设一个笔元由n个笔段组成,则这个笔元可以用向量En描述,即En=(Si1j1,Si2j2,…,Sinjn)。对于任意的K∈{1,2,…,n},记Sikjk为Sk,则上述笔元可简记为:

其中,En的第一个笔段S1的势点叫做En的始点,最后一个笔段Sn的驻点叫做En的终点。

2.2 笔元的界定

在字形描述库中,使用界点对各个笔元进行分隔。每一个笔元都有始点和终点,为了使多个笔元之间的始点和终点不发生错乱,通过在每个笔元的始点之前添加界定符号的方式来界定笔元,界定符号叫做笔元的界点。若界点为D=(D1,D2),则笔元En的描述向量为:

2.3 错字编码描述

一个汉字错字是其笔元的集合,为了便于计算机识别,我们将这个集合表示为笔元的排列,排列顺序按照汉字的书写顺序进行,设一个汉字错字由m个笔元:En1,En2,…,Enm,则这个错字的描述向量为:

错字的描述向量经处理转化为描述库中的编码存放在一个文本文件中,为了界定不同错字的编码,在每个错字编码的第一个笔元之前和最后一个笔元之后分别加上界定符号H=(H1,H2)和T=(T1,T2),则这个错字的描述向量就成为:

2.4 动态描述算法

动态描述算法的主要作用是将绘制或调整后的笔元信息进行规范和存储。算法步骤如下:

步骤1打开字形描述库;并初始化变量。

变量的初始化要对界点D、始点H、终点T、笔元数ele_num和字形描述库ZXDATA(i)进行初始化操作。

步骤2选择操作类型。若操作为“Ins”,则插入笔元;若操作为“Mov”,则移动笔元;若操作为“Del”,则删除笔元;若操作为“MovDot”,则移动选择点(势点或驻点);若操作为“DelDot”,则删除选择点(势点或驻点);若操作为“Change”,则改变笔元粗细;若操作为“Copy”,则透明临摹;若操作为“No Oper”,则转向步骤3。

步骤3保存操作,关闭字形描述库。

插入笔元是通过逐个插入该笔元的笔段来实现,移动整体笔元是通过修改笔元的各个点(界点除外)来实现。综上所述,DDL的建立过程如图1所示。

由图1可知,错字由正字经动态编辑得来。为了建立两者之间的联系,我们通过链表来匹配它们之间的关联,链表结点结构如图2所示。其中标志域Tag取值0和1,Tag为“0”表示该字是正字,Tag为“1”表示该字是错字,链域Link存储指向同一链表中下一个结点的指针,编码域Code存储该字的编码。

编辑错字时,先在Word文档里输入一个正确的字,然后利用软件的“透明临摹”对该正字描绘骨架(即笔元),系统会记录特征点信息并将该正字的编码存储到链表的头结点中。然后在该正字的字形基础上通过软件提供的操作(如移动笔元)编辑错字,编辑好后保存,则该错字的编码被存入结点插入到对应链表中,依此类推。如果要编辑一个新的字,则会存储到另一个链表中,同时我们对所有链表的头结点建立正字索引以方便检索。退出系统时,系统会自动更新本次所有字形编码,生成最新的文本文件,保证下次打开描述库时初始化工作的顺利执行。

2.5 特征点的提取及编码

根据上述动态描述库中的描述可知,特征点的提取与错字字形中的笔元和笔段的提取有关,错字字形中笔元的提取算法可以通过查找界点来实现,笔段的提取算法可以通过分析笔元中的势点和驻点来实现,因此特征点的提取算法实现如下:

步骤1打开字形描述库;并初始化变量。这里主要对界点D、始点H、终点T、笔元数ele_num和字形描述库ZXDATA(i)进行初始化操作。

步骤2对比特征点类型。若特征点类型为“界点”,则转步骤2.1;若特征点类型为“势点”,则转步骤2.2;若特征点类型为“驻点”,则转步骤2.3;否则,转步骤2.4。

步骤2.1笔元数加1,by_num=by_num+1。

步骤2.2笔段数加1,bd_num=bd_num+1。

步骤2.3存储特征点坐标。

步骤2.4第一个文字特征点提取结束。

转步骤2继续提取下一个字。

步骤3保存,关闭字形描述库。

若字形描述库中的字形描述向量为:ZX=(H1,H2,En1,En2,…,Enm,T1,T2),则通过特征提取算法得到该错字字形的特征点编码为:En=(by_num,bd_num,S1,S2,…,Sn)。

例如:由特征点提取算法得到“”字的特征点(如图3(a)所示),错字识别程序根据这些特征点编码通过连线得到错字“”的字形(如图3(b)所示)。因此,任何错字字形在系统中均可动态显现。

3 错字动态生成与编辑系统

结合上述算法思想,本文创建了通过自建错字字形库进行实时动态编辑的错字输入系统。该系统包括:错字字形库编辑模块、错字字形特征提取模块,错字字形编码模块、错字输入模块、错字实时动态编辑模块(如图4所示)。

(1)错字字形库编辑模块:实时动态编辑用户需要输入的错字,在正字的基础上对笔画结构进行基于可视化的修改和组合,这些修改包括增加笔元、移动笔元、删除笔元、增加选择点、删除选择点、笔画临摹、改变笔画粗细等,系统会将编辑好的错字字形结构信息传递给错字字形特征提取模块。

(2)错字字形特征提取模块:分析接收到的错字字形结构数据,采用错字特征提取算法提取错字中的特征点,并将特征点数据传递给错字字形编码模块。

(3)错字字形编码模块:通过错字字形编码算法将错字字形特征提取模块中提取的特征数据进行编码处理并存储。

(4)错字输入模块:通过键盘输入错字对应的键码(该系统暂时只能使用26个字母键和10个数字键进行错字输入),程序会根据这个键码对应的编码在编辑器中显示该错字,以便编辑、制版和印刷。

(5)错字实时动态编辑模块:接收需要调整和编辑的错字信息,调用错字字形库编辑模块对文档中的错字进行实时动态编辑处理。

4 错字动态生成实例演示

下面以“笔”的某个错字字形通过本系统演示如下:

(1)在错字字形编辑模块中挑选正字“笔”作为临摹对象,通过笔元编辑只改变笔字的竹字头结构使之变成一个错字“”,保存编辑后的错字“”(如图5所示)。

(2)由特征提取模块的特征提取算法将错字“”的每一笔画用若干个二维表(Xi,Yi)组成的序列来表示(该序列表的值支持动态修改),若干个序列表和一个对应正字“笔”的索引码组成了错字“”的特征码(如图6所示)。

(3)错字输入时,编辑完成后,在编辑环境下“”输入该错字对应的数字或字母键,则出现该错字,对应的数字或字母就是该错字的键码(如图7所示)。

(4)对错字进行动态编辑时,首先通过键盘输入该错字,然后右键点击改错字,进入编辑状态,根据需要修改错字字型,修改后的错字会重新加入到错字字形表中并被存储下来(如图8所示)。

5 结语

本文针对印刷和数字化汉语教学中存在的汉字错字输入问题及现状,研究设计一种基于错字字形的动态实时编辑系统,用于错字的输入与处理;另外,充分利用了现代汉字的结构多变,字形复杂的特性,将错字字形库的编辑和修改与汉字的临摹有机结合起来,保证了在不改变原有字形结构的情况下,动态制作多种形式的错字字形,为数字化的汉语教学和错字印刷排版提供了一种错字获取源,是一种简单方便而又高效地错字输入法。

摘要:汉语的独特性使得汉语成为当今语言学习的一大热点。针对当前汉语教学中出现的汉字错字方面的教学问题,提供一种简单、方便、高效的错字输入法并设计实现了汉字错字字形动态生成与编辑系统,该系统使用动态编辑技术解决了编辑过程中错字的实时编辑、编码和输入的问题,为错字的编辑、印刷和排版及数字化汉语教学研究提供了一种方便的错字输入方法。此方法还可用于古籍异体字、甲骨文、金文、民俗拼合字等字形的动态编辑、生成与处理。

关键词:汉字,错字输入法,动态编辑,数字化汉语教学

参考文献

[1]李小庆,林民,塔娜,等.基于国际标准的错字处理方案设计与实现[J].计算机工程与设计,2010,31(10):2387-2391.

[2]李小庆.面向汉字教学的错字处理工具设计与实现[D].呼和浩特:内蒙古师范大学,2010.

[3]朱巧明,李培峰,吴娴,等.中文信息处理技术教程[M].北京:清华大学出版社,2005.

[4]林民,宋柔.一种笔段网格汉字字形描述方法[J].计算机研究与发展,2010,47(2):318-327.

[5]林民,宋柔.一种面向构型计算的汉字字形形式化描述方法[J].中文信息学报,2008,20(3):115-123.

[6]林民,宋柔.汉字的笔段网格字形描述及字形比对算法[J].计算机辅助设计与图形学学报,2009,21(9):1298-1306.

[7]王瑜,黄源,张福炎.Windows中TrueT ype字形数据的存取技术[J].小型微型计算机系统,1997,18(11):75-81.

[8]郑军.一种面向字形分析的汉字输入输出处理系统的设计与实现[D].呼和浩特:内蒙古师范大学,2009.

[9]韩东妹.汉字字形描述技术研究[D].呼和浩特:内蒙古师范大学,2007.

[10]吴琴霞,栗青生.基于动态描述库的汉字字形自动生成技术研究[J].科学技术与工程,2013,13(15):295-299.

上一篇:大尺度校园下一篇:农业企业集团