摩登3官网注册_波波夫:无线电的先驱

小枣君注:之前推送马可尼那篇文章的时候,有读者建议我再写一篇波波夫。今天特此补上。 波波夫,全名叫亚历山大·斯捷潘诺维奇·波波夫(俄文名:Александр Степанович Попов,英文名:Alexander Stepanovich Popov),俄国著名物理学家、发明家,无线电通信的奠基人之一,天线的发明人,电磁波研究的先驱。 波波夫 1859年3月16日,波波夫出生在俄国乌拉尔矿区小镇的一个普通家庭。他的父亲史蒂芬·彼特罗维奇(Stefan Petrovich)是一名当地牧师,他的母亲安娜·史蒂潘诺夫娜(Anna Stepanovna)是一名乡村教师。 波波夫的父亲非常希望儿子也能成为一名神职人员,所以,安排他从小进入神学院进行学习。 然而,波波夫的兴趣并不在神学上。他对自然科学非常着迷,从小就研究木工和电工技术。小学的时候,他就尝试制作了水磨模型和电池。他还用电铃把自家的钟改装成闹钟。 少年波波夫 中学的时候,波波夫的数学和物理成绩特别好,受到校长的重视。 1877年,在经历了漫长的神学院学习之后,波波夫以优异的成绩毕业。18岁的他,拒绝走神职人员路线,而是通过考试,进入了彼得堡大学数学物理系。 青年波波夫 进入大学后,波波夫在电学上的兴趣得以充分释放。他不仅在学校里学习了大量的电学知识,还在圣彼得堡最早的一家发电厂中担任电工,进行勤工俭学。 两年后,波波夫转到彼得堡大学森林学院学习。因为这里学术思想活跃,允许学生自由发展。 这期间,波波夫对炸药产生了浓厚的兴趣。他研究出了用电线遥控炸药爆炸,被同学们称为“炸药专家”。 1882年,波波夫从彼得堡大学毕业,留校担任助教。 1883年,波波夫到“俄罗斯克伦施塔特(Kronstadt)海军鱼雷学校”担任物理和电气工程教师(后来成为物理系主任)。这一期间,波波夫研究了高频电流的实际应用。 1883年11月,波波夫与一位律师的女儿(Raisa Alekseevna)结婚,后来有了两个儿子和两个女儿。 波波夫及家人 1888年,德国科学家海因里希·赫兹(Heinrich Hertz)通过实验证明了电磁波的存在,引起了整个科学界的轰动。大量的科学家开始加入对电磁波的研究和实验,波波夫也是其中一员。 不过,波波夫最开始的兴趣是研究雷暴和闪电等大气现象造成的电磁反应。因为波波夫是海军,极端天气对航海有很大威胁,所以他希望能借助电磁反应进行气象预报。 1894年,波波夫在传统电磁波检测装置(粉末检波器)的基础上,进行改进,大幅提升了灵敏度。 波波夫发明了一种天线装置。他将检波器的一端与天线连接,另一端接地,检测到了许多公里以外大气中的放电。这是人类首次利用天线,接收到自然界的无线电波。 1895年5月7日,波波夫在圣彼得堡召开的俄国物理化学协会年会上,第一次公开演示了他所发明的无线电接收机。他将其称为“雷电指示器”。 波波夫的无线电接收机 1895年7月,波波夫将无线电接收机安装在圣彼得堡林业研究所的气象台上。 几个月后,波波夫发表论文:《金属屑同电振荡的关系》。他在论文中表示,只要有足够的电源,他的设备就可以用于接收来自人造振荡源的信号。 1896年3月24日,波波夫和助手雷布金在俄国物理化学协会的年会上,正式演示了用无线电传递莫尔斯电报码。 当时,雷布金负责拍发信号,波波夫负责接收信号,通信距离是250米。俄罗斯物理学会分会会长佩特罗司赫夫基教授,把接收到的电报字母逐一写在黑板上,最后得到的报文是: “海因里希·赫兹(HEINRICH HERTZ)” 这是波波夫在向前辈致敬。这份电报,是世界上第一份有明确内容的无线电报。 演示结束后,波波夫充满信心地说:“我的仪器在进一步改良以后,就能够凭借迅速的电振荡进行长距离通信”。 不幸的是,当时波波夫并没有进行该装置的专利申请。不久后,1896年6月,意大利人古列尔莫·马可尼(Guglielmo Marconi)申请了自己的无线电报系统专利。 马可尼 后来,马可尼的专利图纸传到俄国,人们发现,图纸上的设计和波波夫的发明非常吻合。俄罗斯物理化学协会声称,波波夫才是真正的无线电发明者。然而,那时候说什么都没用了,国际上已经普遍认可了马可尼的专利权。 1897年,俄国政府利用波波夫的技术,在克伦施塔特建立了无线电台。同年夏天,相隔5公里的两艘俄国军舰,借助无线电台实现了远距离通信。 1900年初,波波夫使电台的通信距离增加到45公里。 同年,俄国海军在波波夫的指导下,在波罗的海中的高戈兰岛设立了无线电台,和芬兰沿海城市科特卡之间实现了无线电通讯。这个电台后来多次协助救援了触礁的军舰和受困的渔民。 波波夫(后排右二) 还是1900年,波波夫的无线电系统在上赢得了金牌。 1901年,波波夫被任命为圣彼得堡大学电气工程学院教授。四年后,被任命为院长。 1906年1月13日,波波夫突发死于脑溢血,年仅47岁。 波波夫的英年早逝,是物理学界的重大损失。不少科学家认为,如果他还能多活一年,1906年度的诺贝尔物理学奖非他莫属(诺贝尔奖只颁发给生者)。 1945年,为了纪念波波夫在无线电方面的卓越贡献,苏联政府部长会议经过投票,将5月7日规定为苏联“无线电节”。此后,苏联经常在这个节日举办活动,纪念波波夫。 波波夫诞辰100周年纪念邮票(1959年) 苏联发行的波波夫纪念邮票() 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3娱乐怎么样?_C语言执行效率如何保证,看这一文就够了!

来自公众号:嵌入式ARM 嵌入式开发基本都会选择C语言 这是因为C语言有出色的可移植性 能在多种不同体系结构的软/硬平台上运行 虽然代码的复用性差 代码的维护性差 扩展性很差 但,C语言简洁紧凑 使用灵活的语法机制 并且,C语言具有很高的运行效率 那么如何保证C语言的执行效率? 嵌入式ARM告诉你! 01 C代码执行效率与哪些因素有关 C代码执行效率与时间复杂度和空间复杂度有关: 1、空间复杂度是指算法在计算机内执行时所需存储空间的度量 2、一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。 记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。 按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),。。。,k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。 02 保障C代码执行效率的原则 1、选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。 在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。 数组索引 指针运算 For(;;){ p=array A=array[t++]; for(;;){ a=*(p++); 。。。。。。。。。。。。。。。    }                      } 指针方法的优点是,array的地址每次装入地址p后,在每次循环中只需对p增量操作。在数组索引方法中,每次循环中都必须根据t值求数组下标的复杂运算。 时间复杂度更低、效率更高的算法可以提高执行效率。一个简单的例子,计算1~100这些数的和,可以循环100次,也可以直接使用求和公式,在执行效率上,是显而易见的。 2、代码尽量简洁,避免重复 在10天学会单片机那本书上看到写的数码管显示那部分代码,选中一个位,然后送数据,再选中一个位,再送数据,依次做完。代码重复率太高了,不仅占用过多的类存,而且执行效率差可读性差,仅仅是实现了功能而已,实际的编程可以做一个循环,for循环或者while循环。这样的代码看起来更有水平。 3、合理使用宏定义 在程序中如果某个变量或寄存器经常用到,可以使用宏定义定义一个新的名代替它。这样的好处是方便修改,比如液晶的数据端总线接的P1,现在想改到P0,那么只需要修改宏定义这里就可以了,编译器编译的时候,会自动的把定义的名替换成实际的名称。 函数和宏的区别就在于,宏占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器 里有栈检查选 项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一 些CPU时间。而宏不存在这个问题。宏仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏的时候,该现象尤其突出。 举例如下: 方法A: #define bwMCDR2_ADDRESS 4#define bsMCDR2_ADDRESS 17int BIT_MASK(int __bf){return ((1U << (bw ## __bf)) - 1)<< (bs ## __bf);}void SET_BITS(int __dst,int __bf, int __val){__dst = ((__dst) & ~(BIT_MASK(__bf))) |/(((__val) << (bs ## __bf))& (BIT_MASK(__bf))))}SET_BITS(MCDR2, MCDR2_ADDRESS,ReGISterNumber); 方法B: #define bwMCDR2_ADDRESS 4#define bsMCDR2_ADDRESS 17#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)#define BIT_MASK(__bf)(((1U << (bw ## __bf)) - 1)<< (bs ## __bf))#define SET_BITS(__dst, __bf, __val)/((__dst) = ((__dst) & ~(BIT_MASK(__bf)))| /(((__val) << (bs ## __bf))& (BIT_MASK(__bf))))SET_BITS(MCDR2, MCDR2_ADDRESS,RegisterNumber); B方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。A方法是其变体,其中滋味还需大家仔细体会。 4、以空间换取时间 程序的复杂度包含时间复杂度和空间复杂度,而随着计算机硬件的发展,渐渐放低了对空间复杂度的要求,在很多情况下,为了换取程序的执行效率,牺牲计算机的空间。比如字符串的相关操作、使用缓存技术等。 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招–以空间换时间。比如说字符串的赋值: 方法A:通常的办法 #define LEN 32char string1 [LEN];memset (string1,0,LEN);strcpy (string1,"This is…

摩登3测速登录地址_双非渣硕的秋招之路总结(已拿抖音研发岗SP)

前言       最近应邀在牛客网写 C++ 求职专栏,又把以前的秋招总结补充了很多东西,现在想想还是发出来,希望能够帮助更多的新手小伙伴们。 个人情况简介 楼主本硕均读于双非院校(普通二本学校)、本硕都是计算机相关专业,英语六级水平,本科时期辅修了一个水的不能再水的英语第二学位。 本科时期学过很多语言:VB、C、C++、Java、C# 都有所涉猎,研究生时期则主攻 Python 和 C++。研二上学期开始系统学习 C++,并且不断系统看书和实践,中间崩溃过、迷茫过、放纵过,但从未放弃,始终相信自己,坚持咬牙走下去。所幸天道酬勤,最终也是拿到了一些不错的 offer 。 投递经历 笔者从 2020.6.15 号正式开始投递简历,到 2020.8.23 号截止一共投递过 94家公司,其中既有提前批(2020年 6 月- 7 月),也包括正式批(2020 年 7 月- 10月)。 小建议:如果说求职者对自身实力不自信,可以多投投一些公司,选择面放宽一些,不要死盯着那几个大厂投。 共计笔试 59 场(最多一天做了 5 场笔试,那天天差点去世),54 家公司给了面试机会,54 家企业中有些企业是免笔试的。 秋招结果        最终成功走到了 6 家公司的 offer 环节:字节跳动研发岗 SP、华为通用软件开发、百度 C++ 研发岗、B 站后端研发岗、深信服 C++ 研发岗以及农业银行研发岗,最后签了字节跳动,也是自己心心念念的大厂之一,十分满意了~         接下来从 6 个方面对秋招进行复盘和总结,希望能够帮到大家鸭,特别是大三大四的小学弟们。 1、算法         在秋招过程中,算法是极其重要的,再次重申一遍,真的很重要!笔试就不提了,算法不过关,笔试基本凉凉,面试过程中基本都要手撕代码,很多面试中算法题是具有一票否决权的,如果你能够顺利解出来,面试不敢说一定会过,至少是有很大加分项,但如果算法题做不出来或者说 bug 太多调试不通的话,面试上基本上就跪了(个人以及身边朋友经历,不一定准确)。在牛客网上也看到过很多基础很好的牛友就是因为面试过程中的算法题没解出来而直接饮恨的,希望大家千万重视算法这一块,千万千万要重视算法。         我大概在力扣上刷了 300+,HOT100 都刷了,剑指 offer 刷了 3 遍,刷完这些基本够用了,自己也有注意总结题型,常见题型就是那些,所以算法题基本没怎么拉过我后腿。一般来说,主要考的就是动态规划、贪心、二叉树、链表、数组、字符串之类的。 推荐资料: 力扣1-300题(前300道题非常经典,建议学有余力的同学都刷一刷) 力扣HOT100(跟上面有不少是重复的,刷的时候要注意总结) 啊哈!算法、大话数据结构(这两本书都是面向新手的图书,图画很多,有基础的可以直接跳过不看) 剑指offer(这本书不需要多做介绍,校招必备) 挑战程序设计竞赛(这本书属于进阶一点的算法书籍了,作者是ACM-ICPC全球总冠军,可以说是世界顶级程序设计高手的经验总结了,需要慢慢消化,经典题型太多) 程序员代码面试指南(左程云大神的书,阿秀并没有看完,只是看了其中的海量数据处理部分的题目就已经十分受用了,在百度三面中就考查到了其中的海量数据集处理的问题) 2、操作系统         操作系统是比较重要的,面试三大要点之一(操作系统、计网、数据库),我是在 B 站上看过一些操作系统视频,同时自己慢慢看书、看博客学的。其中死锁、虚拟内存、堆栈、进程线程、内存管理、磁盘调度等都是重点,也是面试过程中问的比较多的一些知识点。你如果能够在面试过程中讲出来一些具体的操作系统知识,而不是泛泛而谈,肯定是很加分的,比如常见知识点进程线程区别,在提到线程切换比进程更快时,你如果能够很清楚明白的说出来进程切换做了哪些、线程切换做了哪些以及线程为什么比进程快,毫无疑问很加分的。  推荐资料: B站哈工大操作系统:https://www.bilibili.com/video/BV1d4411v7u7 B站清华大学操作系统:https://www.bilibili.com/video/BV1js411b7vg B站美国麻省理工MIT 6.828操作系统神级课程:https://www.bilibili.com/video/BV1px411E7ST 现代操作系统(也是讲操作系统的一本好书,讲的很细) 深入理解计算机系统(大名鼎鼎的CSAPP,被誉为“和金子一样重要的计算机基础书籍” , 很厚的一本黑皮书,需要慢慢看) 现代操作系统:原理与实现(上海交通大学陈海波教授的著作,书中主要介绍操作系统的理论与具体实现细节等,感觉不如CSAPP) 3、计算机网络         计算机网络也是重点之一,特别是 HTTP 以及 TCP/UDP 相关知识点,算是校招必备考点了,面试必问,但是难度是逐年上升的,原因可能就在于内卷程度越来越严重了吧。比如说以前对于三次握手四次挥手只问过程,现在直接让面试者画出客户端以及服务器端的各个状态码以及解释各种意外情况,比如 SYN 请求丢失会怎么样?         建议计网的学习先从视频入手,然后再看经典书籍,毕竟视频中的知识都是别人总结好又给你讲解的,只有自己亲自揣摩、亲自动手实践得来的知识才是自己的,自己学来的才是真,经过实践方知分晓的~ 推荐资料: B站韩立刚老师的计算机网络(韩老师讲课诙谐易懂,让你在哈哈大笑中学到很多知识点:https://www.bilibili.com/video/BV17p411f7ZZ) 图解HTTP、图解TCP/IP(这两本书比较简单,日本人写的,把复杂的知识点简单化) 网络是怎样连接的(这本书紧紧围绕一个问题:输入一个URL,直到我们在网页端看到请求的内容,这中间发生了什么?抽丝剥茧将这个问题逐步细化,带你走完整个网页访问的过程) 计算机网络:自顶向下方法 (也是常见经典书籍之一,重点看第三章传输层TCP/UDP) 4、Linux        C++ 跟 Linux 基本是离不开的,特别是后端方向跟网络通信关系很大。在实际工作里,很多成熟的项目都是在 Linux 上进行开发的。所以有必要学一些 Linux 以及一些网络通信编程,网络通信涉及到的知识点很多,比如 IO 模型、线程池、多线程之类的。本人在秋招过程中被问过不少网络通信的问题,最频繁的就是 select、poll、epoll…

摩登3测速代理_数据处理,你不得不会的「正则表达式」

若要判断一个输入的QQ号是否有效,你会如何处呢? 首先你得分析一下其对应规则,依次列出: 长度大于5,小于等于11; 首位不能为0; 是否为纯数字? 规则既列,接着就该尝试实现了,那么用什么来表示字符串呢?在C++中,最容易想到的就是string了,其中提供了许多成员函数可以处理字符串,所以有了如下实现: 1std::string qq; 2std::cin >> qq; 3 4// 1. 判断位数是否合法 5if (qq.length() >= 5 && qq.length() <= 11) 6{ 7    // 2. 判断是否非'0'开头 8    if (qq[0] != '0') 9    {10        // 3. 判断是否为纯数字11        auto pos = std::find_if(qq.begin(), qq.end(), [](const char& ch) {12            return ch < '0' || ch > '9';13        });14        if (pos == qq.end())15            std::cout << "valid.\n";16    }17} 虽然写出来了,但是有没有感到异常繁琐?这还仅仅是一个对应规则较少的处理,便如此麻烦,若是要检测IP地址、身份证号,或是解析一段HTML数据,或是其它更复杂的字串,那岂非更令人叫苦不迭? 当然,也有许多扩展库对字符串处理提供了方便,其中比较好用的是boost中的string_algo库(已于C++17纳入了标准库,并改名为string_view),但本篇主要说C++11的regex库,其对复杂数据的处理能力非常强,比如可以用它来检测QQ号: 1std::regex qq_reg("[1-9]\\d{4,11}");2bool ret = std::regex_match(qq, qq_reg);3std::cout << (ret ? "valid" : "invalid") << std::endl; 是不是超级方便呢?那么接下来便来看看如何使用「正则表达式」。 正则程序库(regex) 「正则表达式」就是一套表示规则的式子,专门用来处理各种复杂的操作。 std::regex是C++用来表示「正则表达式」(regular expression)的库,于C++11加入,它是class std::basic_regex<>针对char类型的一个特化,还有一个针对wchar_t类型的特化为std::wregex。 正则文法(regex syntaxes) std::regex默认使用是ECMAScript文法,这种文法比较好用,且威力强大,常用符号的意义如下: 符号 意义 ^ 匹配行的开头 $ 匹配行的结尾 . 匹配任意单个字符 […] 匹配[]中的任意一个字符 (…) 设定分组 \ 转义字符 \d 匹配数字[0-9] \D \d 取反 \w 匹配字母[a-z],数字,下划线 \W \w 取反 \s 匹配空格 \S \s 取反 + 前面的元素重复1次或多次 * 前面的元素重复任意次 ? 前面的元素重复0次或1次 {n} 前面的元素重复n次 {n,} 前面的元素重复至少n次 {n,m} 前面的元素重复至少n次,至多m次 | 逻辑或 上面列出的这些都是非常常用的符号,靠这些便足以解决绝大多数问题了。 匹配(Match) 字符串处理常用的一个操作是「匹配」,即字符串和规则恰好对应,而用于匹配的函数为std::regex_match(),它是个函数模板,我们直接来看例子: 1std::regex reg("<.*>.* "); 2bool ret = std::regex_match("value", reg); 3assert(ret); 4 5ret = std::regex_match(" value " , reg); 6assert(!ret); 7 8std::regex reg1("<(.*)>.* "); 9ret = std::regex_match(" value ", reg1);10assert(ret);1112ret = std::regex_match(" value ", std::regex("<(.*)>value "));13assert(ret);1415// 使用basic文法16std::regex reg2("<\\(.*\\)>.* ", std::regex_constants::basic);17ret = std::regex_match("value", reg2);18assert(ret); 这个小例子使用regex_match()来匹配xml格式(或是html格式)的字符串,匹配成功则会返回true,意思非常简单,若是不懂其中意思,可参照前面的文法部分。 对于语句中出现\\,是因为\需要转义,C++11以后支持原生字符,所以也可以这样使用: 1std::regex reg1(R"(<(.*)>.* )");2auto ret = std::regex_match(" value ", reg1);3assert(ret); 但C++03之前并不支持,所以使用时要需要留意。 若是想得到匹配的结果,可以使用regex_match()的另一个重载形式: 1std::cmatch m; 2auto ret = std::regex_match(" value ", m, std::regex("<(.*)>(.*) ")); 3if (ret) 4{ 5    std::cout << m.str() << std::endl; 6    std::cout << m.length() << std::endl; 7    std::cout << m.position() << std::endl; 8} 910std::cout << "----------------" << std::endl;1112// 遍历匹配内容13for (auto i = 0; i < m.size(); ++i)14{15    // 两种方式都可以16    std::cout << m[i].str() << " " << m.str(i) << std::endl;17}1819std::cout << "----------------" << std::endl;2021// 使用迭代器遍历22for (auto pos = m.begin(); pos != m.end(); ++pos)23{24    std::cout << *pos << std::endl;25} 输出结果为: 1 value 216 30 4---------------- 5…

摩登3咨询:_5G数字化运维,到底是如何实现的?

从2G到4G,移动通信改变了我们每一个人的生活。已经到来的5G,更是加速了各个行业的数字化转型。 就在移动通信网络改变人类的同时,它自身也在发生巨变——网元变得越来越多,网元之间的接口和协议也变得越来越复杂。 令人头秃的2/3/4/5G网络 那么,你有没有想过,面对如此复杂的网络,我们究竟该如何进行有效的 管理和维护 呢? 其实,我们可以把5G看作是一个人。我们对人进行健康监测,通常是在他身上安装监测设备,采集样本(例如验血、心电图、X光等)。 根据采集到的数据,我们再进行指标分析,最终得出健康报告。 早期的通信网络也是这样,每个网元设备都有自己的管理软件,通过软件可以查看该网元的指标情况。 但是,这种方式过于分散,属于典型的“头痛医头,脚痛医脚”。对人体来说姑且可行,但是,对于移动通信网络(尤其是5G这样的复杂网络)来说,增加了运维难度。 因为,一个业务问题,通常涉及到多个(甚至十多个)网元。全靠人工分散运维的话,需要面对巨大的工作量,很难快速找到问题根因。 真正优秀的医生,会根据身体全方位的检查结果汇总,给出准确的诊疗判断。网络运维,亦是如此。 网络是一个整体。对于网络的维护,应该“站得更高,看得更全”。 我们可以在每一个接口安装探针,进行抓包,获取数据。然后,对数据进行汇总整理,找出规律,并给出结论。 这种抓取网元之间接口数据包,并对其进行分析和识别的技术,就是业界常说的深度报文识别技术,DPI(Deep Packet Inspection)。 而抓取报文之后形成的记录,则被称为XDR(X Data Recording)。 常见的XDR有两种,分别是信令XDR和业务XDR: (1) 信令XDR:记录网元间发号施令的详细过程,这些指令包括接入、释放、切换等。 (2) 业务XDR:记录用户有关的信息如IMSI,以及用户上网、打电话等业务的详细过程。 大家会注意到,单个接口产生的XDR,只会记录该接口相关的信息,即“单接口XDR”。 然而,任何一次完整的用户行为(比如打电话),肯定会涉及到多个接口。 因此,我们在采集到多个相关接口的“单接口XDR”数据之后,还需要根据用户号码、时间顺序等,对它们进行关联、合成,形成能够全面描述整个业务过程的“完整XDR”。 XDR的关联合成 这些完整XDR,会被打包送到上层运维系统中,等待解析、使用。 字段名 说明 Length 整个XDR所占用的字节数 Interface 接口名称:Mw/Mg/Mi/Mj/ISC/Gm/…… XDR ID XDR唯一编号 IMSI IMSI号码 Procedure  Type 流程类型编码,取值如下:1:Register(注册)2:Deregister(注销) 3:3rd-Register(第三方注册)4:3rd-Deregister(第三方注销) 5:Calling(语音通话) 6:…… Procedure  Start Time 业务流程开始时间 Procedure  End Time 业务流程结束时间 …… …… XDR内部信息示例 如上表所示, XDR里面的各种字段信息,完整地描述了一次业务流程。例如,Procedure Type字段为5,则表明该次业务类型是 “Calling(语音通话)”。 大家搞明白了吧?DPI技术,有点像移动通信网络的“生命监测仪”,是运维支撑工作的神器。 接下来,我们就通过“语音通话”这个基本业务,深入了解一下DPI究竟如何帮助运维人员进行“5G生命监测”。 大家应该都听说过,5G通过VoNR(Voice over NR),实现对语音通话业务的支持。 其实,在5G网络建设早期,5G信号并没有做到无缝覆盖。所以,为保证通话的成功率,我们可能会更多地采用另一种语音技术方案,那就是EPS Fallback。 简单来说,就是当工作在5G网络上的终端,发起语音呼叫或有语音呼入时,网络通过切换流程,将5G终端切换到4G网络上,通过VoLTE(Voice over LTE)技术提供语音业务。 这样一来,打通5G语音电话,就需要跨无线域、5GC域(5G核心网)、EPC域(4G核心网)、IMS域,调动数量众多的网元、接口,进行大规模协作。 EPS Fallback的业务流程大致可以分为 起呼、回落、接通、返回 四大阶段,整个过程极为复杂(如下图所示)。 EPS Fallback的信令流程 这么多域,这么多网元,这么多接口,这么多信令,稍有一丁点差错,就会影响用户的语音通话体验,甚至导致通话失败。这么复杂的协同流程,一旦出现问题,想要反查原因,也是非常困难的。 在中兴通讯的EPS Fallback方案中,为了让用户能够 “打得通、接得快、不掉话、听得见” ,他们针对起呼、回落、接通、保持全流程建立了KQI-KPI指标体系。 KQI:关键业务指标,Key Quality Indicator KPI:关键性能指标,Key Performance Indicator 5G语音业务感知指标体系 指标体系建好之后,就轮到中兴通讯 VMAX智能大数据平台 闪亮登场了。 这个平台就是前面我们所说的移动通信网络“生命监测仪”。它可以通过查询XDR(监测数据),关联合成之后,完整“还原”一次EPS FallBack业务流程。 结合前面提到的“生命指标体系”,VMAX平台进行多维分析、信令回溯,就能精准定位出“病因(问题点)”。 中兴通讯VMAX平台的架构并不复杂,它分为数据采集层、数据解码层和应用层,可以面向核心网域以及无线域进行数据采集和解码。合成后的数据,可以提供给上层应用进行深度分析。 VMAX 5G DPI系统架构 大家应该能看出来,EPS Fallback 5G语音业务分析只是中兴VMAX平台强大功能的一个缩影。基于对XDR的深度分析,整个系统能够实现对网络、业务和用户的全面洞察。 运营商不仅可以了解网络各方面的运行状态,还可以监控具体业务的运行质量,更能够实现用户体验的主动感知。 除了发现和解决问题之外,VMAX系统还可以用于 精准营销 。 VMAX采用业界领先的加密业务识别技术,可以实时DPI解析用户流程的业务特征,判断业务流量类型。 也就是说,借助VMAX,运营商可以知道用户到底在使用哪种类型的App(抖音、微信、爱奇艺等)。这样一来,可以建立用户画像,进行针对性的推广营销(例如定向流量包推荐、App权益赠送)。 中兴VMAX可以识别10000种以上的协议,识别准确率高达95%,远远高于行业80%的平均水平。系统的规则库会持续更新,增加对最新业务的识别能力。 相比行业同类产品,中兴VMAX还具有以下特点: 全域数据采集能力 中兴通讯在信令分析领域有20多年的技术沉淀,是业内唯一具备2/3/4/5G/NB-IoT全网全域数据采集能力的厂家,同时具备核心网、无线的事务级话单关联能力,真正能做到业务端到端分析。 智能的AI采集,赋能5G 针对5G网络特征,中兴VMAX可以提供基于切片的采集方案,分场景、分时间、分区域、分流量等进行智能化DPI采集。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册开户_交织型ADC到底是个啥?今天咱们就科普一下~

在当今的许多细分市场,交错式模数转换器(ADC)在许多应用中都具有多项优势。在通信基础设施中,存在着一种推动因素,使ADC的采样速率不断提高,以便支持多频段、多载波无线电,除此之外满足DPD(数字预失真)等线性化技术中更宽的带宽要求。在军事和航空航天领域,采样速率更高的ADC可让多功能系统用于通信、电子监控和雷达等多种应用中——此处仅举数例。工业仪器仪表应用中始终需要采样速率更高的ADC,以便充分精确地测量速度更高的信号。 首先,一定要准确地了解交织型ADC是什么。要了解交错,最好了解一下实际发生的情况以及它是如何实现的。有了基本的了解后,再讨论交错的好处。当然,我们都知道,天下没有免费的午餐,因此需要充分评估和验证交织采样相关的技术难点。 关于交错  若ADC为交错式,则两个或两个以上具有固定时钟相位差关系的ADC用来同步采样输入信号,并产生组合输出信号,使得采样带宽为单个ADC带宽的数倍。利用m个ADC可让有效采样速率增加m倍。为简便起见并易于理解,我们重点考察两个ADC的情况。这种情况下,如果两个ADC的每一个采样速率均为fS, 且呈交错式,则最终采样速率为2× fS。这两个ADC必须具有确定的时钟相位差关系,才能正确交错。时钟相位关系由等式1给出,其中:n是某个特定的ADC,m是ADC总数。 举例而言,两个ADC采样速率均为100 MSPS且呈交错式,因此采样速率为200 MSPS。此时,等式1可用来推导出两个ADC的时钟相位关系,如等式2和等式3。 注意,如果已知时钟相位关系,便可确定不同量化值的组合输出。图1以图形说明时钟相位关系,以及两个100 MSPS交织型ADC的样本结构。注意180°时钟相位关系,以及样本是如何交 错的。输入波形也可由两个ADC进行采样。在这种情况下,采用经过2分频的200 MHz时钟输入,并所需的时钟相位发送至每个ADC,便可实现交错。 图1. 两个交错式100 MSPS ADC—基本原理图。 此概念还可以另一种方式表达,如图2所示。通过将这两个100MSPS ADC以交错方式组合,采样速率便能增加至200 MSPS。这样每个奈奎斯特区可以从50 MHz扩展到100 MHz,使工作时的可 用带宽翻倍。增加的工作带宽可为多个市场领域的应用带来诸多优势。无线电系统可以增加其支持的频段数;雷达系统可以增加空间分辨率;而测量设备可以实现更高的模拟输入带宽。 图2. 两个交错式100 MSPS ADC—时钟和样本。 交错的优势  交错结构的优势可惠及多个细分市场。交织型ADC最大好处是增加了带宽,因为ADC的奈奎斯特带宽更宽了。同样,我们举两个100 MSPS ADC交错以实现200 MSPS采样速率的例子。图3显示通过交错两个ADC,可以大幅增加带宽。这为多种应用场景产生了诸多收益。就像蜂窝标准增加了通道带宽和工作频段数一样,对ADC可用带宽的要求也越来越高。此外,在军事应用中,需要更好的空间识别能力以及增加后端通信的通道带宽,这些都要求ADC提供更高的带宽。由于这些领域对带宽的要求越来越高,因此需要准确地测量这些信号。因此,为了正确地获取和测量这些高带宽信号,测量设备也需要更高的带宽。很多设计中的系统要求其实领先于商用ADC技术。交错结构可以弥补这一技术差距。 图3. 两个交织型ADC——奈奎斯特区。 增加采样速率能够为这些应用提供更多的带宽,而且频率规划更轻松,还能降低通常在ADC输入端使用抗混叠滤波器时带来的复杂性和成本。面对这些优势,大家一定想知道需要为此付 出什么代价。就像大多数事情一样,天下没有免费的午餐。交织型ADC具有更高的带宽和其他有用的优势,但在处理交织型ADC时也会带来一些挑战。 交错挑战  在交错组合ADC时存在一些挑战,还有一些注意事项。由于与交错ADC相关的缺陷,输出频谱中会出现杂散。这些缺陷基本上是两个正在交错的ADC之间不匹配。输出频谱中的杂散导致的基本不匹配有四种。包括失调不匹配、增益不匹配、时序不匹配和带宽不匹配。 其中最容易理解的可能是两个ADC之间的失调不匹配。每个ADC都会有一个相关的直流失调值。当两个ADC交错并在两个ADC之间来回交替采样时,每个连续采样的直流失调会发生变化。图4 举例说明了每个ADC如何具有自己的直流失调,以及交错输出如何有效地在这两个直流失调值之间来回切换。输出以fS/2的速率在这些失调值之间切换,将导致位于fS/2的输出频谱中产生杂散。由于不匹配本身没有频率分量,并且仅为直流,因此出现在输出频谱中的杂散频率仅取决于采样频率,并将始终出现fS/2在2频率下。杂散的幅度取决于ADC之间失调不匹配的幅度。不匹配值越大,杂散值就越大。为了尽可能减少失调不匹配导致的杂散,不需要完全消除每个ADC中的直流失调。这样做会滤除信号中的所有直流成分,不适合使用零中频(ZIF)架构的系统,该架构信号成分复杂,DC量实际是有用信号。相反,更合适的技术是让其中一个ADC的失调与另一个ADC匹配。选择一个ADC的失调作为基准,另一个ADC的失调设置为尽可能接近的值。失调值的匹配度越高,在fS/2产生的杂散就越低。 图4. 失调不匹配。 交错时要注意的第二个不匹配是ADC之间的增益不匹配。图5显示了两个交错式转换器之间的增益不匹配。在这种情况下,有一个不匹配频率分量。为了观察这种不匹配,必须向ADC施加 信号。对于失调不匹配,无需信号即可查看两个ADC的固有直流失调。对于增益不匹配,如果不存在信号,就无法测量增益不匹配,因而无法了解增益不匹配。增益不匹配将会产生与输入频率和采样速率相关的输出频谱杂散,出现在fS/2 ± fIN处。为了最大程度地降低增益不匹配引起的杂散,采用了与失调不匹配类似的策略。选择其中一个ADC的增益作为基准,另一个ADC的增益设置为尽可能接近的值。每个ADC增益值的匹配度越高,输出频谱中产生的杂散就越小。 图5. 增益不匹配。 接下来,我们必须探讨两个ADC之间的时序不匹配。时序不匹配有两个分量:ADC模拟部分的群延迟和时钟相位偏差。ADC中的模拟电路具有相关的群延迟,两个ADC的群延迟值可能不同。此外还有时钟偏斜,它也包括两个分量:各ADC的孔径不确定性和一个与输入各转换器的时钟相位精度相关的分量。图6以图形说明ADC时序不匹配的机制和影响。与增益不匹配杂散相似,时序不匹配杂散也与输入频率和采样速率呈函数关系,出现在fS/2 ± fIN处。 图6. 时序不匹配 为了尽可能降低时序不匹配引起的杂散,需要利用合适的电路设计技术使各转换器模拟部分的群延迟恰当匹配。此外,时钟路径设计必须尽量一致以使孔径不确定性差异最小。最后,必须精确控制时钟相位关系,使得两个输入时钟尽可能相差180°。与其他不匹配一样,目标是尽量消除引起时序不匹配的机制。 最后一个不匹配可能最难理解和处理:带宽不匹配。如图7所示,带宽不匹配具有增益和相位/频率分量。这使得解决带宽不匹配问题变得更为困难,因为它含有另外两个不匹配参数的分量。然而,在带宽不匹配中,我们可在不同的频率下看到不同增益值。此外,带宽具有时序分量,使不同频率下的信号通过每个转换器时具有不同的延迟。出色的电路设计和布局布线实践是减少ADC间带宽失配的最好方法。ADC之间的匹配越好,则产生的杂散就越少。正如增益和时序不匹配会导致在输出频谱的fS/2 ± fIN处产生杂散一样,带宽不匹配也会在相同频率处产生杂散。 图7. 带宽不匹配。 现在我们已经讨论了交错ADC时引起问题的四种不同的不匹配,可以发现有一个共性。四个不匹配中有三个会在输出频谱的fS/2 ± fIN处产生杂散。失调不匹配杂散很容易识别,因为只有它位于fS/2处,并可轻松地进行补偿。增益、时序和带宽不匹配都会在输出频谱的fS/2 ± fIN 处产生杂散;因此,随之而来的问题是:如何确定它们各自的影响。图8以简单的图形方式指导如何从交织型ADC的不同不匹配中识别杂散来源。 图8. 交错式不匹配的相互关系。 如果只是考察增益不匹配,那么它就是一个低频(或直流)类型的不匹配。通过在直流附近执行低频增益测量,然后在较高的频率处执行增益测量,可将带宽不匹配的增益分量与增益不 匹配分离。增益不匹配与频率无函数关系,而带宽不匹配的增益分量与频率呈函数关系。对于时序不匹配,可以采用类似的方法。在直流附近执行低频测量,然后在较高的频率下执行后续测量,以便将带宽不匹配的时序分量与时序不匹配分离。 结论  最新通信系统设计、尖端雷达技术和超高带宽测量设备似乎始终领先于现有的ADC技术。在这些需求的推动下,ADC的用户和制造商都想方设法,试图跟上这些需求的步伐。与提高典型ADC转换速率的传统方式相比,交错ADC可以更快的速度实现更宽的带宽。将两个或更多ADC交错起来,可以增加可用带宽,并以更快的速度满足系统设计要求。然而,交错ADC并非没有代价,ADC之间的不匹配不容忽视。虽然不匹配确实存在,但了解其本质及如何正确处理它们,设计人员就能更加明智地利用这些交织型ADC,并满足最新系统设计不断增长的要求。 原文转自 关于世健 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册开户_一文彻底搞懂zookeeper 核心知识点(修订版)

初识 zookeeper Zookeeper 它作为Hadoop项目中的一个开源子项目,是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务。 1、zookeeper数据模型 zookeeper 维护了一个类似文件系统的数据结构,每个子目录(/微信、/微信/公众号)都被称作为 znode 即节点。和文件系统一样,我们可以很轻松的对 znode 节点进行增加、删除等操作,而且还可以在一个znode下增加、删除子znode,区别在于文件系统的是,znode可以存储数据(严格说是必须存放数据,默认是个空字符)。 由于zookeeper是目录节点结构,在获取和创建节点时,必须要以“/” 开头,否则在获取节点时会报错 Path must start with / character。 [zk: localhost:2181(CONNECTED) 13] get testCommand failed: java.lang.IllegalArgumentException: Path must start with / character 根节点名必须为“/XXX”,创建子节点时必须要带上根节点目录“/XXX/CCC”、“/XXX/AAA”。 例如:想要获取下图 程序员内点事 节点必须拼接完整的路径 get /微信/公众号/程序员内点事 get /微信/公众号/程序员内点事 在这里插入图片描述 znode被用来存储 byte级 或 kb级 的数据,可存储的最大数据量是1MB(请注意:一个节点的数据量不仅包含它自身存储数据,它的所有子节点的名字也要折算成Byte数计入,因此znode的子节点数也不是无限的)虽然可以手动的修改节点存储量大小,但一般情况下并不推荐这样做。 2、znode节点属性 一个znode节点不仅可以存储数据,还有一些其他特别的属性。接下来我们创建一个/test节点分析一下它各个属性的含义。 [zk: localhost:2181(CONNECTED) 6] get /test456cZxid = 0x59ac //ctime = Mon Mar 30 15:20:08 CST 2020mZxid = 0x59admtime = Mon Mar 30 15:22:25 CST 2020pZxid = 0x59accversion = 0dataVersion = 2aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0   节点属性 注解 cZxid 该数据节点被创建时的事务Id mZxid 该数据节点被修改时最新的事物Id pZxid 当前节点的父级节点事务Id ctime 该数据节点创建时间 mtime 该数据节点最后修改时间 dataVersion 当前节点版本号(每修改一次值+1递增) cversion 子节点版本号(子节点修改次数,每修改一次值+1递增) aclVersion 当前节点acl版本号(节点被修改acl权限,每修改一次值+1递增) ephemeralOwner 临时节点标示,当前节点如果是临时节点,则存储的创建者的会话id(sessionId),如果不是,那么值=0 dataLength 当前节点所存储的数据长度 numChildren 当前节点下子节点的个数 我们看到一个znode节点的属性比较多,但比较主要的属性还是zxid、version、acl 这三个。 Zxid: znode节点状态改变会导致该节点收到一个zxid格式的时间戳,这个时间戳是全局有序的,znode节点的建立或者更新都会产生一个新的。如果zxid1的值 < zxid2的值,那么说明zxid2发生的改变在zxid1之后。每个znode节点都有3个zxid属性,cZxid(节点创建时间)、mZxid(该节点修改时间,与子节点无关)、pZxid(该节点或者该节点的子节点的最后一次创建或者修改时间,孙子节点无关)。 zxid属性主要应用于zookeeper的集群,这个后边介绍集群时详细说。 Version: znode属性中一共有三个版本号dataversion(数据版本号)、cversion(子节点版本号)、aclversion(节点所拥有的ACL权限版本号)。 znode中的数据可以有多个版本,如果某一个节点下存有多个数据版本,那么查询这个节点数据就需要带上版本号。每当我们对znode节点数据修改后,该节点的dataversion版本号会递增。当客户端请求该znode节点时,会同时返回节点数据和版本号。另外当dataversion为 -1的时候可以忽略版本进行操作。对一个节点设置权限时aclVersion版本号会递增,下边会详细说ACL权限控制。 验证一下,我们修改/test节点的数据看看dataVersion有什么变化,发现dataVersion属性变成了 3,版本号递增了。 [zk: localhost:2181(CONNECTED) 10] set /test 8888cZxid = 0x59acctime = Mon Mar 30 15:20:08 CST 2020mZxid = 0x59b6mtime = Mon Mar 30 16:58:08 CST 2020pZxid = 0x59accversion = 0dataVersion = 3aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 0 3、znode的类型 zookeeper 有四种类型的znode,在用客户端 client 创建节点的时候需要指定类型。 zookeeper.create("/公众号/程序员内点事", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); PERSISTENT-持久化目录节点 :client创建节点后,与zookeeper断开连接该节点将被持久化,当client再次连接后节点依旧存在。 PERSISTENT_SEQUENTIAL-持久化顺序节点 :client创建节点后,与zookeeper断开连接该节点将被持久化,再次连接节点还存在,zookeeper会给该节点名称进行顺序编号,例如:/lock/0000000001、/lock/0000000002、/lock/0000000003。 EPHEMERAL-临时目录节点 :client与zookeeper断开连接后,该节点即会被删除 EPHEMERAL_SEQUENTIAL-临时顺序节点 :client与zookeeper断开连接后,该节点被删除,会给该节点名称进行顺序编号,例如:/lock/0000000001、/lock/0000000002、/lock/0000000003。 节点的ACL权限控制 ACL:即 Access Control List (节点的权限控制),通过ACL机制来解决znode节点的访问权限问题,要注意的是zookeeper对权限的控制是基于znode级别的,也就说节点之间的权限不具有继承性,即子节点不继承父节点的权限。 zookeeper中设置ACL权限的格式由 : : 三段组成。 schema :表示授权的方式 world:表示任何人都可以访问 auth:只有认证的用户可以访问 digest:使用username  :password用户密码生成MD5哈希值作为认证ID host/ip:使用客户端主机IP地址来进行认证 id:权限的作用域,用来标识身份,依赖于schema选择哪种方式。 acl:给一个节点赋予哪些权限,节点的权限有create,、delete、write、read、admin 统称 cdwra。 1、world:表示任何人都可以访问 我们用 getAcl 命令来看一下,没有设置过权限的znode节点,默认情况下的权限情况。 [zk: localhost:2181(CONNECTED) 12] getAcl /test'world,'anyone: cdrwa 看到没有设置ACL属性的节点,默认schema 使用的是world,作用域是anyone,节点权限是cdwra,也就是说任何人都可以访问。 那我们如果要给一个schema 为非world的节点设置world权限咋搞? setAcl /test world:anyone:crdwa 2、auth:只有认证的用户可以访问 schema 用auth授权表示只有认证后的用户才可以访问,那么首先就需要添加认证用户,添加完以后需要对认证的用户设置ACL权限。 addauth digest test:password(明文) 需要注意的是设置认证用户时的密码是明文的。 [zk: localhost:2181(CONNECTED) 2] addauth digest user:user //用户名:密码[zk: localhost:2181(CONNECTED) 5] setAcl /test auth:user:crdwa[zk: localhost:2181(CONNECTED) 6] getAcl /test'digest,'user:ben+k/3JomjGj4mfd4fYsfM6p0A=: cdrwa 实际上我们这样设置以后,就是将这个节点开放给所有认证的用户,setAcl /test auth:user:crdwa 相当于setAcl /test auth::crdwa。 3、digest:用户名:密码的验证方式 用户名:密码方式授权是针对单个特定用户,这种方式是不需要先添加认证用户的。 如果在代码中使用zookeeper客户端设置ACL,那么密码是明文的,但若是zk.cli等客户端操作就需要将密码进行sha1及base64处理。 setAcl   digest: : : setAcl /test digest:user:jalRr+knv/6L2uXdenC93dEDNuE=:crdwa 那么密码如何加密嘞?有以下几种方式: 通过shell命令加密 echo -n  : <password> | openssl dgst -binary -sha1 | openssl base64 使用zookeeper自带的类库org.apache.zookeeper.server.auth.DigestAuthenticationProvider生成 java -cp /zookeeper-3.4.13/zookeeper-3.4.13.jar:/zookeeper-3.4.13/lib/slf4j-api-1.7.25.jar \  org.apache.zookeeper.server.auth.DigestAuthenticationProvider \  root:rootroot:root->root:qiTlqPLK7XM2ht3HMn02qRpkKIE= 4、host/ip:使用客户端主机IP地址来进行认证 这种方式就比较好理解了,通过对特定的IP地址,也可以是一个IP段进行授权。…

摩登三1960_电子系统越来越复杂,我们需要更灵活的电源管理解决方案~

随着技术不断进步,所有电子系统中包含的功能内容数量不断增多,可用空间却在不断减少。手机有触摸屏、手电筒、省电模式和精巧的摄像头。以前汽车仪表盘上只有基本的AM收音机和少量简易的仪表,现在却装满了精密的仪器仪表、卫星收音机、蓝牙®、GPS和其他基于手机的网络连接、多彩车灯以及无数的USB接口。工业计算机包含条形码读码器、大屏幕、硬盘驱动器和发光键盘。医疗电子设备包含传感器、多强度闪光灯、仪表和省电模式。 不变的是对电源和功率的需求。随着便携式和系统电子功能不断增加,它们对功率的需求也随之增加,特别是在用到以下这些复杂的电子IC时: 图形处理单元(GPU) 现场可编程门阵列(FPGA) 微控制器和微处理器 可编程逻辑器件(PLD) 数字信号处理器(DSP) 专用集成电路(ASIC) 可编程逻辑器件(PLD) 这些复杂的数字器件需要高功率密度多电压轨电源,这些电源具有高电流、低电压和快速瞬态响应特性。这些严格的要求和特定的高性能要求(如低噪音或数字控制)加在一起,为电源设计人员提供先进的解决方案造成了不小的压力。在所有情况下,电源设计人员也应保持同步跟上这些器件需求的演进。 功率系统设计挑战 现代电子系统设计人员面临着诸多挑战,包括满足严格的空间要求、有限的工作温度范围和噪声规格。器件高度集成可以帮助节省PCB空间,但需要高效的功率器件确保温例如,如今的汽车仪表盘中包含多种在较高环境温度下运行的电子系统,所以温度监控和报告非常重要,对于电源管理组件尤其如此。系统控制器可以对超温(OT)警报作出响应,并采取缓解措施来防止系统过热,例如关闭不太重要的功能或限制处理器、显示器和网络通信。 从电源角度来看,即使是最基本的汽车仪表盘信息娱乐控制面板都需要多个不同电流的低压电源电轨(输出电平),总电流只有几安培,高级控制台需要的更多。传统上,低压电轨一般是采用许多微型负载点(POL)分立式功率调节器IC产生,或者,采用高度集成的大型电源管理集成电路(PMIC)产生。许多PMIC通常具有超过需求更多的电压轨,因此需要更大尺寸的电路,而其中某些电轨的功率可能不足,无法满足额外集成的目的。 另一个潜在设计挑战是需求蠕变,或者产品规格的改变速度跟不上开发发展的速度,例如输入和输出电压、输出电流的变化。需求蠕变会严重影响集成电路和相关分立式组件的选择。在最好的情况下,如果系统规格在电路板布局确定之后发生变化,则可以通过改换可调输出转换器上的电阻来调节电压。在最糟糕的情况下,当更新之后的电流电平超过现有转换器的开关电流额定值时,需要采用引脚排列不兼容的IC来更换多个IC。即使是最小的功能改变,都可能要求重新进行IC、电路板或系统级别的认证,出现成本增加、计划延迟的情况。 解决这些问题的方法,是使用多输出的功率IC。相比纯粹的分立式、单输出或双输出IC,PMIC提供的输出更多,占用的空间更少,且需要的器件数也更少。这种电压调节器是一个多输出功率IC,提供可配置的多个中等功率电轨,且解决方案的尺寸小巧。理想情况下,这种IC可以配置成输出各种电压和电流,以适应开发过程中出现的电源需求变化,避免重新认证,并缩短产品的上市时间。此外,它可以在高于5 V的输入电压下高效工作,所以可以用于各种应用场合,例如12 V至18 V的电压适配器。除此以外,需要的特性还包括:集成安全和监控特性、宽温度范围运行,以及具备较高热性能的创新封装设计等。 灵活、可配置的20 V多输出功率IC ADI的 LTC3376 是一款高度集成的通用电源管理解决方案,适用于需要多个低压供电轨的系统。该器件可配置为可从最高20 V的输入提供1至4个独立的调节输出,具备15种可行输出电流配置,总输出电流最高可达12 A;详情参见图1。这种灵活性使得LTC3376非常适合用于多种多通道应用,包括电信、工业、汽车和通信系统。 图1. LTC3376简化功能框图。 LTC3376具备4个独立的降压稳压器通道、8个可配置的1.5 A功率级、灵活的时序和故障监测功能,总可用输出电流为12 A,峰值降压效率为96%,在所有通道上的输出电压精度为±1%。每个通道可由独立的3 V至20 V输入电源供电,输出电压的范围最低可至0.4 V。相邻输出可通过单个共享电感并联排列,以简化电路。DC-DC转换器通过CFG0到CFG3引脚进行配置,由系统分配采用15种功率配置中的一种。无需采用外部BST电容,因为它们已被集成到封装中。 LTC3376的开关稳压器支持两种工作模式:突发工作模式(Burst Mode®)(默认的上电模式),可在轻载下提供更高效率,强制连续脉冲宽度调制(PWM)模式,可在轻载下提供更低噪声。开关稳压器从内部补偿,只需采用外部反馈电阻来设置输出电压。降压转换器提供输入限流(软启动,在启动期间限制浪涌电流)、差分输出检测和短路保护。该器件配有一个可编程、可同步的1 MHz至3 MHz振荡器,默认采用2 MHz开关频率。 在四个转换器全部启用的情况下,静态电流仅为42 μA。其他特性包括:四个电源良好引脚,指明启用的DC-DC转换器是否在指定目标输出的百分比内;电流监测器,从外部监测每个降压稳压器的负载;一个EXTVCC 引脚,用于改善效率;准确的RUN引脚阈值,以确定上电时序;一个裸片温度监测器输出(通过TEMP引脚上的模拟电压读取),显示外部裸片温度;以及超温功能,过载条件下裸片温度较高时禁用降压稳压器。 LTC3376采用紧凑的64引脚7 mm × 7 mm倒装引脚球栅阵列(BGA)封装。在–40°C至+125°C工作结温范围内,指定采用E和I级。 灵活性和可配置性 LTC3376本身具备的灵活性使其可以采用15种不同的输出配置: 单个电感,单个输出12 A降压,所有功率级在内部组合,产生最大的电流输出。 四种可能的双降压组合,两个电感,总输出电流总和为12 A。 五种三通道降压组合,每种三个电感,总电流12 A。 五种四通道降压配置,每种四个电感,总电流12 A(参见图2)。 图2. 典型的四通道输出应用电路。 查看表1,了解15种可能的输出配置的列表。设计期间要求发生变化时,这种灵活性可以实现轻松调整,从而继续使用LTC3376,无需再对新IC实施认证。 表1. LTC3376:15种12 A总电流输出配置示例 出色的热设计和紧凑型解决方案 LTC3376通过在其紧凑的64引脚7 mm × 7 mm倒装引脚球栅阵列封装中组合采用多种封装技术,提供一种紧凑、具备较高热效率的解决方案。封装的内部结构使用铜柱代替键合线,内部旁路电容和集成式衬底接地平面进一步提高EMI,降低对PCB布局的敏感度,从而简化设计并降低性能风险(参见图3了解详情)。此外,裸片中的功率器件排列可以最大化热性能,均衡分配功耗。 (a) (b) (c) 图3. LTC3376倒装封装(a)引脚球栅阵列,(b)铜柱在裸片下方以及(c)集成旁路电容。 图4所示为采用4 × 3 A、四通道降压稳压器(总输出电流12 A)的LTC3376完整解决方案。解决方案总尺寸紧凑小巧:有效面积仅为~1.5 cm × 2.9 cm ~ < 4.4cm2. 图4. LTC3376演示板,展示提供5 V、3.3 V、2.5 V和1.8 V输出的4 × 3 A降压解决方案。 额外的系统监测、安全和保护 除了可配置性外,LTC3376还具备多种安全特性,对由它供电的系统实施监测和保护。每个降压稳压器关联的PGOOD引脚会报告功率故障情况。每个降压稳压器都配有电流监测器,该监测器在IMON引脚上产生电流,电流的值与平均降压负载电流的值成比例。 为了防止LTC3376和其周围的组件遭受热损坏,LTC3376集成了超温功能。当LTC3376裸片的温度达到165°C(典型值)时,所有开启的降压开关稳压器关闭,并保持关闭状态,直至裸片温度降低至155°C(典型温度)。 LTC3376还包含一个温度监测器:可通过对模拟TEMP引脚电压采样来读取裸片温度。通过TEMP引脚电压表示的温度T的计算公式如下: 其中,VTEMP 是TEMP引脚上的电压。 可配置的降压稳压器系列 表2显示整个可配置的四通道和八通道降压稳压器系列,其中LTC3376是新产品。LTC3376具备最高的总输出电流(最高12 A)和最高的输入电压容量(最高20 V)。LTC3376具备最高的总输出电流(最高12 A)和最高的输入电压容量(最高20 V)。 表2. ADI Power系列可配置四通道和八通道降压稳压器 在技术进步的推动下,汽车信息娱乐、消费电子手持设备、工业设备和医疗设备等应用的功能性内容愈加丰富。在许多情况下,这些系统的输入电压都超过5 V,并由复杂的低电压、大电流数字IC供电,这些IC本身都有独特的功率需求。传统上,电压电轨和电流电平都由众多分立式功率调节器IC支持,或由尺寸相对较大、过度集成的电源管理集成电路或PMIC支持。两者都不具备灵活性,尺寸也不小巧。 采用单通道、四通道或八通道多输出功率IC来替换这些方案是一个明智的选择。LTC3376引脚可配置的PMIC就是新一代多输出功率IC的示例。它是一个20 V输入的数字可编程、高效率多输出功率电源IC,包含四个同步降压转换器和八个内部功率级(总IOUT 最高12 A),且输出电压低。由于可以采用多达15种不同的输出电流配置,所以系统设计人员可以利用其灵活性来消除功率模块系统变化和特性蠕变带来的影响。无需过早实施价格高昂的电路板或系统级认证,缩短产品上市时间,降低开发成本并减少升级时间和成本。 LTC3376 LTC3376 宽 VIN 范围:3V…

摩登3注册登录网_嵌入式软件架构设计之分层设计

在实际的项目开发中,项目往往是并行开发的,也就是说硬件设计,底层软件设计,应用软件设计是同步进行的。比如说在开发板上调试模块驱动,在其他平台上调试应用再移植到目前这个平台等。这里又涉及到如何提高嵌入式应用软件的可移植性的问题,这个问题在下一篇博文中专门讲解,敬请期待。要想开发的应用程序在不同的嵌入式平台上具有高效率的可移植性,像Android sdk一样,统一的接口规范是必须的。 本文所要提到的嵌入式,其实更偏向于单片机。因为经典的linux+arm配置属于资源比较丰富,高配的嵌入式系统,其操作系统本身就很强大,软件设计也变得水到渠成。单片机更多时候是没有系统软件设计之说。一般的人会说,小项目才用单片机,实现功能简单,无需太多人参与,所以无需注重软件设计。其实是很幼稚的观点(刚毕业时我也是这样认为的)。因为目前mcu的处理速度,和实现功能已经可以满足很多项目的要求了。并且这些项目的软件也是越来越复杂。因此注重单片机类嵌入式软件设计是项目前期必须考虑的工作。 下面具体讲解单片机软件开发的分层设计思路。本栗子所使用的是飞思卡尔K21 MCU,IAR编译器。本文主题是讲软件分层,也就是底层软件和应用软件分开。当然可以把底层软件生成一个静态库提供给应用。但是这样就会有一个问题,如果静态库改变了,得重新编译,然后提供给应用,应用程序也得重新编译一下,这显然是很麻烦的一种处理方式。于是我们可以用另外一种思路去实现:底层软件和应用软件是两个独立的bin文件,姑且叫libdev.bin和app.bin。非操作系统的嵌入式是没有动态库.so这样一说的,不过底层软件这个可执行文件姑且就认为是app的.so吧。这两个bin文件通过配置icf,映射到不同的flash空间以及分配不同的RAM空间。显然,这两个bin文件的关系是app.bin会调用libdev.bin的实现。但是他们是独立的bin文件,如何关联起来呢。这事就需要一个函数表告诉app.bin到哪里去调用libdev.bin里面的函数实现。要实现这个函数表,就需要有统一的函数接口才方便管理。这个函数表可用静态库.a实现(libdev.a)。libdev.a的功能就是要映射所有libdev的接口函数,使app调用某一接口函数时,可以跳转到libdev.bin里面执行。如何实现上述思路,下面用一个具体实例讲解: 1.函数表用结构体的方式实现,结构体元素为函数指针。 eg: struct libdev_ops{    int (*dev_PortOpen)(int PortNum, char *PortParm);}; 2.在libdev.bin里面,对结构体里面的函数指针赋值。 eg: void libdev_ops_init(struct libdev_ops *ops){    ops->dev_PortOpen = dev_PortOpen;//把函数地址赋给对应的函数指针} 3.程序启动时,先进入libdev.bin,然后再跳转到app.bin。在此需要一个地址跳转函数。 eg: struct libdev_ops ops;void call_app(int addr){    int (*startup)(struct libdev_ops *ops);    startup = (int(*)(struct libdev_ops *))(addr);    libdev_ops_init(&ops);    startup(&ops);} 在libdev.a里面 4.重新封装所有函数,如下: int dev_PortOpen(int PortNum, char *PortPara){     ops->dev_PortOpen(PortNum,PortPara);} 5.实现libdev.bin需要跳转地址的函数 eg: void common_startup(struct libdev_ops *libdev_ops){    ......    ops = libdev_ops;    //为不定参函数,不能在步骤2中进行赋值,所以在静态库里进行初始化赋值。    dev_printf = ops->;    main();//跳到app的main中} 在app.bin 6.app.bin程序的启动地址修改,修改 IAR配置 工程名字--options--linker--library--勾选override default program entry,在Entry symbol 后面输入common_startup。 7.因为有两个.bin程序。所以就需要配置icf文件,并且call_app(addr)这个addr为app.bin里面common_startup函数的地址。因此需要编译app.bin后在output文件里面的app.map里面查看common_startup的地址是多少(由于这个函数是程序最先执行的函数,所以其地址为icf配置的起始地址)。 8.然后你在应用里面包含了dev_PortOpen函数的头文件就可以正常调用这个函数了。 因为libdev.bin和app.bin是同时运行的(app.bin调用的libdev函数的实现在libdev.bin里面),因此必须把RAM和ROM分成两份,不得重叠。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册网址_一个让我感到毛骨悚然的GitHub项目!

想必你永远不会想到,有一天你也会被自己的键盘出卖。 对,就是你每日敲击的键盘。当指尖在键盘上跳跃,清脆的噼啪声此起彼落时,你输入的所有信息,包括那些情真意切的词句,那些不欲人知的心事,还有你的网络账户、银行密码…… 全都被它泄露了。 键盘,还能被黑??? 前不久,一个叫做 Keytap 的 “黑科技” 在国外火了。Keytap 通过监听你敲击键盘的声音,就能还原出你输入的内容。 而且,只需要通过你电脑里的麦克风,就能完成声波采集的任务。 在一段发布于网上的 Demo 里,Keytap 作者展示了在 iMac+Filco 机械键盘环境中,这个算法的优秀程度,请看: 四步偷窥大法 搭建这样一个 “偷窥” 打字的模型并不难,Keytap 算法也已经开源了。跟着做,只要如下四步: 一是,收集训练数据; 二是,搭建预测模型,学习一下数据; 三是,检测出有人在敲键盘; 四是,检测出 ta 在打什么字。 收集训练数据 Keytap 收集数据时,只保留每次敲击前后 75-100 毫秒的音频。 这就是说,并非连续取样, 两次敲击之间有一部分是忽略的。 这种做法是会牺牲一些信息量的。 从敲下按键,到程序受到指令,这之间有随机延时,与硬件和软件都有关系。 比如,按下 g 键的完整波形长这样: 看图像可以发现,敲击时出现了一个峰值,而再过大约 150 毫秒,又有一个按键被抬起的小峰值。 这样说来,100 毫秒之外的信息也可能有用,不过这里为了简便就忽略了。 最终,收集到的数据长这样: 除此之外,局限性还在于,如果两次按键之间相隔不久,后者落在前者的后 75 毫秒之内,那数据可能就有些混杂了。 搭个预测模型 这个部分是最能发挥创造力的部分。Keytap 用了一个非常简单的方法,分为三步: 1. 把收集到的波形的峰值对齐。这样可以避免延时带来的影响。 2. 基于相似度指标 (Similarity Metric) ,更精细地对齐波形。 需要更精确的对齐方法,是因为有时候峰值未必是最好的判断依据。 那么,可不可以跳过峰值对齐呢? 之所以第 2 步之前要先做第 1 步,是因为相似度指标的计算很占 CPU。而第 1 步可以有效缩小对齐窗口 (Alignment Window) ,减少计算量。 3. 对齐后,做简单加权平均。权重也是用相似度指标来定义的。 完成第 3 步之后,每一个按键都会得出一个平均波形 (a Single Averaged Waveform) ,用来和实时捕捉的数据做 比对。 Keytap 用的 相似度指标是互相关 (Cross Correlation, CC) ,长这样: 这里,Ai 和 Bi 都是某个按键的波形样本,比对就在它们之间进行。CC 值越高,表示两者越相似。 当然,也可以用其他相似度指标来做。 顺便一说,两次按键之间的 间隔时长,其实也可以用来预测的,但开发者怕麻烦就省略了,勇敢的少年可以去源代码基础上自行实验。 检测出在敲键盘 平均波形和比对标准都有了,可是麦克风实时收录的声音连绵不绝,该和哪一段来比对呢? 这就需要从连续的音频里,找到敲击键盘的声音。 Keytap 用了一个非常简单的阈值方法,在原始音频里监测敲击动作: 按下去的时候,会有一个大大的峰值,这就是侦测目标。 不过,这个阈值不是固定的,是自适应 (Adaptive) 的:根据过去数百毫秒之内的平均样本强度来调整的。 检测打了什么字 当系统发现有人在敲键盘,就用相似度指标来测到底按了哪个键,CC 值最高的就是答案。方法就像上文说的那样。 现在,代码实现已经 开源了,传送门见文底。 不过,作者在博客中说,这个方法目前只有 机械键盘适用。 “薯片间谍” 听音识字的研究不止这一个,去年一篇 Don’t Skype & Type!Acoustic…