INL算法
❶ 数模转换的转换器的参数
1.采样速率和分辨率
对于ADC而言,采样速率和分辨率是两个非常重要的指标参数。其中,采样速率表示模拟信号转换为数字信号的速率,与ADC器件的制造技术有关,取决于ADC中比较器所能提供的判断能力。分辨率表示模拟信号转换为数字信号后的比特数。
一般而言,采样速率和分辨率是互相制约的关系。采样速率每提高一倍,分辨率大约损失1bit。这主要是由于采样时刻的抖动,即孔径抖动或称为孔径不定性。
2.信噪比
ADC的信噪比(SNR)反映了量化过程中产生的无噪声信号部分的均方根值和量化噪声的均方根值的比值。
3.有效转换位数
对于实际的A/D变换系统,由于存在着电噪声、外界干扰和模拟电路的非线性畸变等因素的影响,仅以理想的分辨率来度量系统性能是不够的。
4.无失真动态范围
无失真动态范围(SFDR,Spurious-FreeDynamicRange)表示ADC在强信号干扰下检测微弱信号的能力,在有的书中也被称为无杂散动态范围或无寄生动态范围。SFDR可以按两种方式进行定义:
(1)定义为满量程(FS)信号的均方根值与输出信号中最大寄生信号的均方根值的比值,用dBFS表示;
(2)定义为输入信号幅度的均方根值与输出信号中最大寄生信号的均方根值的比值,表示为dBc。
在理想情况下,SFDR的最大值出现在满幅度输入的情况下。在实际情况中,SFDR的最大值比满幅度输入至少低几个dB,这是由于在输入信号幅度接近满幅度时ADC的非线性及失真现象将更加严重。因此,在实际中,应避免使ADC输入信号幅度接近满幅度。
5.孔径误差
在理想情况下,采样过程是瞬间完成的。然而,对于实际的A/D变换过程,从发出采样命令到实际开始采样需要一定的时间,即实际采样点与理想采样点之间存在着一定的时间延迟,称为孔径时间(ApertureTime)。对于一个动态模拟信号,在ADC接通的孔径时间里,输入的模拟信号值是不确定的,从而引起输出的不确定误差,这就是所谓的孔径误差。孔径误差会导致ADC采样精度和信噪比的下降,且与被采样信号的频率f成正比。
6.非线性误差
非线性误差是转换器的重要精度指标,表示了ADC实际转换值与理论转换值之间的差别。非线性误差主要包括两类:差分非线性(DNL,DifferentialNon-Linearity)误差和积分非线性(INL,IntegralNon-Linearity)误差。
差分非线性误差(DNL)是指ADC实际的量化电平与理论的量化电平之间的差异,这主要由于A/D本身的电路结构和制造工艺等原因,引起在量程中某些点的量化电压和标准的量化电压不一致而造成的。DNL引起的失真分量与输入信号的幅度和非线性出现的位置有关,通常用和理想电平相差的百分比来表示。
积分非线性误差(INL)是指ADC实际转换特性函数曲线与理想转换特性直线之间的最大偏差,主要是由于A/D模拟前端、采样保持器及ADC的传递函数的非线性所造成的。理想转换特性直线可以利用最小均方算法得到,而INL引起的各阶失真分量的幅度随输入信号的幅度变化。如果输入信号每增加1dB,则二阶交调失真分量增加2dB,三阶交调失真分量增加3dB。
7.互调失真
当两个正弦信号、同时输入ADC时,由于器件的非线性,其输出频谱除了含有这两个频率的分量之外,还将产生许多失真产物,由此所造成的失真称为互调失真(IMD,InterMolationDistortion),其中m+n的数值表示失真的阶数。在所有的互调失真中,二阶和三阶的互调产物最为重要。前者容易通过数字滤波器滤除,而后者由于与、离得很近而很难滤除。
一般采用二阶截获点和三阶截获点来度量互调失真。然而,对于ADC,由于其限幅的特性,二阶截获点和三阶截获点并不适用,因此在ADC中也并没有指定。在这种情况下,双音SFDR是最适合度量ADC失真程度的指标。
8.谐波失真
由于ADC非线性的影响,其输出的频谱中出现许多输入信号的高次谐波,这些高次谐波分量称为谐波失真分量,由此所造成的失真称为谐波失真(THD,TotalHarmonicDistortion)。谐波失真和互调失真是两个不同的概念,前者是对原信号波形的扭曲,即使是单一频率信号通过ADC也会产生这种现象,而后者却是不同频率之间的互相干扰和影响。
度量ADC的谐波失真的方法很多,通常可利用离散傅里叶变换(DFT)测出各次谐波分量的大小。
全功率输入带宽(FullPowerAnalogInputBandwidth)是指当ADC输出信号幅度低于最大输出电平3dB时的输入信号频率范围。一般采样速率越高,全功率输入带宽就越宽。对于ADC而言,被采样信号的带宽必须在全功率输入带宽之内,否则在模拟输入带宽之外的频率成分因衰减过多而无法正确地反映原始信号。
❷ c++ #include< >里面可以加什么
#include 是用来包含头文件的,
#include <>又是专门用来包含默认路径下的头文件的。
(注意与#include " "的区别,这个用来包含当前目录下或绝对路径里的头文件)
你可以去查看你的编译器安装路径下的include文件夹里的文件,列表如下
algorithm
assert.h
bitset
cassert
ccomplex
cctype
cerrno
cfloat
ciso646
cliext
climits
clocale
cmath
CodeAnalysis
comdef.h
comdefsp.h
comip.h
complex
comutil.h
conio.h
crtassem.h
crtdbg.h
crtdefs.h
crtwrn.h
csetjmp
csignal
cstdarg
cstddef
cstdio
cstdlib
cstring
ctime
ctype.h
cwchar
cwctype
dbgautoattach.h
delayhlp.cpp
delayimp.h
deque
direct.h
dos.h
dvec.h
eh.h
emmintrin.h
errno.h
exception
excpt.h
fcntl.h
float.h
fpieee.h
fstream
functional
fvec.h
gcroot.h
hash_map
hash_set
intrin.h
invkprxy.h
io.h
iomanip
ios
iosfwd
iostream
iso646.h
istream
iterator
ivec.h
limits
limits.h
list
listing.inc
locale
locale.h
malloc.h
map
math.h
mbctype.h
mbstring.h
memory
memory.h
minmax.h
mm3dnow.h
mmintrin.h
msclr
new
new.h
nmmintrin.h
numeric
ompassem.h
omp.h
ostream
penwin.h
pgobootrun.h
pmmintrin.h
process.h
queue
rtcapi.h
sal.h
search.h
set
setjmpex.h
setjmp.h
share.h
signal.h
smmintrin.h
srv.h
sstream
stack
stdarg.h
stddef.h
stdexcept
stdexcpt.h
stdio.h
stdlib.h
streambuf
string
string.h
strstream
swprintf.inl
sys
tchar.h
time.h
time.inl
tmmintrin.h
typeinfo
typeinfo.h
use_ansi.h
utility
vadefs.h
valarray
varargs.h
vcclr.h
_vcclrit.h
vector
wchar.h
wctype.h
wmiatlprov.h
wtime.inl
xcomplex
xdebug
xhash
xiosbase
xlocale
xlocinfo
xlocinfo.h
xlocmes
xlocmon
xlocnum
xloctime
xmath.h
xmemory
xmmintrin.h
xstddef
xstring
xtree
xutility
ymath.h
yvals.h
❸ OpenSSL的EVP_DecryptFinal_ex为什么会调用失败
此函数调用失败的原因很多, 理解函数描述及使用细节很关键。
1、函数原型:
int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out,
int *outl);
2、函数描述:
该函数处理最后(Final)的一段数据。在函数在padding功能打开的时候(缺省)才有效,这时候,它将剩余的最后的所有数据进行加密处理。该算法使用标志的块padding方式(AKA PKCS padding)。加密后的数据写入到参数out里面,参数out的长度至少应该能够一个加密块。写入的数据长度信息输入到outl参数里面。该函数调用后,表示所有数据都加密完了,不应该再调用EVP_EncryptUpdate函数。如果没有设置padding功能,那么本函数不会加密任何数据,如果还有剩余的数据,那么就会返回错误信息,也就是说,这时候数据总长度不是块长度的整数倍。操作成功返回1,否则返回0。
PKCS padding标准是这样定义的,在被加密的数据后面加上n个值为n的字节,使得加密后的数据长度为加密块长度的整数倍。无论在什么情况下,都是要加上padding的,也就是说,如果被加密的数据已经是块长度的整数倍,那么这时候n就应该等于块长度。比如,如果块长度是9,要加密的数据长度是11,那么5个值为5的字节就应该增加在数据的后面。
❹ 寻迹感光智能车使用手册
摘要 基于HCSl2单片机设计一种智能车系统。在该系统中,由红外光电传感器实现路径识别,通过对小车速度的控制,使小车能按照任意给定的黑色引导线平稳地寻迹。实验证明:系统能很好地满足智能车对路径识别性能和抗干扰能力的要求,速度调节响应时间快,稳态误差小,具有较好的动态性能和良好的鲁棒性。关键词 智能车 HCSl2单...
摘要 基于HCSl2单片机设计一种智能车系统。在该系统中,由红外光电传感器实现路径识别,通过对小车速度的控制,使小车能按照任意给定的黑色引导线平稳地寻迹。实验证明:系统能很好地满足智能车对路径识别性能和抗干扰能力的要求,速度调节响应时间快,稳态误差小,具有较好的动态性能和良好的鲁棒性。
关键词 智能车 HCSl2单片机 红外光电传感器
智能车系统以迅猛发展的汽车电子为背景,涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科;主要由路径识别、角度控制及车速控制等功能模块组成。一般而言,智能车系统要求小车在白色的场地上,通过控制小车的转向角和车速,使小车能自动地沿着一条任意给定的黑色带状引导线行驶。
笔者基于HCSl2单片机设计了一种智能车系统。硬件系统中的路径识别功能由红外光电传感器实现,车速控制由模糊控制器进行调节。软件设计中实时检测路况,并定时中断采集速度反馈值。
1 系统分析及控制方案
1.1 智能车系统分析
智能车系统根据检测到的路况和车速的当前信息,控制转向舵机和直流驱动电机,相应地调整小车的行驶方向和速度;最终的目的使智能车能快速、稳定地按给定的黑色引导线行驶。
小车在行驶过程中会遇到以下两种路况:①当小车由直道高速进入弯道时,转角方向和车速应根据弯道的曲率迅速做出相应的改变,原则是弯道曲率越大则方向变化角度越大,车速越低。②当小车遇到_卜字交叉路段或是脱离轨迹等特殊情况时,智能车应当保持与上次正常情况一致的方向行驶,速度则相应降低。因此,对智能车的设计,要求具有实时路径检测功能和良好的调速功能。
1.2 控制方案的设计
系统的控制分为小车转向角控制和速度控制两部分。
小车转向角的控制通过输入PWM信号进行开环控制。根据检测的不同路径,判断出小车所在位置,按不同的区间给出不同的舵机PWM控制信号。小车转过相应的角度。考虑到实际舵机的转向角与所给PWM信号的占空比基本成线性关系,所以舵机的控制方案采用查表法。在程序中预先创建控制表,路径识别单元检测当前的路况,单片机通过查表可知当前的赛道,然后给出相应的PWM信号控制舵机转向。
本设计采用了一种数自整定的模糊控制算法对小车速度进行闭环控制。小车在前进过程中,根据不同的路况给出不同的速度给定值,通过模糊控制器进行速度调节,以缩短小车的速度控制响应时间,减小稳态误差。系统将小车的角度变化率反馈给模糊控制器,通过修正规则进行模糊参数的自整定。智能车自动控制系统结构框图如图1所示,图中dt表示小车角度的微分环节,θ表示输出的转角,n’表示速度的设定值,n表示实际速度反馈值。
2 硬件结构与方案设计
系统硬件主要由HCSl2控制核心、电源管理单元、路径识别单元、角度控制单元和车速控制单元组成,其结构框图如图2所示。
2.1 HCSl2控制核心
系统的核心控制采用飞思卡尔半导体公司的16位HCSl2系列单片机MC9S12DGl28。其主要特点是高度的功能集成,易于扩展,低电压检测复位功能,看门狗计数器,低电压低功耗,自带PWM输出功能等。系统I/O口具体分配如下:PORTAO、PTH0~PTH7共9位用于小车前面路径识别的输入口;PACNO用于车速检测的输入口;PORTB0~PORTB7用于显示小车的各种性能参数;PWM01用于伺服舵机的PWM控制信号输出;PWM23、PWM45用于驱动电机的PWM控制信号输出。
2.2 电源管理单元
电源管理单元是系统硬件设计中的一个重要组成单元。本系统采用7.2V、2000mAh、Ni-Cd蓄电池供电。为满足系统各单元正常工作的需要,系统将电压值分为5V、6.5V和7.2V三个档。三个电压档的具体实现及其功能如下:
①采用稳压管芯片L7805CV将电源电压稳压到5V,稳压电路如图3所示,给单片机系统电路、路径识别的光电传感器电路、车速检测的旋转编码器电路和驱动芯片MC33886电路供电;
②将电源电压7.2V经过一个二极管降至6.5V左右后给舵机供电;
③将电源电压7.2V直接供给直流驱动电机。
2.3 路径识别单元
为提高小车转向角的控制精度,系统路径识别单元采用9个发射和接收一体的反射式红外光电传感器JY043作为路径检测元件。红外线具有极强的反射能力,应用广泛,采用专用的红外发射管和接收管可以有效地防止周围可见光的干扰,提高系统的抗干扰能力。
对于小车循迹场地的黑白两种颜色,发射管发出同样的光强,接收管接收到的光强不同,因此输出的电压值也不同;给定一个基准电压,通过对不同输出电压值进行比较,则电路的输出为高低电平。当检测到黑自线时分别输出为高低电平,样不仅系统硬件电路简单,而且信号处理速度快。其路径检测硬件电路如图4所示。
2.4 角度控制单元
系统角度控制单元采用Sanwa公司SRM-102型舵机作为小车方向控制元件。在实际运行过程中,舵机的输出转角与给定的PWM信号值成线性关系,以PWM信号为系统输入信号,实现舵机开环控制。舵机响应曲线和控制电路如图5、图6所示。由于舵机的开环转向力矩足够,单片机通过采集的当前路况,给定PWM控制信号,从而实现舵机的转向,具体的舵机转向角与路径识别单元输出值的关系如表1所列。
2.5 车速控制单元
车速控制单元采用RS-380SH型直流电机对小车速度进行闭环控制,并用MC33886电机驱动H-桥芯片作为电机的驱动元件。车速检测元件则采用日本Nemaicon公司的E40S-600-3-3型旋转编码器,其精度达到车轮每旋转一周,旋转编码器产生600个脉冲。
系统通过MC9S12DGl28输出的PWM信号来控制直流驱动电机。考虑到智能车由直道高速进入弯道时需要急速降速。通过实验证明:当采用MC33886的半桥驱动时,在小车需要减速时只能通过自由停车实现。当小车速度值由80降至50时(取旋转编码器在一定采样时间内检测到的脉冲数作为系统速度的量纲),响应时间约为0.3s,调节效果不佳;当采用MC33886的全桥驱动时,其响应时间约为0.1s。因此系统利用MC33886的全桥结构,实现了小车的快速制动。其电机驱动电路如图7所示。VCC为电源电压7.2V,INl和IN2分别为MC33886的PWM信号输入端口。MC33886的输出端口OUTl和OUT2分别接驱动电机的两端。Dl、D2为芯片的使能端。
3 软件流程设计
本智能车系统的软件设计基于MetrowerksCodeWarrlor CWl2 V3.1编程环境,使用c语言实现。整个系统软件开发、制作、安装、调试都在此环境下实现。
系统软件设计由以下几个模块组成:单片机初始化模块,实时路径检测模块,舵机控制模块,驱动电机控制模块,中断速度采集模块和速度模糊控制模块。系统软件流程如图8所示。
4 实 验
对小车循迹功能实验是通过控制舵机的转向角实现的,而对车速控制功能,则进行了传统模糊控制与参数自整定模糊控制的对比实验。
(1)小车循迹功能实验
系统通过采集到当前路况,对舵机的转向角进行控制米实现小车的循迹功能。在舵机工作电压6.5V情况下,输入的PWM信号与舵机输出的转角一一对应。实验测得,舵机角度从左转-45°至右转45°对应的输入PWM信号范围为131~165。具体的舵机转角与PWM对应关系如表2所列,实验测得小车运行轨迹平滑,循迹图如图9所示。图中细线为任意给定的黑色引导线,粗线为小车循迹所行驶的曲线。
(2)小车速度控制功能实验
在小车给定的三档速度情况下,对小车速度进行传统模糊控制与参数自整定的对比实验。具体车速控制曲线如图10所示。图中纵轴为采样周期(T=O.0ls)的车速检测元件检测到的脉冲数,横轴为采样周期的整倍数。曲线1为速度设定值,曲线2为传统模糊控制响应曲线,曲线3为采用参数自整定模糊控制响应曲线。由小车的速度控制曲线可知,采用传统模糊控制用于智能车系统时,响应时间太,且调节过程中会产生较大幅度的振荡;当采用带参数自整定的模糊控制算法后,小车在减速时能在较小的振幅范围内快速调节到设定值,从而保证了小车的平稳过渡且不影响整体速度。
5 结论
通过对小车进行转向角度和车速控制实验证明:小车能平稳地按照任意给定的黑色引导线行驶,循迹效果良好,速度控制响应快,动态性能良好,稳态误差较小,系统的稳定性和抗干扰能力强。
❺ C语言字符串
代码功能:
1、输入任意行数的内容(如果你想限制最多10行,自己加个变量计数好了)。
2、不想输入时,新行直接回车,会刷新显示统计个数。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedefstructstrs
{
charstr[100];
structstrs*next;
}STRS;
voidcontWord(char*str);//对字符串大小写字母计数
voidintput(STRS**strsHead,STRS**strsTail);//输入字符串,并显示统计结果(每输入完一行回车时,刷新数据)
voidprfStrs(STRS*strsHead,inttj);//打印字符串及统计结果
intdCon=0;//大写字母计数
intnCon=0;//数字计数
intmain()
{
STRS*strsHead=(STRS*)malloc(sizeof(STRS));
strsHead->next=NULL;
STRS*strsTail=NULL;
intput(&strsHead,&strsTail);
return0;
}
voidprfStrs(STRS*strsHead,inttj)//tj=1输出统计结果;tj=0不输出统计结果
{
while(strsHead->next!=NULL)
{
printf("%s
",strsHead->next->str);
strsHead=strsHead->next;
}
if(tj==1)
{
printf("大写字母个数:%d
",dCon);
printf("数字输入个数:%d
",nCon);
}
}
voidcontWord(char*str)
{
intlen=strlen(str),i;
for(i=0;i<len;i++)
{
if(str[i]>='A'&&str[i]<='Z')
dCon++;
if(str[i]>='0'&&str[i]<='9')
nCon++;
}
}
voidintput(STRS**strsHead,STRS**strsTail)
{
STRS*strsNew;
charc;
while(1)
{
strsNew=(STRS*)malloc(sizeof(STRS));
memset(strsNew->str,0,100);
if(strsNew->str[0]==0)
{
c=0;
c=getchar();
if(c=='
')
{
system("cls");
prfStrs(*strsHead,1);
break;
}
else
{
strsNew->str[0]=c;
}
}
gets(&strsNew->str[1]);
strsNew->next=NULL;
if((*strsHead)->next==NULL)
(*strsHead)->next=strsNew;
else
(*strsTail)->next=strsNew;
*strsTail=strsNew;
contWord(strsNew->str);
}
}
❻ 鸡兔同笼,其中共有25个头,80个脚,问鸡笼里有鸡和兔各多少只,用c语言编译出程
#include<stdio.h>
intmain()
{
inttou=25,i,tuzi[10],count=0;
for(i=1;i<=tou;i++)
{
printf("假设兔子%d只,鸡%d只,那么兔脚%d个,鸡脚%d个",i,tou-i,i*4,(25-i)*2);
if(i*4+(25-i)*2==80)
{
tuzi[count++]=i;
printf("与总数80相符,假设成立
");
}
else
printf("与总数80不符,假设不成立
");
}
printf("
------------推算结果------------------
");
for(i=0;i<count;i++)
printf("兔子%d只,鸡%d只
",tuzi[i],tou-tuzi[i]);
return0;
}
❼ 基于混沌影射的文件加密器的设计
这个比较难 你先得了解密码学 密码算法 应用
我建议你去一些相关论坛看看下载些资料 或者你可以发邮件给我要 我这里有一些IDEA RSA HASH MD5 等一些源程序 感兴趣可以给我信息 我的邮箱[email protected]
比如这些代码
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "En Decrypt - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x804 /d "NDEBUG"
# ADD RSC /l 0x804 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
!ELSEIF "$(CFG)" == "En Decrypt - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x804 /d "_DEBUG"
# ADD RSC /l 0x804 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "En Decrypt - Win32 Release"
# Name "En Decrypt - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\des.cpp
# End Source File
# Begin Source File
SOURCE=".\Encrypt-Decrypt 01.cpp"
# End Source File
# Begin Source File
SOURCE=.\key.cpp
# End Source File
# Begin Source File
SOURCE=.\stdafx.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\des.h
# End Source File
# Begin Source File
SOURCE=.\global.h
# End Source File
# Begin Source File
SOURCE=.\stdafx.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project
❽ 关于C++汉诺塔递归算法问题
abc依次表示是三个位置啊,开始,中间,最后那个位置
❾ A/D转换中绝对精度的0.5LSB是什么意思
我们所讲的精度通常是指它的精确度,其实这是错误的。精度又叫做精密度,是跟准确度相对应的一个概念。就像打靶一样,打的准,那就说它的准确度比较高;而每两个靶之间能打出的偏移越小,那它的精密度就越高。精密度与准确度合起来称为精确度。但是鉴于大家都将精度指代了精确度,那以下所说的精度如无特别指出,都是指精确度。
很多人对于精度和分辨率的概念不清楚,这里我做一下总结,希望大家不要混淆。
我们搞电子开发的,经常跟“精度”与“分辨率”打交道,这个问题不是三言两语能搞得清楚的,在这里只作抛砖引玉了。
简单点说,“精度”是用来描述物理量的准确程度的,而“分辨率”是用来描述刻度划分的。从定义上看,这两个量应该是风马牛不相及的。(是不是有朋友感到愕然^_^)。很多卖传感器的JS就是利用这一点来糊弄人的了。简单做个比喻:有这么一把常见的塑料尺(中学生用的那种),它的量程是10厘米,上面有100个刻度,最小能读出1毫米的有效值。那么我们就说这把尺子的分辨率是1毫米,或者量程的1%;而它的实际精度就不得而知了(算是0.1毫米吧)。当我们用火来烤一下它,并且把它拉长一段,然后再考察一下它。我们不难发现,它还有有100个刻度,它的“分辨率”还是1毫米,跟原来一样!然而,您还会认为它的精度还是原来的0.1毫米么?(这个例子是引用网上的,个人觉得比喻的很形象!)
回到电子技术上,我们考察一个常用的数字温度传感器:AD7416。供应商只是大肆宣扬它有10位的AD,分辨率是1/1024。那么,很多人就会这么欣喜:哇塞,如果测量温度0-100摄氏度,100/1024……约等于0.098摄氏度!这么高的精度,足够用了。但是我们去浏览一下AD7416的数据手册,居然发现里面赫然写着:测量精度0.25摄氏度!所以说分辨率跟精度完全是两回事,在这个温度传感器里,只要你愿意,你甚至可以用一个14位的AD,获得1/16384的分辨率,但是测量值的精度还是0.25摄氏度^_^
所以很多朋友一谈到精度,马上就和分辨率联系起来了,包括有些项目负责人,只会在那里说:这个系统精度要求很高啊,你们AD的位数至少要多少多少啊……
其实,仔细浏览一下AD的数据手册,会发现跟精度有关的有两个很重要的指标:DNL和INL。似乎知道这两个指标的朋友并不多,所以在这里很有必要解释一下。
DNL:Differencial NonLiner——微分非线性度
INL:Interger NonLiner——积分非线性度(精度主要用这个值来表示)
他表示了ADC器件在所有的数值点上对应的模拟值,和真实值之间误差最大的那一点的误差值。也就是,输出数值偏离线性最大的距离。单位是LSB(即最低位所表示的量)。
当然,像有的AD如△—∑系列的AD,也用Linearity error 来表示精度。
为什么有的AD很贵,就是因为INL很低。分辨率同为12bit的两个ADC,一个INL=±3LSB,而一个做到了±1.5LSB,那么他们的价格可能相差一倍。
LSB(Least Significant Bit),意为最低有效位;MSB(Most Significant Bit),意为最高有效位,若MSB=1,则表示数据为负值,若MSB=0,则表示数据为正。
当选择模数转换器(ADC)时,最低有效位(LSB)这一参数的含义是什么?有位工程师告诉我某某生产商的某款12位转换器只有7个可用位。也就是说,所谓12位的转换器实际上只有7位。他的结论是根据器件的失调误差和增益误差参数得出的,这两个参数的最大值如下:
失调误差 =±3LSB,
增益误差 =±5LSB,
乍一看,觉得他似乎是对的。从上面列出的参数可知最差的技术参数是增益误差(±5 LSB)。进行简单的数学运算,12位减去5位分辨率等于7位,对吗?果真如此的话,ADC生产商为何还要推出这样的器件呢?增益误差参数似乎表明只要购买成本更低的8位转换器就可以了,但看起来这又有点不对劲了。正如您所判断的,上面的说法是错误的。
让我们重新来看一下LSB的定义。考虑一个12位串行转换器,它会输出由1或0组成的12位数串。通常,转换器首先送出的是最高有效位(MSB)(即LSB + 11)。有些转换器也会先送出LSB。在下面的讨论中,我们假设先送出的是MSB(如图1所示),然后依次送出MSB-1 (即 LSB + 10)和MSB -2(即LSB + 9)并依次类推。转换器最终送出MSB -11(即LSB)作为位串的末位。
LSB这一术语有着特定的含义,它表示的是数字流中的最后一位,也表示组成满量程输入范围的最小单位。对于12位转换器来说,LSB的值相当于模拟信号满量程输入范围除以212 或 4,096的商。如果用真实的数字来表示的话,对于满量程输入范围为4.096V的情况,一个12位转换器对应的LSB大小为1mV。但是,将LSB定义为4096个可能编码中的一个编码对于我们的理解是有好处的。
让我们回到开头的技术指标,并将其转换到满量程输入范围为4.096V的12位转换器中:
失调误差 = ±3LSB =±3mV,
增益误差 =±5LSB = ±5mV,
这些技术参数表明转换器转换过程引入的误差最大仅为8mV(或 8个编码)。这绝不是说误差发生在转换器输出位流的LSB、LSB-1、LSB-2、LSB-3、LSB-4、LSB-5、LSB-6和 LSB-7 八个位上,而是表示误差最大是一个LSB的八倍(或8mV)。准确地说,转换器的传递函数可能造成在4,096个编码中丢失最多8个编码。丢失的只可能是最低端或最高端的编码。例如,误差为+8LSB ((+3LSB失调误差) + (+5LSB增益误差)) 的一个12位转换器可能输出的编码范围为0 至 4,088。丢失的编码为4088至4095。相对于满量程这一误差很小仅为其0.2%。与此相对,一个误差为-3LSB((-3LSB失调误差)—(-5LSB增益误差))的12位转换器输出的编码范围为3至4,095。此时增益误差会造成精度下降,但不会使编码丢失。丢失的编码为0、1和2。这两个例子给出的都是最坏情况。在实际的转换器中,失调误差和增益误差很少会如此接近最大值。
在实际应用中,由于ADC失调或增益参数的改进而使性能提升的程度微不足道,甚至可以忽略。但是,对于那些将精度作为一项设计目标的设计人员来说,这种假设太过绝对。利用固件设计可以很容易地实现数字校准算法。但更重要的是,电路的前端放大/信号调理部分通常会产生比转换器本身更大的误差。
❿ 求一个密码算法实现
void createpassword()
{
#define passwordmax 8//将生成密码的最大长度
char a[]="";//可能的字符
long ndictcount=sizeof(a);//获得密码词典长度
char cpass[passwordmax+2];//将生成的密码
long nminl=1,nmaxl=3;//本例中密码长度从1-3
long array[passwordmax];//密码词典下标
assert(nminl<=nmaxl && nmaxl<=passwordmax);//容错保证
long nlength=nminl;
register long j,i=0;
bool bnext;
cstdiofile file;
file.open("c:\\dict.txt",cfile::modecreate|cfile::modewrite);
while(nlength<=nmaxl)
{
for(i=0;i<passwordmax;i++)
array[i]=0;
bnext=true;
while(bnext)
{
for(i=0;i<nlength;i++)
cpass[i]=a[array[i>;
cpass[i]='\0';
file.writestring(cpass);
file.writestring("\n");
for(j=nlength-1;j>=0;j--)//密码指针进位
{
array[j]++;
if(array[j]!=ndictcount-1)break;
else
{
array[j]=0;
if(j==0)bnext=false;
}
}
}
nlength++;
}
file.close();
}
这个代码的写文件语句效率比较低,为了降低算法复杂度没有优化。
如果要提高写文件的效率,可以使用缓冲区,分批写入。