我的日历


我的BLOG

咖啡豆
水最无形,水却也是最执着的。 真是扯淡~


用户登录

用户登录
用户名:
密   码:
          

日志分类



最后更新



最新评论



存档



    我的链接



    00Counter.com



     
    THIS BLOG IS POWERED BY BLOGBUS.COM  

    分页共44页 1 2 3 4 5 6 7 8 9 10 下一页 最后一页

    新地址 - []
    ajumail 发表于13:40:00 2009-09-10

    http://ppcode.cublog.cn

    新地址支持代码格式、颜色。空间比较到,可存比较多的图片。

    阅读全文  |  评论(0)  |  Trackback(0)  | 编辑  



    傅立叶变换、拉普拉斯变换、Z变换之间最本质的区别是什么? - []
    ajumail 发表于12:23:42 2009-06-06

    简单的说:傅立叶变换就是将任一个函数展开成一系列正弦函数的形式,从而能够在频域进行频谱分析。而拉普拉斯变换是复频域,它的的引进主要是对微分方程起到了简便的变换作用,试想2阶的微分方程就够麻烦的了,高阶就别指望手动解了,数学系的牛人别见怪。所以拉式变换就将时域的微分方程变换成代数方程。而到了离散系统中,又出现了差分方程,因此人们就想既然连续系统中有拉式变换,那么是不是离散系统中也会有一个方法能够起到相同的简化作用呢?于是Z变化就提了出来。

    阅读全文  |  评论(0)  |  Trackback(0)  | 编辑  



    快速傅立叶变换(FFT) - []
    ajumail 发表于11:52:03 2009-06-06

    只要是理工科毕业的朋友,都学过傅立叶级数与傅立叶变换,但真正要与实际应用联系起来,用它来阐述应用中的各类问题,我们总会感觉概念模糊,似懂非懂,不知从何说起。是的,作者和你一样,常常有这样的体会。现在,让我与你一起重新学习傅立叶的基本理论和应用,最后还给出一份FFT(快速傅立叶变换)的源码(基于C)。希望对你有所帮助。Let’s go!
      
      1. 历史回顾
      谈傅立叶变换,不能不说三角函数。三角函数起源于18世纪,主要是与简谐振动的研究有关。当时的科学家傅立叶对三角函数作了深入研究,并用三角级数解决了很多热传导的问题。三角函数的展开式如下:
      
      f(t) = (1/2a0) + (a1·cos(x)+b1·sin(x)) + (a2·cos(2x)+b2·sin(2x)) + …
      其中,系数a和b表示不同频率阶数下的幅度。
       
      成立条件:
      n 周期性条件,也就是说f(x)描述的波形必须每隔一段时间周期T就会重复出现;
      n Dirichlet条件,周期T内,有限的最大最小值,有限的不连续点;
      任何区间内绝对可积;
      
      研究目的:
      把一个基于时间变量t的函数展开成傅立叶级数的目的是分解为不同的频率分量,以便进行各种滤波算法。这些基本的组成部分是正弦函数SIN(nt)和余弦函数COS(nt)。
      
      应用领域:
      l 信号分析,包括滤波、数据压缩、电力系统的监控等;
      l 研究偏微分方程,比如求解热力学方程的解时,把f(t)展开为三角级数最为关键。
      l 概率与统计,量子力学等学科。
      
      2. 傅立叶变换
      H(w) = ∫h(t)·e^jwt·dt, (区间:-∽~+∽,w = 2πf)
       讨论:这里为什么会选择复指数的形式而没有用正弦余弦表示?
      答案:欧拉公式的引入使得这条经典的数学公式变得更简单,即e^jx = cos(x) + jsin(x)
       3. 快速傅立叶变换(FFT)
    常规的傅立叶变换算法并不适用于嵌入式控制系统,原因是运算量太大(涉及到复数运算),比如离散的傅立叶变换等同于用序列Y(n×1列矢量)乘以n×n 矩阵Fn,需要n×n次乘法。若n=1024,则是104,8576次乘法运算。哇,这么多呀!什么概念呢?如果你选用的CPU单周期指令为25ns,  单周期也可以完成一次乘法运算,那么要计算1024点的傅立叶变换则需要26.2144ms,这还不包括加法或其它运算,对于大多数实时系统,这个处理时间实在太长。于是寻找一个快速的傅立叶变换算法是人们所期望的。
      本来我想把FFT的整个数学推导过程列完出来,但当自己硬着头皮看完后,发现对我没有任何用处,我又不是专门研究数学算法的,哪有那么多时间跟着书本的公式去慢慢推导。我想,这些推导问题还是让数学家想去吧。我需要的不过是理解它,然后学会应用它就行。有兴趣的读者可以参考相关的资料,这方面的资料实在太多了。
      虽然FFT大幅度地降低了常规傅立叶变换的运算量,但对于一般的单片机而言,处理FFT运算还是力不从心。主要原因是FFT计算过程中的蝶形运算是复数运算,要分开实部和虚部分别计算,想想这是多么繁琐的事情。可能会有些初学者认为,有这么复杂吗?我在PC上使用C++一样可以对复数直接进行加、减、乘、除运算。你说得不错,可以这么做,但那是C++封装了对复数处理的类,直接调用就行。在PC上运算这种类型的算法一般不考虑时间和空间,多一两秒的运行时间不会有什么灾难性的结果。
      所以我们要衡量一个处理器有没有足够的能力来运行FFT算法,根据以上的简单介绍可以得出以下两点:
      l 处理器要在一个指令周期能完成乘和累加的工作,因为复数运算要多次查表相乘才能实现。其二就是间接寻址,可以实现增/减1个变址量,方便各种查表方法。
      l FFT要对原始序列进行反序排列,处理器要有反序间接寻址的能力。
      
      所以,在数字信号的分析处理应用中,DSP比其它的处理器有绝对的优势,因为DSP完全具备以上条件。这就是单片机(51系列,AVR,PIC等等)或ARM处理器很少用来进行数字信号分析的原因。
      
      4. FFT的C实现方法
      //**********************************************************
      // 函数名: 快速傅立叶变换(来源《C常用算法集》)
      // 本函数测试OK,可以在TC2.0,VC++6.0,Keil C51测试通过。
      // 如果你的MCS51系统有足够的RAM时,可以验证一下用单片机处理FFT有多么的慢。
      //
      // 入口参数: 
      // l: l = 0, 傅立叶变换; l = 1, 逆傅立叶变换
      // il: il = 0,不计算傅立叶变换或逆变换模和幅角;il = 1,计算模和幅角
      // n: 输入的点数,为偶数,一般为32,64,128,...,1024等
      // k: 满足n=2^k(k>0),实质上k是n个采样数据可以分解为偶次幂和奇次幂的次数
      // pr[]: l=0时,存放N点采样数据的实部
      // l=1时, 存放傅立叶变换的N个实部
      // pi[]: l=0时,存放N点采样数据的虚部 
      // l=1时, 存放傅立叶变换的N个虚部
      //
      // 出口参数:
      // fr[]: l=0, 返回傅立叶变换的实部
      // l=1, 返回逆傅立叶变换的实部
      // fi[]: l=0, 返回傅立叶变换的虚部
      // l=1, 返回逆傅立叶变换的虚部
      // pr[]: il = 1,i = 0 时,返回傅立叶变换的模
      // il = 1,i = 1 时,返回逆傅立叶变换的模
      // pi[]: il = 1,i = 0 时,返回傅立叶变换的辐角
      // il = 1,i = 1 时,返回逆傅立叶变换的辐角
      // data: 2005.8.15,Mend Xin Dong
      void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il)
      {
       int it,m,is,i,j,nv,l0;
       double p,q,s,vr,vi,poddr,poddi;
      
       for (it=0; it<=n-1; it++)
       { 
       m = it; 
       is = 0;
       for(i=0; i<=k-1; i++)
       { 
       j = m/2; 
       is = 2*is+(m-2*j); 
       m = j;
       }
       fr[it] = pr[is]; 
       fi[it] = pi[is];
       }
      //----------------------------
       pr[0] = 1.0; 
       pi[0] = 0.0;
       p = 6.283185306/(1.0*n);
       pr[1] = cos(p); 
       pi[1] = -sin(p);
      
       if (l!=0) 
       pi[1]=-pi[1];
      
       for (i=2; i<=n-1; i++)
       { 
       p = pr[i-1]*pr[1]; 
       q = pi[i-1]*pi[1];
       s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
       pr[i] = p-q; 
       pi[i] = s-p-q;
       }
      
       for (it=0; it<=n-2; it=it+2)
       { 
       vr = fr[it]; 
       vi = fi[it];
       fr[it] = vr+fr[it+1]; 
       fi[it] = vi+fi[it+1];
       fr[it+1] = vr-fr[it+1]; 
       fi[it+1] = vi-fi[it+1];
       }
       m = n/2; 
       nv = 2;
      
       for (l0=k-2; l0>=0; l0--)
       { 
       m = m/2; 
       nv = 2*nv;
       for(it=0; it<=(m-1)*nv; it=it+nv)
       for (j=0; j<=(nv/2)-1; j++)
       { 
       p = pr[m*j]*fr[it+j+nv/2];
       q = pi[m*j]*fi[it+j+nv/2];
       s = pr[m*j]+pi[m*j];
       s = s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
       poddr = p-q; 
       poddi = s-p-q;
       fr[it+j+nv/2] = fr[it+j]-poddr;
       fi[it+j+nv/2] = fi[it+j]-poddi;
       fr[it+j] = fr[it+j]+poddr;
       fi[it+j] = fi[it+j]+poddi;
       }
       }
      
       if(l!=0)
       for(i=0; i<=n-1; i++)
       { 
       fr[i] = fr[i]/(1.0*n);
       fi[i] = fi[i]/(1.0*n);
       }
      
       if(il!=0)
       for(i=0; i<=n-1; i++)
       { 
       pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
       if(fabs(fr[i])<0.000001*fabs(fi[i]))
       { 
       if ((fi[i]*fr[i])>0) 
       pi[i] = 90.0;
       else 
       pi[i] = -90.0;
       }
       else
       pi[i] = atan(fi[i]/fr[i])*360.0/6.283185306;
       }
      return;
      }

    阅读全文  |  评论(0)  |  Trackback(0)  | 编辑  



    KYZ relay - [系统知识 ]
    ajumail 发表于21:17:13 2009-05-21

    by AJU

    KYZ is a designation given to a relay used to create pulses for electrical metering applications. It is commonly a Form C relay. The term KYZ refers to the contact designations: K for common, Y for Normally Open, and Z for Normally Closed. When incorporated into an electrical meter, the relay changes state with each rotation (or half rotation) of the meter disc. Each state change is called a "pulse." When connected to external equipment, rate of use (kW) as well as total usage (kWh) can be determined from the rate and quantity of pulses.

    阅读全文  |  评论(0)  |  Trackback(0)  | 编辑  



    影响算法世界的十位大师 - []
    ajumail 发表于12:33:09 2009-04-07

    /范凯 马林  

    Don E. Knuth
           伟大的智者——Don E.Knuth,中文名:高德纳(1938-)算法和程序设计技术的先驱者。Oh,God!一些国外网站这样评价他。一般说来,不知道此人的程序员是不可原谅的。其经典著作《计算机程序设计艺术》更是被誉为算法中“真正”的圣经,像KMP和LR(K)这样令人不可思议的算法,在此书比比皆是。难怪连Bill Gates都说:“如果能做对书里所有的习题,就直接来微软上班吧!
      对于Don E.Knuth本人,一生中获得的奖项和荣誉不计其数,包括图灵奖,美国国家科学金奖,美国数学学会斯蒂尔将(AMS Steel Prize),以及发明先进技术荣获的极受尊重的京都奖(KyotoPrize)等等,写过19部书和160余篇论文,每一篇著作都能用影响深远来形容。Don E.Knuth也被公认是美国最聪明的人之一。当年他上大学的时候,常写些各种各样的编译器来挣外快,只要是他参加的编程比赛,总是第一名,同时也是世上少有的编程达到40年以上的程序员之一。他除了是技术与科学上的泰斗外,更是无可非议的写作高手,技术文章堪称一绝,文风细腻,讲解透彻,思路清晰而且没有学究气,估计这也是《计算机程序设计艺术》被称为圣经的原因之一。

    Edsger Wybe Dijkstra
      谦逊的长者——Edsger Wybe Dijkstra,1930年出生于荷兰阿姆斯特丹,2002年逝世于荷兰纽南。他在祖国荷兰获得数据和物理学学士,理论物理博士学位,2000年退休前一直是美国Texas大学的计算机科学和数学教授。以发现了图论中的最短路径算法(Dijkstra算法)而闻名于世,1972年因为ALGOL第二代编程语言而获得图灵奖。“Go To Statement Considered Harmful”(EWD215)也是被广为传颂的经典之作。除了科学研究之外,他最喜欢做的事情就是教学,被人称作“一天教学24小时”的教授。且不说Dijkstra算法对计算科学,网络科学发展的深远影响,单从他在1972年获得图灵奖时的演讲“The Humble Programmer”就不得不肃然起敬,在获得计算机科学中至高无上的奖项时,Edgs Wybe Dijkstra仍然称自己不过是一个谦逊普通的程序员,何等胸襟,举世之中几人可比。

    George Dantzig
      运筹学大师——George Dantizig可谓是由父亲一手培养出的天才。George的父亲是俄国人,曾在法国师从著名的科学家Henri Poincar e。他曾经这样回忆自己的父亲:“在我还是个中学生时,他就让我做几千道几何题……解决这些问题的大脑训练是父亲给我的最好礼物。这些几何题,在发展我分析能力的过程中,起了最最重要的作用。”
      在伯克利学习的时候,有一天George上课迟到,只看到黑板上写着两个问题,他只当是课堂作业,随即将问题抄下来并做出解答。六个月后,这门课的老师——著名的统计学家Jerzy Neyman——帮助他把答案整理了一下,发表为论文,George这才发现自己解决了统计学领域中一直悬而未决的两个难题。
      George后来在运筹学建树极高,获得了包括“冯诺伊曼理论奖”在内的诸多奖项。他在Linear programming and extensions一书中研究了线性编程模型,为计算机语言的发展做出了不可磨灭的贡献。天妒英才,他于2005年5月13日去世。

    James Cooley
      推动时代前进的人——James Cooley(1926-)美国数学家,哥伦比亚大学的数学博士,以他所创造的快速傅立叶变换(FFT)而著名,不能不说是意义极其重大,FFT的数学意义不光在于使大家明白了傅立叶(Fourier)变换计算起来是多么容易,而且使得数字信号处理技术取得了突破性的进展,对于现在的网络通信,图形图像处理等等领域的发展与前进奠定了基础。Fourier变化的意义在于将电能变为了工业的命脉,而FFT的意义更是在于他推动了整个社会信息化的进程。在IBM研究中心中主要从事数字信号处理的研究一直到1992年退休,同时他还是IEEE的数字信号处理委员会的成员。1980年获得ASSP's Meritorious Service Award,1984年获得ASSP Society Award以及IEEE Centennial Medal。

    John Backus
      FORTRAN之父——John Backus早年在Hill School学习的时候因为讨厌学习,成绩一踏糊涂而不得不在暑假补课。1943年他在父亲的要求下到维吉尼亚大学学习化学,随后参军、照顾头部受伤的伤员、在医学学校学习治疗,可是最后又都放弃了。不过还好,战后Backus进入纽约哥伦比亚大学学习数学,并于1949年毕业。在毕业前夕,他跑到了麦迪逊大街的IBM计算机中心参观。事情凑巧,和导游聊天的时候Backus谈到自己正在找工作,在导游的鼓励下,他和中心一位主管的面谈,成为了一名IBM的程序员。
      在IBM,Backus的才华得到了施展,发明了人类历史上第一个高级语言——FORTRAN。接着,又提出了规范描述编程语言语法的Backus-Naur form(BNF)。这位当年的“差生”终于被整个计算机世界肯定——美国计算机协会于1977年授予John Backus图灵奖。

    Jon Bentley
      实践探索先锋——Jon Bentley 1974年获得了斯坦福大学的学士学位,1976年获得北卡罗莱纳大学的硕士和博士学位。毕业后在卡耐基梅隆大学教授了6年计算机科学课程,1982年进入贝尔实验室。2001年退休后加入了现在的Avaya实验室,他还曾作为访问学者在西点军校和普林斯顿大学工作。他的研究领域包括编程技术、算法设计、软件工具和界面设计等等。他写作过三本编程书籍,其中最著名的就是涵盖从算法理论到软件工程各种主题的Programming Pearls(《编程珠玑》),这其实是他发表过的文章的合集。在这些文章里,Jon从工程实现的角度出发,为程序员们提供了一个个艰难问题的解决方案,犹如一颗颗闪闪发亮的珍珠。Bentley的珍珠超出了可靠工程学的范畴,利用他的洞察力和创造力为那些恼人的问题提供了独特而巧妙的解决方案。

    Nicklaus Wirth
      Pascal之父——Nicklaus Wirth,如果说有一个人因为一句话而得到了图灵奖,那么这个人应该就是Nicklaus Wirth,这句话就是他提出的著名公式“算法+数据结构=程序”。这个公式对计算机科学的影响程度足以类似物理学中爱因斯坦的“E=MC^2”——一个公式展示出了程序的本质。Nicklaus Wirth,1934年出生于瑞士,1963年在加州大学伯克利分校取得博士学位。取得博士学位后直接被以高门槛著称的斯坦福大学聘到刚成立的计算机科学系工作。在斯坦福大学成功的开⒊鯝lgol W以及PL360后,爱国心极强的Nicklaus Wirth于1967年回到祖国瑞士,第二年在他的母校苏黎世工学院他创建与实现了Pascal语言——当时世界上最受欢迎的语言之一。后来他的学生Philipe Kahn毕业后和Anders Hejlsberg(Delphi之父)创办了Borland公司靠Turbo Pascal起家,很快成为了将Borland发展成为全球最大的开发工作厂商,这一切都不得不说要归工于PASCAL语言的魅力。PASCAL已经影响了整整几代的程序员,Nicklaus Wirth的思想还将会继续指引现在和以后的程序员前进的方向。

    Rebort Sedgewick
      算法的讲解者——Robert Sedgewick是普林斯顿大学的计算机科学教授。他还是AdobeSystems的一名主管,也曾作为访问学者在Xerox PARC、IDA和INRIA工作。他在斯坦福大学获得博士学位。他的著作包括Algorithm in C、Algorithm in C++、Algorithm in Java等系列书籍,这些都再版多次。“没有人能够将算法和数据结构解释得比Robert Sedgewick更清楚易懂了!”很多读过他著作的程序员这样说。目前Robert正在研究算法设计、数据结构、算法分析等方面的基础理论。他善于通过数学方法评估和预测算法性能,设法发现算法、数据结构的通用机制,例如使用逼近方法寻找更快速更高效的算法。另外,他还将算法和图形学结合起来,例如使用可视化方法评估算法效率,算法的图形化模拟,用于出版物的高质量算法表现方法等等。

    Tony Hoare
      计算机领域的爵士——Tony Hoare,1934年出生于英国,1959年博士毕业于俄罗斯莫斯科国立大学,获得语言机器翻译专业学士学位。1960年发布了使他闻名于世的快速排序算法(Quick Sort),这个算法也是当前世界上使用最广泛的算法之一。
      Tony Hoare在取得博士学位后,就职于Elliott Brothers,领导了Algol 60第一个商用编译器的设计与开发,由于其出色的成绩,最终成为该公司首席科学家。从1977年开始,Tony Hoare博士任职于牛津大学,投身于计算系统的精确性的研究、设计及开发。因其对Algol 60程序设计语言理论、互动式系统及APL的贡献,1980年被美国计算机协会授予“图灵奖”。
      1999年在牛津大学退学后,Tony Hoare博士被微软剑桥研究院聘请担任高级程序员,从事微软剑桥研究院研究生成果的工业化应用的工作,以及协助其它研究人员进行
    服务于软件产业及用户的长期基础研究项目。2000年因为其在计算机科学与教育上做出的贡献被封为爵士。

    Udi Manber
      首席算法官——世界上还有如此奇怪的职位?但是对于Amazon乃至Google来说,这一点也不奇怪。Udi Manber,这位前Amazon的“首席算法官”,现在是Google负责工程事务的副总裁。他研究WWW的应用程序、搜索以及隐藏在这背后的算法设计。在此期间,他与其他人共同开发了Agrep、Glimpse和Harvest等Unix上的搜索软件。1998年,Udi成为了Yahoo!的首席科学家。2002年,Amazon创造性地给了Udi“首席算法官”的职位,和Udi为Amazon的“Search Inside the Book”搜索项目所做的工作相得益彰。
    Udi还因为他所著的Introduction to Algorithms——A Creative Approach而被大家称道。

     

    阅读全文  |  评论(0)  |  Trackback(0)  | 编辑