Author Archives: Andrew

About Andrew

Rheologist

知乎:对于搞科研学术的研究生而言,究竟该专注于平心静气做好研究工作,还是应该为以后找工作早做打算?

原问题地址:http://www.zhihu.com/question/20949946

看了本面其他人的回答,我想补充两点。反正我的回答已经长得不行了,再长点也就那样。

一、我相信这个问题答案不应该是直接让提问者做哪个选择。再加上,我在知乎上回答问题都是借问题来表达一个观点——即那种既适用于具体这个问题,又有点普适性的道理。因为,我希望自己是一个讲原则的人(或者说读书读傻了人死板),我做这个选择的理由,跟我做那个选择的理由,要能够同时符合一个自洽的价值观体系,而不是见利忘义,此一时彼一时,见人说人话见鬼说鬼话……如此各般等等。不是说现在这么做对我有利所有我这么做,而是我一向信奉什么所以我这么做。成功学畅销书也许能帮你分析利弊,但不能强加你一个哲学。人生不是一场生意,不要去做人生的商人。

做同样一个选择,可以基于很多理由。我不赞同你做这个选择的理由,不等于我不赞同你做这个选择。我批评那具理由,不等于我批评那个选择。若要问“那你到底认为该做何种选择呢?”我当然不说,也不应该说,选择就是应该自己做的。我的任务就是摆一通理由,而不是直接说,你就选A吧B是错的。

读了这么多书,至少要形成“知其然知其所以然”的习惯,而不是还停留在“肚子饿了要吃饭,困了要睡觉,来性子了就撸一撸,地上有钱了就捡,枪指头上喊救命”的本能反应水平。只有未成年人才公认不具备承担责任的能力。成年人就是要为自己的选择负责。

在硕士和博士阶段认识“科研是什么”,完全不晚。我想不到有什么方式可以更早地认识这个问题。只是人完全可以选择压根不去认识这个问题。既然你对这个问题产生好奇,你去认识了一番,那就不应该又去抱怨问题的答案让你失望,更不应该说是什么“社会上专家学者”忽悠了你。我天天说哪个歌手很好听,你觉得我从小弹钢琴懂音乐,于是你自己买了张演唱会票,回来你能怪我么?只要我没直接叫你去买演唱会票,我又没有收那歌手的钱违心地宣传他(真心觉得好听),我就没有过错。这不能说是我狡猾,也不能说你被忽悠了,而完全是个正常的代价。

二、我的答案的重点在于“要和先导师商量、讨论”。这也是匿名用户建议的第一条。主要是由于我估计跟导师讨论之后的结果多半就是只能维持做实验的强度,我的答案才会显得好像在叫他将来选择做科研。但我不排除你和导师商量了之后导师就放你跑了这种可能。匿名用户的结局就是这么好。至少,你先跟导师说一声,导师会有所准备,假如在课题项目上安排得过来,说不定也可能允许你缺勤。匿名用户所谓的:“和你的导师谈。他能接受你不做学术,你的朋友有什么好质疑你的?”换个说法就是,只要你有本事说服你导师接受你不做学术就万事OK;即如果说服不了的话就只能自己兜着走。

这跟你不先商量自己跑了是两码事。我十分想强调的是诚信。可是我发现很多中国人的心态就是,如果明知跟你商量了结果对我不利,我就还不如不跟你商量(哪怕道义上我不应该)。即诚信如果对我有利我就讲诚信,如果对我不利我就不讲了。我首先不赞同这种做法。正确的做法是:明知跟你讲了八成对我不利,不跟你讲我就自己完成了;但我还要跟你讲,然后就真的吃亏。这就叫做“不要见利忘义”。

现在我谈谈这里面有什么“义”。我刚才已经说了,并没有谁忽悠你来读研。既然是研究生,那么就不仅是学校的学生,还是课题组这一团队的成员,按照学校和课题组的规定来做事。例如每天八点半到实验室之类。跟导师商量好的实验计划,导师当然有理由定期追问,你当然被假设是所有的工作时间都在课题事务上,因为你读的是全日制研究生。当初要进课题组让你进了,结果你实验不做,实验室不去,要找你你去了别的城市,明天才能回来,突然连续一个月失踪,原来参加了企业实习生……我认为这不能拿你的前途问题来当借口。你嚷嚷着说科研就是个大忽悠,你被骗了,你根本不喜欢科研,你后悔了;但这些都是在你读研之后,体验过了解过之后才说的话。假如这些是你读研之前就知道的事,那你就更恶劣,你故意假装想读研而考入本课题组,主观上就故意来混学历么?你可以选择将来工作,但就读期间你只能完成导师和你讨论商定的实验计划和其他科研任务(写论文投稿)。而且我特别要说的是在这方面你跟导师讨论的余地不多,你没有太多的理由要求导师因为你将来不做科研而让你现在就消极怠工。

在很多现在的研究生看来,这简直要立马上论坛大骂这个导师了。在他们眼中,读研时做不做实验天然就是可做可不做。因为不同的导师不一样严,显得好像也没有一个准则到底要多努力才算合格。自己要多干事,无非是这一个导师特别严。自己到底是多花点时间在实验上呢,还是不做实验去搞找工作的事呢,完全看自己的选择(于是有了本问题),而不用考虑别人。其实不管严也好,松也好,研究生是课题组的一员,是为完成课题组的研究目标而来的。哪怕所谓“自由探索”,也只能是渗透在课题实施的各种环节,不是说整个课题就是“自由探索”。因此,研究生是完成导师所立科研项目的主力。这并不是“免费”或“廉价”劳动力,而是一个完全不惧公开的“行规”。科研经费申请书形式上是要求写明参与的研究生姓名、身份证号码,一年工作时间(多少个月)等信息的。也就是说公认了课题项目是导师立项研究生去完成的,研究生有这个义务。相应的科研酬金以学生三助的形式发放给研究生。但由于项目和经费不同导师不一样,我们学校的做法是学校统一从财政出一部分,然后导师从经费中出一部分,保证每个研究生的补助金额一样。没经费的导师于是就不能招生。这只是避免不同学生补助金额依赖实际参与课题的起止时间的技术性做法。但道理上是因为你参与了课题你才拿到补助。研究生在课题组还有别的义务,例如维护常用仪器,实验室安全,药品管理等等。你突然有一天后悔了,“醒悟”了,然后就不管不顾了,这对整个课题组都是不负责任的。

骂中国的高等教育是一回事,骂社会上的“专家学者”,骂奇葩导师、骂四六级、骂那些你鄙视的书呆子们、那些“万般皆下品唯有读书高”的傻子们,是一回事。“诚信”和“责任心”是另一回事。这些不要说研究生了,从本科生开始就已经很缺乏。本科申报学生科研计划进实验室,来找老师。问他:你每周都哪些时间有空?答曰:周五晚,周六晚和周日下午。课这么满吗?哦,我XXX时间做家教、XXX是预备党员组织生活、XXX协会每周X例会,XX又是家教。我说,你每周忙到只剩这点时间了,还不休息?来实验室,时间也不够啊。他说:参加这个加很多份,而且不用做实验,只要跟着师兄的论文挂个名,将来能评奖……大四的毕业设计,凡是不读研的,基本为零。老师都只能理解一下因为这也是现在的大环境逼的,但这也是做坏了规矩,恶性循环。有的老师要求严一点,学生拍桌子翻脸。其心态就是,凡是我有什么需求要实现,世界上就不应该有别的事可以挡着我。现在我要考公务员,这才是最王道的。其实,这样的学生,我还真希望快点去工作几年,千万别继续留在学校读研。早几年认识到什么才是王道更好,要是一直留在学校,导师又很好说话,那说不定还真的是读到博士毕业30岁了还是这副德性,人生真毁了。

以下是原来的回答。我的回答中有一句话:要想就业好,就要就业早。不知道为什么,似乎还是给人感觉我是在“为学术多说了几句”,甚至是建议提问者将来去做科研。翻了一下我其他问题的答案,发现,叫年轻人早点接触职场早点实习的观点我不止一次表达,例如如何让注意力集中在单独一件事上?但是,知其然要知其所以然,重点是理由。是理由让我跟别人的观点不同,我之所以为我。
====================================
我觉得匿名用户的答案比我好,不想看长篇大论的,看了他的答案基本就了解我的观点了。

一个人怎么取舍,除了利弊的衡量之外,还有个人性格气质方面的因素。哪怕明摆着有利的选择,你就是不喜欢,也可能不做。你因为自己不喜欢而不做这个有利选择,很可能事后也不会后悔。思考的方法大概就是先客观地分析利弊,再主观地掂量一下。后者是很容易的,自己还不知道自己么,但前者对于阅历尚浅的学生来说往往很难——他太不知道人家。

为以后工作“早”作打算的“早”,是有多早?你读书读了十几年,最后两年才为工作做打算,算不算早?为以后工作早作“打算”的“打算”,又是什么“打算”?好吧,现在你可以不做实验了。那你会做什么呢?每天做的什么事情,才属于“为以后工作早作打算”呢?现在你马上要做什么事情与做实验冲突了吗?毕业工作不好找,你是已经想到什么事情,现在去做,你毕业工作就会好找吗?

现在学生普遍存在的问题,一个是高谈阔论(这其实不仅限于“现在的”学生,而是年轻人普遍喜欢)。二是只做能立马兑现成果的选择,说“功利”已经不够准确了。问题是,这两个问题之间就是矛盾的。真要追求做每一个选择都立马兑现,最要不得的就是高谈阔论,而是要变得非常实际和通透才行。如果你的水平只限于高谈阔论,你休想做什么选择能立马兑现,乖乖地走弯路碰钉子去吧。

做导师的当然会抱怨,现在的学生全都不是来做科研的,都是为了拿学历,至少缓冲就业。做导师抱怨这个,是因为于是他们就没办法对学生要求太高,课题的质量和档次就提不上来。做导师抱怨这个也是很无奈,说到底也是不能怪学生的。因为他不喜欢的话完全可以不招学生,现实是他也必须招,因为生源的普遍情况就是这样,没学生干活不行。这是买方还是卖方市场的问题。

但学生不是完全没有考虑这个问题的义务的。在读研甚至读大学之前,我们的学生太习惯于老师必然是无私奉献的,以教育学生为自己全部的职责的,所以读研之后大多数会对研究生导师不大满意,跟自己以往对老师的印象反差很大。事实上,读研是一种合作。学生要获得培养,导师要完成课题。于是你问:导师为什么就没有培养学生的义务?本来是有的。但现实是,导师只能把学生培养成为独立的科研工作者,培养成企业主管不是导师能力和责任所在,但大多数学生并不愿意接受这样(科研)的培养,所以只好退到“合作”这一步。如果连“合作”都谈不拢,就干脆别选择这个导师了。

可是有很多人事先没有跟导师谈过这个问题,都按自己的想象行事。最后毕业成问题,才突然撕破脸皮。所以,如果你要为你将来就业“早做打算”,第一件事要做的就是问你导师,你毕业的条件是什么。学校的要求满足了是不是就足够了?导师是否有自己的要求。其实你现在谈都迟了,很可能你会发现这个导师的要求很高,你如果要完成他的要求,还真没有时间做别的事情。说不定你导师会说,你现在这个反应做不出来就别想毕业(你做熟手了,毕业走了,上来的学生又是生手。如果你不把成果做到发表那一步,决不放你走是很有可能的,但也不是绝对)。具体,要你自己跟你导师谈。由于现在谈是迟了的,所以谈出来什么结果,你都只能自己吃不了兜着走,只能说是你现在事后了解一下,不是真正的谈判。总之,你处于学生的状态,毕业是首当其冲的重要问题。没有顺利的毕业,就业什么都是浮云。你早做任何其他打算都属于无用功。

不知道你在什么学校,什么城市,什么专业背景,什么研究方向,你的师兄师姐就业就如何“不理想”。你能排除你自己对“职业”的理解还很幼稚这一因素吗?硕士刚毕业是想要有多理想?我不是想深入到这个话题。而是提醒你,如果要为将来就业早做打算,首先要理解就业本身是怎么一回事。你如何制定你的职业规划?职业规划不是凭空制定的。一开始你需要了解很多别人走过的路,例如刚毕业他什么情况,两年后他怎么样,五年后,十年后他又怎么样;从中你发现一些疑问,就能加深你对你这个专业在社会上对应的行业的理解,从而自然而然地形成你自己的职业规划。这些信息,课题组里应该是能了解到的。你先要认识这个行业,了解你们这个专业出去的人,在这个行业中发挥什么作用,扮演什么角色。只要保持对行业持续加深理解和实践,毕业刚开始差一点影响不大。

我不知道你了解完之后,会有什么感觉。我的经历告诉我,除了英语和学历之外,在学校里基本没有什么可以为将来就业早做的“打算”。想要就业好,就要就业早(但你又想要学历,所以去读个研)。工作之后的事情,有八九成是在学校里很难培养到的。千打算万打算不如早点进入社会。有的专业研究生阶段很闲,会去实习。但化学专业要做实验往往还要通宵,这个是谈不上的。不过,你心理也要平衡:为什么要做那么多实验还要通宵?无非是怕毕不了业。而刚都说了毕业是首当其冲的,这你没办法。既然如此,还不如专心把这学历和学位拿到手。

你是否觉得现在做实验,无非是读研阶段要做的事情,将来一辈子都不会再做化学实验了,加上这么困难,所以你现在也不想好好做了。如果你阶段性的事情你就不好好做,培养这种气质属于“为将来就为早作打算”吗?那么用人单位会把你放在一个永不升职、永不调换、永不超生的岗位去——这种老实人只有长期做一件事才愿意好好做,就让他在这个岗位上做一辈子吧。我敢保证,你毕业后的第一份工作一定是不好的,你肯定要换;我也敢保证,你换的第二份工作也不好,因为那时候你有男朋友(女朋友),他她很远,他她这个他她那个不对付;我也敢保证,你换的第三份工作也不好,因为你小孩上幼儿园在XX区要接受,你妈生病了每周四要去XX医院挂专家门诊你必须开车送她,你工作脱不开身要换……但是,如果你第一份工作做得不好,你甚至连第二份这样能不定期支付给你女友搞点小惊喜的工作都找不到,更不要说你的第三份工作那样虽然地点远但是能养活你妈你小孩你全家的工作了。那个时候很可能你早就忘了你研究生课题那个反应物重结晶的温度了。但你把每个阶段性任务做好的素质正在默默地为你的人生保驾护航。我现在讲的还只是做事的素质的其中一个小小的方面。你还在学生时代都嚷嚷说实验很忙百忙之中抽不出时间来做别的,我看你离好的就业单位也比较远。

一个人是生活在一定的人际关系和体制环境之中的。并不是说因此你就人在江湖身不由己,而是说自由就不是天然获得的,而是要寻求,甚至争取的。坐在哪里又不寻求又不争取,只会觉得所有门都是关着的。现实就是你不能全不管你的课题要求又不去实验室跑去参加EF商务英语课程考公务员注册会计师考驾照做企业实习生,但又不能好像永远都读研一样在一个100%不可能拿诺奖的课题上挖掘你自己都不知道是啥的深度结果其他素质全部停留在应届本科生的水平就没提高过。现实就是你必须宁为瓦全不为玉碎。现实就是被迫要做那种妄图鱼与熊掌兼得努力。想法不能停留在怨天尤人或者高谈阔论的层面。到底你在现在这种阶段,要为将来就业做哪些准备?要占用多少时间?你如何安排你的工作和生活去适应?问题具体化,做决策,执行计划,成果管理,培养一下这些事情,也算是“为将来就业早做打算”吧。

最后讲一句:学生的知识面和眼界太窄,没有资格去做那些能立马兑现的打算——这种欲望是毛头小孩都有的,但能力是军师级别人马才具备的。学生能做的基本上都是那种长远起见的积累,读书啦,参加社团啦,学外语啦什么的。不要去鄙视这些事情,因为你只能做得好这些,乖乖地把这些都做好来。麦子成熟的时候,果实饱满的麦穗是低头弯腰的,直杆的都是空壳。

Fourier变换(一)

[mathjax]

为了带师弟做实验,简要总结一下在MATLAB里进行Fourier变换的一些代码,以供大家参考。

Discrete Fourier transform (DFT): The sequence of N complex numbers x0, …, xN-1 is transformed into an N-periodic sequence of complex numbers according to the DFT formula

X_k=\sum_{n=0}^{N-1}x_n e^{-i2\pi kn/N}\quad k=0,1,\cdots,N-1.

一般把变换前的信号xn当成时域信号,变换后的Xk当成频域信号。可见,时域是N个单元的信号,变换后频域还是N个单元的信号。什么周期啊频率啊这些信息是暂时没有的。例如xn为以下这个序列(Fig. 1),横坐标就是序号n。这段序列,可以是一段10秒钟的的信号,也可以是一段100秒钟的信号。当然,实际情况下一段信号是多少秒是事先知道的,出来的信号一共有多少个单元值(N)则取决于我们隔多长时间取一次样。如果一段10秒钟的信号,我们每秒取一次样,这个序列就有10个单元(N = 10)。反之,Fig. 1的这个序列N = 93,假如这个信号是每隔0.1秒取一次样得到的,这个信号的总时长就是9.2秒;而假如这个信号是每隔10秒取一次样得到的,这个信号总时长就是920秒了。每隔多长时间取一次样,可以用取样频率fs来表示。fs = 10 Hz就是每隔0.1 s取一次样。所以,为了给一对离散Fourier变换xnXk赋以周期或频率的信息,必须给时域信号规定一个fs。一旦fs规定了,周期和频率也就规定了。还拿Fig. 1的序列为例,设该序列的取样频率fs = 10 Hz,则该序列每个单元隔了0.1 s。我们可以数一下这个序列一个周期有多少个单元——20个,那么该序列的周期T = 2 s,频率f = 0.5 Hz。

Figure 1

Figure 1

事实上Fig. 1的序列是一个有一定时延的正弦序列(即不是从零开始),我们已经根据规定的fs知道了它的周期和频率,不仿就把它改作在时间轴上(Fig. 2)。

Figure 2

Figure 2

可以看到,该正弦信号的零位在第17和第18个单元之间,即在1.6 s到1.7 s处,以1.6 s计算,该信号可写成x\left(t\right)=A\sin(\left[2\pi f\left(t-1.6\right)\right]=A\sin(\left(2\pi ft+\delta\right),则相位角\delta=-1.6\pi,换成0到2π之间就是\delta=0.4\pi=1.2566。若取时移是1.7 s得\delta = 0.3\pi = 0.9425,所以δ应该在0.9425到1.2566之间。从图中还能读出振幅A = 2,则信号x\left(t\right)=2\sin\left(\pi t+0.9425\sim1.2566\right)。用正弦函数去拟合Fig. 2的序列发现其实最精确的函数描述应该是x\left(t\right)=2\sin\left(\pi t+1\right),见Fig. 3。

Figure 3

Figure 3

现在我们试着在MATLAB通过Fourier变换来精确地得到xn的幅值和相位,重构一个xn所对应的连续信号。首先构造上述的时域信号:


t = 0:0.1:9.2; % fs = 10 Hz
t = t(:); % convert into column vector
f = 0.5; % f = 0.5 Hz
x = 2 * sin(2 * pi * fi * t + 1)

前面说过对一组N个单元的序列进行Fourier变换之后得到的Xk也是一个N个复数单元的序列。我们看看它长什么样(分开模序列和辐角序列):


Xraw = fft(x);
stem(abs(Xraw),'o'); % Figure 4
stem(angle(Xraw),'o'); % Figure 5

Figure 4

Figure 4

Figure 5

Figure 5

我们从Fig. 4可以看到结果跟我们想像的差很远。主要有以下四个问题:

  1. 频域谱分成了对称的两半。要取左边一半。但总单元个数为奇数(N = 93),到底是取46个还是47个?
  2. 若只看一半,频谱出现了单峰是没错(因为我们的信号只有一个频率),但它不是只在一个频率上,而是有一个很宽的分布,似乎我的输入信号的频率是“不纯”的——这并不符合事实
  3. 幅值不对,信号幅值是2,但频谱的峰高快到80了
  4. 横轴如何对应到真实的频率轴?

我们一个一个问题地解决。第一个问题,按照fft算法的规律,若N为偶数,则左右分成各N/2的两半即可;若N为奇数,则处于中央的那个单元是左右两半谱共用的。所以,无论取左半还是右半,都取(N+1)/2+1个。综合奇数和偶数的情况,对任意正整数N的取法就是对N/2向上取整。


N = length(x);
Xraw = Xraw(1:ceil(N/2));
stem(abs(Xraw));

第二个问题,之所以频谱的峰有一个很宽的分布,是由于谱泄漏(spectral leakage)现象,简单地说就是我们用来做Fourier变换的信号序列长度并不是恰好整数个周期。只有截取整数个周期来做Fourier变换,才能避免谱泄漏。可是对于一个未知频率的信号,我们本来就是要通过Fourier变换来知道它的频率,又怎么能在此之前就得知信号的周期呢?这种情况下,只能采用另一种方法,那就是把信号的首尾进行某种衰减处理,而这一处理在数学上又要保证不严重影响Fourier变换的结果,称为加窗操作(windowing)。详细的原理不在此详述。作为示范,我们可以利用我们对时域信号的已知信息来解决。已知信号周期T = 2 s,取样频率fs = 10 Hz,到底截取多少个点算一个周期呢?前面计算过了,20个点。干脆我们就只取一个周期得了,试试看:


x_cut = x(1:20); % N = 20
Xraw = fft(x_cut);
Xraw = Xraw(1:10); % N=20, so ceil(N/2) = 10
stem(abs(Xraw)); % Figure 6

Figure 6

Figure 6

这次,频峰值终于只出现在一个频率上了。而由于用来做Fourier变换的信号N减小到了20个,所以频域信号也就只有20个单元,取左半边就是十个单元。但我们看到,峰值也变了,原来近80,现在是在20。这说明,这个不正确的峰值,是跟N值有关的。这就涉及到第三个问题:峰值怎么校正回来。其实,我们做离散Fourier变换,需要进行归一化。但是怎么归一化,要看离散Fourier变换和反Fourier变换的具体规定,不同的书规定不一样。MATLAB里fft命令是需要用N来归一化的。但如果出来双面的频谱,各边就要用N/2来归一化。所以进行了归一化的的Fourier变换操作应为:


Xraw = 2 * fft(x_cut) / 20;
Xraw = Xraw(1:10);
stem(abs(Xraw));

出来的结果,峰值就会准确落在2(图略)。现在剩下最后一个问题,那就是横轴怎样换成真正的频率?这就要先了解Shannon-Nyquist定理。在此我只把结论说出来:频域信号单元的间格频率是fs/N。因此整个左半边谱的频率范围就是0 Hz ~ fs/2 – fs/N。为了解决奇数偶数问题(即以防fs/2不一定是fs/N的整数倍),最终我们就如下构造相应的频率轴:


freq = 0:fs/20:(ceil(N/2)-1)*fs/N;
freq = freq(:);
stem(freq,abs(Xraw)); % Figure 7

Figure 7

Figure 7

其实,要取整数个周期,不一定要只取一个周期。原时域信号至少有4个周期(见Fig. 1),所以我们可以取满整4个周期来做Fourier变换:


x_cut = x(1:80); % 4 cycles = 80 points
Xraw = 2 * fft(x_cut) / 80; % N = 80
Xraw = Xraw (1:40);
freq = 0:fs/80:fs/2-1/80;
stem(freq,abs(Xraw)); % Figure 8

Figure 8

Figure 8

可见,当我们多取几个周期时,Fourier变换的结果频率“分辨率”更高。因此为了获得尽可能完整地信息,要在保持取整个周期的同时,尽量取最多个周期来进行Fourier变换。我们把相应的辐角谱也作出来:


stem(freq,angle(Xraw); % Figure 9

Figure 9

Figure 9

我们发现,跟Fig. 5相比,Fig. 9的辐角谱显得非常杂乱无章。这是由于我们很好的消除了谱泄漏。规律:谱泄漏越严重,辐角谱越有序;谱泄漏避免得越彻底,辐角谱就越杂乱无章。虽然杂乱无章,但是模谱的幅值所在相应频率对应的辐角是应该是正确的。我们看看0.5 Hz处的辐角:


wrapTo2Pi(angle(Xraw(5))) % wrap result within 0 to 2Pi

结果不对,这是由于在MATLAB的fft得到的辐角差了π/2,要加上:


wrapTo2Pi(angle(Xraw(5))+0.5*pi)

这次就对了。

问题是,在实际应用中,我们不可能做一个Fourier变换,就作一次图,用肉眼看出峰值落在哪个频率上。必须事先就知道信号频率f在频域信号中的对应序号,直接就给出模的峰值和相应的辐角。所以,现在的问题是,如何不通过作图就知道,对于一个频率为f,采样频率为fsN个单元的信号xn,进行了上述的Fourier变换后得到的Xk,第几个单元呢对应着f?这很简单,Fourier变换后的频率间隔是fs/N,因此,第Nf/fs+1个单元就是模的峰值所在频率。本例子中既可验证。

但是,假如信号的频率f在Fourier变换之后的频率轴上的位置,是恰好在频域信号两个单元之间呢?例如,我的信号频率是f=0.51 Hz,fsN值不变,按照上述算法,要取第5.08个单元,当然不存在这个非整数单元。这就是说,我们要对Nf/fs+1这个公式加一个四舍五入的取整。注意,由于信号频率不同了,“整数个周期”的截取可能会略有不同。以下是具体的运算过程:


f = 0.51
x = 2 * sin(2 * pi * f * t + 1);
N = length(x);
N_per_cycle = fs/f; % average points per cycle
N_cycles = floor(N / N_per_cycle); % maximum number of complete cycles
N_cut = round(N_cycles * N_per_cycle); % number of points for FFT
x_cut = x(1:N_cut);
Xraw = 2 * fft(x_cut) / N_cut;
Xraw = Xraw(1:ceil(N_cut/2));
freq = 0:fs/N_cut:fs/2-fs/N_cut;
abs(Xraw(round(N_cut*f/fs)+1))
wrapTo2Pi(angle(Xraw(round(N_cut*f/fs)+1))+0.5*pi)
freq(round(N_cut*f/fs)+1)

结果离真实值就稍有偏差。这时,如果我们试试把fs提高到1000 Hz。


clear all;
fs = 1000;
t = 0:1/fs:9.2;
t=t(:);
f = 0.51
x = 2 * sin(2 * pi * f * t + 1);
N = length(x);
N_per_cycle = fs/f; % average points per cycle
N_cycles = floor(N / N_per_cycle); % maximum number of complete cycles
N_cut = round(N_cycles * N_per_cycle); % number of points for FFT
x_cut = x(1:N_cut);
Xraw = 2 * fft(x_cut) / N_cut;
Xraw = Xraw(1:ceil(N_cut/2));
freq = 0:fs/N_cut:fs/2-fs/N_cut;
A = abs(Xraw(round(N_cut*f/fs)+1))
delta = wrapTo2Pi(angle(Xraw(round(N_cut*f/fs)+1))+0.5*pi)
frq = freq(round(N_cut*f/fs)+1)

结果就比之前更接近真实值了。这说明,时域信号的采样频率越高,越有利于精确地重构。现在可以看一下重构的效果:


x_rec = A * sin(2*pi*frq*t+delta);
plot(t,x,'bo',t,x_rec,'r-') % Figure 10

Figure 10

Figure 10

下一篇文章会介绍当原时域信号的频率“不纯”的时候如何通过Fourier变换进行重构。

最近我家的ADSL访问andrewsun.net速度很慢(包括SSH),访问bluehost.com同样也很慢。我也懒得更换服务商了,只能忍着。

以前也试过几次,一段时间内访问andrewsun.net很慢。我对网络不是很了解,我只懂用tracert试一下,看看是到哪个关口开始变慢的。这次跟以前的几次一样,变慢的瓶颈都是已经出了美国的,说明不是国内的问题。前几次过一段时间都自动好起来了,这次我希望也是这样吧。


Tracing route to andrewsun.net [66.147.242.154]
over a maximum of 30 hops:
1 2 ms 1 ms 1 ms dir-605 [192.168.1.1]
2 7 ms 7 ms 7 ms 183.3.12.1
3 8 ms 8 ms 7 ms 183.56.34.37
4 12 ms 10 ms 12 ms 121.33.224.77
5 9 ms 8 ms 8 ms 61.144.3.30
6 9 ms 9 ms 11 ms 202.97.33.178
7 10 ms 9 ms 9 ms 202.97.60.197
8 177 ms 178 ms 179 ms 202.97.58.214
9 174 ms 175 ms 174 ms 202.97.49.154
10 182 ms 186 ms 187 ms 10gigabitethernet10-6.core1.lax1.he.net [64.71.1
31.133]
11 166 ms 164 ms 170 ms 10gigabitethernet1-3.core1.lax2.he.net [72.52.92
.122]
12 183 ms 181 ms 191 ms 10gigabitethernet3-1.core1.las1.he.net [184.105.
222.162]
13 205 ms 199 ms 211 ms 10gigabitethernet1-1.core1.slc1.he.net [184.105.
222.158]
14 661 ms 673 ms * ace-data-centers-inc.10gigabitethernet1-4.core1.
slc1.he.net [66.160.133.118]
15 193 ms 297 ms 194 ms 199.58.199.118
16 649 ms * * box554.bluehost.com [66.147.242.154]
17 651 ms * 648 ms box554.bluehost.com [66.147.242.154]

Trace complete.

Tracing route to bluehost.com [74.220.195.50]
over a maximum of 30 hops:

1 2 ms 1 ms 1 ms dir-605 [192.168.1.1]
2 7 ms 7 ms 7 ms 183.3.12.1
3 7 ms 8 ms 8 ms 183.56.34.37
4 13 ms 10 ms 10 ms 121.33.224.77
5 9 ms 8 ms 8 ms 61.144.3.30
6 13 ms 10 ms 9 ms 202.97.34.114
7 10 ms 9 ms 9 ms 202.97.61.238
8 176 ms 175 ms 175 ms 202.97.58.226
9 179 ms 179 ms 179 ms 202.97.49.154
10 166 ms 171 ms 174 ms 10gigabitethernet10-7.core1.lax1.he.net [64.71.1
51.221]
11 172 ms 173 ms 180 ms 10gigabitethernet1-3.core1.lax2.he.net [72.52.92
.122]
12 186 ms 188 ms 185 ms 10gigabitethernet3-1.core1.las1.he.net [184.105.
222.162]
13 206 ms 199 ms 199 ms 10gigabitethernet1-1.core1.slc1.he.net [184.105.
222.158]
14 657 ms 660 ms 654 ms ace-data-centers-inc.10gigabitethernet1-4.core1.
slc1.he.net [66.160.133.118]
15 * * * Request timed out.
16 * * * Request timed out.
17 * * * Request timed out.
18 * * * Request timed out.
19 * * * Request timed out.
20 * * * Request timed out.
21 * * * Request timed out.
22 * * * Request timed out.
23 * * * Request timed out.
24 * * * Request timed out.
25 * * * Request timed out.
26 * * * Request timed out.
27 * * * Request timed out.
28 * * * Request timed out.
29 * * * Request timed out.
30 * * * Request timed out.

Trace complete.

最近看了电影The Intouchables,又看了一些对该电影的评论。有部分人觉得很纳闷这电影为什么让这么多人感动。我是感动了的,但我也想猜不觉得感动的人可能有不同的原因,第一就是太老到,电影看多了,而这一部电影无非是一个中规中矩荷里活友情片,或者另一部Driving Miss Daisy。这点我也同意,这部篇子成功之处在于演员的表演,而且导演的技巧也蛮好的,然后其余的地方没犯大错,故事其实是套路。这在预告片的编排上反映得更明显,先是渲染两人友好的一面,忘记了两人背景的悬殊;然后突然点出这一点,激起观众的关注,看两个主人公能否“冲破世俗的藩篱”。世俗的而懦弱的观众们当然是永远都爱去电影院看主人公如何“冲破世俗的藩篱”的。在电影中,总要有些傲慢的配角来提醒观众这种“藩篱”的存在,但这些无非都只会为主角的可爱程度加分。例如Driving Miss Daisy里那个儿子,在The Intouchables里Philippe的女儿。这些安排,在自己都懂写小说写剧本的专业电影人那里已经太小儿科了。就好像我看《海上钢琴师》无法带感,我某军迷哥们说《士兵突击》是“太监戏”一样。

第二就是太纯真所以感觉不到这故事里有何值得珍惜的可贵之处。电影里也有几处线索。Philippe自己说,他要的就是一个“没有同情心的人”,可以忘记他是残废的。第二是Driss离开之后,Philippe新换的护理的表现。特别是半夜Philippe痛症发作的时候,新护理那副反应。大多数人(包括我)都会容易向不幸的人施以礼节性的同情心。明知自己不可能真正体会到对方的感受,却又自知不能停留于此,一定要通过自己想象去体会一番,作出自己应有的表演,事实上只是为了自己好受些。这种“做善事的人”常有的心态,也常见于那些下乡体验的慈善组织中。这种礼貌的问题。相比Driss的情况,就是“过于有教养”,又“不够通透”。所以也就是既不够老到,也不够纯真的大多数庸人们会觉得感动。我相信假如像Driss这样的人看这部电影,是不会觉得非常感动的。并非Driss完全不具备任何同情心,只是这一种“同情心”,没有好过有。Driss没有过多的教养却足够纯真,而Philippe有了颇为丰厚教养但又足够通透。他们能够成为很好的朋友,是他们应得的幸福,也是处于中间的“两头不到岸”的我们会感到羡慕的幸福,我们当然要感动一番了。我个人看这个片子的收获就是怎样去对待朋友的不幸才会让他舒服。这很实用。