理解锁相环PLL

目前我见到的所有芯片中都含有PLL模块,而且一直不知道如何利用PLL对晶振进行倍频的,这次利用维基百科好好的学习了下PLL的原理。

1. 时钟与振荡电路

在芯片中,最重要的就是时钟,时钟就像是心脏的脉冲,如果心脏停止了跳动,那人也就死亡了,对于芯片也一样。了解了时钟的重要性,那时钟是怎么来的呢?时钟可以看成周期性的0与1信号变化,而这种周期性的变化可以看成振荡。因此,振荡电路成为了时钟的来源

振荡电路的形成可以分两类:

  1. 石英晶体的压电效应:电导致晶片的机械变形,而晶片两侧施加机械压力又会产生电,形成振荡。它的谐振频率与晶片的切割方式、几何形状、尺寸有关,可以做得精确,因此其振荡电路可以获得很高的频率稳定度。
  2. 电容Capacity的充电放电:能够存储电能,而充放电的电流方向是反的,形成振荡。可通过电压等控制振荡电路的频率。

2. PLL与倍频

由上面可以知道,晶振由于其频率的稳定性,一般作为系统的外部时钟源。但是晶振的频率虽然稳定,但是频率无法做到很高(成本与工艺限制),因此芯片中高频时钟就需要一种叫做压控振荡器(Voltage Controlled Oscillator)的东西生成了(顾名思义,VCO就是根据电压来调整输出频率的不同)。可压控振荡器也有问题,其频率不够稳定,而且变化时很难快速稳定频率。哇偶,看到这种现象是不是很熟悉?嘿嘿,这就是标准开环系统所出现的问题,解决办法就是接入反馈,使开环系统变成闭环系统,并且加入稳定的基准信号,与反馈比较,以便生成正确的控制。

PLL

因此,为了将频率锁定在一个固定的期望值,锁相环PLL出现了!一个锁相环PLL电路通常由以下模块组成:

  • 鉴相鉴频器PFD(Phase Frequency Detector):对输入的基准信号(来自频率稳定的晶振)和反馈回路的信号进行频率的比较,输出一个代表两者差异的信号
  • 低通滤波器LPF(Low-Pass Filter):将PFD中生成的差异信号的高频成分滤除,保留直流部分
  • 压控振荡器VCO(Voltage Controlled Oscillator):根据输入电压,输出对应频率的周期信号。利用变容二极管(偏置电压的变化会改变耗尽层的厚度,从而影响电容大小)与电感构成的LC谐振电路构成,提高变容二极管的逆向偏压,二极管内耗尽层变大,电容变小,LC电路的谐振频率提高,反之,降低逆向偏压时,二极管内电容变大,频率降低
  • 反馈回路FL(Feedback Loop):通常由一个分频器实现。将VCO的输出降低到与基准信号相同级别的频率才能在PFD中比较

PLL工作的基本原理就是将压控振荡器的输出经过分频后与基准信号输入PFD,PFD通过比较这两个信号的频率差,输出一个代表两者差异的信号,再经过低通滤波器转变成一个直流脉冲电压去控制VCO使它的频率改变。这样经过一个很短的时间,VCO的输出就会稳定下来。所以:

PLL并不是直接对晶振进行倍频,而是将频率稳定的晶振作为基准信号,与PLL内部振荡电路生成的信号分频后进行比较,使PLL输出的信号频率稳定

最后,根据原理,理解一下锁相环(Phase Locked Loop)的名称

  • 为了对基准信号与反馈信号进行频率比较,二者的相位必须相同且锁住,任何时间都不能改变,这样才能方便的比较频率,所以叫锁相(Phase Locked)
  • 为了快速稳定输出系统,整个系统加入反馈成为闭环,所以叫环(Loop)

参考文档

理解傅立叶变换

什么是傅立叶变换

关于傅立叶变换,可以用果汁牛奶打一个比方:

  • 什么是傅立叶变换:对于一杯果汁牛奶,能分析出其食谱(recipe)
  • 如何进行傅立叶变换:运行果汁牛奶的过滤器(filters),将各类成分(ingredient)分离(extract)出来
  • 为什么要进行傅立叶变换:食谱要比果汁牛奶要容易分析、比较、修改得多
  • 如何再变换回去:根据食谱将成分再混合到一起,就又得到果汁牛奶了

Smoothie to recipe

总之,对果汁牛奶进行傅立叶变换后,我们的视角(perspective)从消费者变成了生产者,从“What did i see”变成了“How was it made”,Recipe比Object本身更容易进行分析、比较、修改。

所谓“变换”,就是换个领域看问题(A Change Of Perspective),将某种情况下不易分析处理的领域换成易分析处理的领域

好,让我们看看真正的傅立叶变换,维基百科上的一张GIF图清晰明了,可以看出:

fft

  1. 任何连续周期信号都可以由一组适当的正弦曲线组合而成(这些正弦曲线通过叠加逼近,直至误差可以忽略)
  2. 连续周期信号的表象是时域(time domain)波形,从时域上,我们很难进行分析、处理,因此我们需要从另外一个维度去分析信号,而傅立叶变换就是将信号从时域(Observations In The Time Domain)转换到频域(Ingredients In The Frequency Domain)。为什么要到频域呢?频率只是信号的一个特征,但是它可以用来识别信号,在频域可以得到信号的成分(ingredients),就像果汁牛奶一样,Recipe比Object本身更容易分析、比较、修改

分离信号与傅立叶变换的应用

从上面可以看出,傅立叶变换说到底就是分离信号,可为什么要分离信号呢?其实信号只是信息的载体,信息无处不在且多种多样,因此信号的类型也多种多样,但是在传输的方式却比较少(每一种的容量非常大),例如声音、光线、电磁等等。由于同一种传输方式的容量非常大,将信道分成不同区域同时使用,信道的利用率大大的提高了。

但是问题来了:虽然对信道进行划分,但是信号在相同的信道中传输时,大自然不管你如何划分,都是按同样的方式传输,不同类型的信号被合在一起进行传输,就像上面的果汁牛奶,不管你把各类成分划分得如何清晰,果汁机出来就是混合过的果汁。这时,接受端就需要对信号进行分离,识别出不同的信号,进行分析处理。分离信号是我们最常见的事情,我们无时无刻不在进行,以至于根本没有注意到。例如,看到不同的颜色,尝到不同的味道,听到不同的声音(对于振动产生的声音,在传播时不管高低音,是缠在一起在介质中传输的,但是人耳可以分辨出)。

傅立叶变换只是分离信号方法中的一种(靠频率分离),由此可以想到傅立叶变换的一些应用有:

  • 滤波:将不需要的频率对应的信号过滤掉,只留下需要的信号
  • 调频:基于滤波,只专注于特定频率的信号进行接受
  • 去噪:通过分离,把噪声对应频率的信号处理掉,增强核心的信号
  • 压缩:将那些不太重要的部分忽略掉,保留主要部分(有损压缩)。例如,JPEG对.bmp压缩,MP3对.wav压缩都是这种方式

参考资料

我喜欢那种深入浅出,生动有趣的资料,而不是死板的公式与定理,所以下面的资料都非常有趣,看完能很快对傅立叶变换有初步的理解:

关于工程硕士的思考

最近关于开题的事情搞得焦头烂额,我对论文的想法是尽量锻炼自己的工程能力,将研究生阶段所学的东西都利用了,个人感觉这才叫工程硕士。而实习单位的老师就是一定要跟单位方向结合,要有创新。观念上有冲突,很难开题。

有人会说,还是做一些特别有研究方向的吧,这样才有意义。其实要是想有意义,工作之后有的是机会,从事的工作都是特别有用的,面向的都是几十万几百万甚至千万的用户,哪个不比所谓的科研项目有意义,这才几个用户,才能服务多少人?大学之所以能称为象牙塔,就是自由!工作之后是螺丝钉,技术面被大大限制(虽然深度有所加深,但技术广度往往对技术深度提升有很大帮助)。而在学校,没有任何限制,肆意发挥,想学什么就学什么,想用什么技术就用什么技术(这里不是指就可以不考虑代码的专业性,代码还是越接近工业级越好),允许你去尝试去试错,这样才能在工作后游刃有余。这就是为什么要在综合实践JoyCar中做那么多平台,从stm32无OS到ARM+Linux,从Framebuffer到Qt到iOS。在学校,一定要去做那些工作之后没时间、没精力、没条件做的东西,学校一旦毕业就很难再回去,这才是在学校需要好好珍惜的东西!

有人会说,研究生,就一定要在某个方向上有很深的积累,这样才有竞争力。我一开始也是这样认为的,一定要有个研究方向。可我后来发现我理解错了,方向不一定指研究方向。是,在图像处理、安全等有很深的积累,确实非常有竞争力,可我是工程硕士,跟学术硕士比这点有先天的差距,他们天天读paper,接触的是最前沿,我即使追赶也比较难追赶上,即使追赶上也很难拉开差距。后来我想通了,我在专业相关的基础知识上更深入一点点、积累多一点点、对课程知识多掌握一点点,这些一点点汇总起来,是不是也是种竞争力呢?而且我相信这种竞争力不简简单单是1+1=2的效果,而是能够互相影响互相强化的。强化这种竞争力,很乐而不为?

总之,我对自己工程硕士一直有个要求,就是:夯实基础、加强动手能力。但一直以来这个要求很抽象,很难具体表述出来,直到今天看到一个博客上About Me的说明,特别有感触:

About Me

I Can Bring Ideas Into Reality!

使用Octopress搭建博客

为什么选择Octopress

我一直是一个喜欢做笔记的人,觉得做笔记有以下优点:

  • 在阅读时能够很好的帮助我思考,提炼精华,把握核心,在复习总结时非常有用
  • 能把一些零散的知识通过分类给聚合起来,形成知识体系
  • 每次看到满满一本全是笔记的时候,非常有成就感

之前一直是在用笔在本子上做笔记,比较喜欢自由涂鸦的那种感觉,但渐渐的发现了一些问题:

  1. 纸制的保存时间有限,而且易丢失
  2. 修改扩展起来比较麻烦
  3. 检索、聚合起来不方便

后来试过像CSDN之类的博客,总觉得不好用,尤其是文本编辑,感觉非常麻烦,Vi用多了,喜欢纯文本编辑的乐趣与效率,搜索过自带格式的语言,Html/Xml更适合展示,大量的格式信息把文本“淹没”了,而Latex又过于复杂,直到通过Github学习了Markdown,终于找到了一个适合写作的语言了,在用Markdown写作时有种开心的感觉,就像拿LAMY的钢笔在MUJI的本子上写作一样,各种爱不释手,哈哈。为什么这么喜欢Markdown呢?我觉得有以下原因:

  • 纯文本,所以兼容性强,可以用文本编辑器打开
  • Markdown的标记语法简单清晰,具有很好的可读性,并且不会影响文本
  • 专注于文字而不是排版
  • 格式转换非常方便,可以轻松转换成Html、PDF等

用惯了Markdown之后开始YY,既然Markdown转换Html这么容易,如果能有支持Markdown的博客就好了,于是我Google了一下,发现了Octopress,一个非常酷的博客框架,而且可以deploy到Github Pages上,我擦,Github+Markdown,这一下子击中了我,所以立马用Octopress搭建了一个博客,以后要渐渐将思考、笔记记录到这个博客上了。

专注+坚持,一定能够有所收获!

下面就介绍下如何通过Octopress搭建Blog:

Octopress搭建原理

Octopress的文档上关于搭建步骤已经写的非常详细了,所以这里就不再重复。我是一个喜欢刨根问底的人(处女座),所以对搭建跟使用过程中的这些疑问很感兴趣:

  • 在搭建过程中gem/bundle/rake都是干什么的,为什么rake cmd就执行相关操作?
  • 为什么deploy到Github上的目录跟本地目录不一样(为什么有source跟master两个分支)?

搭建步骤原理

对于第一个问题,Octopress是基于ruby的,因此gem/bundle/rake都是ruby相关的一些工具,可以看一下整理Ruby相关的各种概念这篇文章了解下:

  • Gem:ruby中的包管理器(Package Manager),就如同Ubuntu中的apt-get,方便管理与使用各类ruby包。但是一个项目有可能用很多包,总不能一个一个手动用Gem获取吧?于是Bundle出现了:
  • Bundle:相当于多个Gem批处理运行。在配置文件Gemfile里说明应用依赖哪些第三方包,Bundle自动帮你下载安装多个包,并且会下载这些包依赖的包。
  • Rake:Ruby Make,顾名思义,一个用ruby开发的代码构建工具。由于ruby不需要编译,所以Rake其实相当于一个任务管理工具:
    1. 以任务的方式创建和运行脚本(Rakefile)
    2. 追踪和管理任务间的依赖

所以我们就理解了安装步骤:

  1. 首先用gem install bundler安装Bundle
  2. 通过bundle install,Bundle读取Gemfile中Octopress需要的包,进行下载安装
  3. 通过rake cmd,Rake读取Rakefile脚本中的内容,执行对应的任务

Octopress部署框架

对于第二个问题,Octopress是一个生成器,它根据你的配置与主题,将Markdown格式的文档转化成HTML页面,生成出一个完成Blog(在_deploy目录中),所以应该将生成器与Markdown编写的内容同生成的Blog网页分开,于是在Github上存在两个分支:

  • master:生成的Blog是期望访问username.github.io就访问到的,因此利用Github默认显示的master分支的特性,将生成的Blog设置为master
  • source:Octopress生成器与用Markdown编写的内容放置在source分支

这样,对多台电脑同步Octopress博客的操作也明白为什么要这样做了:

Octopress多台电脑同步方法

建立本地Octopress仓库,操作如下:

1
2
3
$ git clone -b source https://github.com/username/username.github.io octopress //先clone生成器与文章
$ cd octopress // 生成的Blog是被放置在生成器的一个子目录中的,因此要进入生成器目录
$ git clone https://github.com/username/username.github.io _deploy // 然后再clone所生成的内容

更新

1
2
3
4
$ cd octopress
$ git pull origin source # 更新local的source分支
$ cd _deploy
$ git pull origin master # 更新local的master分支

推送

1
2
3
4
5
$ rake generate
$ git add .
$ git commit -m "Commit Message"
$ git push origin source # 更新remote的source分支
$ rake deploy # 更新remote的master分支

Octopress搭建过程中问题总结

1. You have already activated rake 0.9.0, but your Gemfile requires rake 0.8.7

说明Rake版本不匹配,使用bundle update rake更新下Rake即可,具体见这里

2. 如何在侧边栏显示Github仓库

仅仅在_config.yml中将github_user填上Github的用户名是不行的,还需要修改default_asides,将asides/github.html加入。