Category Archives: 个人生活

与专业无关的内容。

科学的“边角料”是啥?

看到有人在豆瓣上提到一本书叫做《科学的边角余料》,非常直白地把“科普”的本质作为了一本科普书的标题。我之前也试用过一句话是“所谓‘科普’跟‘科’一点关系都没有,它只是力图从科学中挖掘一些人文意味进行发酵”。但这句话太文纠纠了,还不如“边角料”这个词来得纯真粗犷。也许科普教主们会反驳说:

其实人民群众也不求知道高深的科学原理,你以为他们笨到以为这些就是科学本身么?想不到你读了这么多书学到的竟是这种想法。

当然,并不是真的有什么科普教主跟我说过这翻话。我只是猜他们是这么想这么看的。与“人民群众”拉近关系的同时攻击离“人民群众”遥远的其他角色,其实不仅“科普”人懂。反正人民群众也不知道富人真正是啥样,想啥。看也只能看到表面。随便你说。“读过很多书”的人也一样。就跟中小学校曾经告诉他们“科学家很伟大”他们只能信一样,现在的科普人告诉他们“科学很好玩”,他们也只能信。你说这就是“边角料”、那些就不是“边角料”,也是随你说的。你的书就不是用来给能够评判你的受众看的,你爱说啥说啥。

但我也做过相反的事情——提出了“科学史比科学更有趣”这种观点,呼吁这些不得不靠搭乘“科普”快车赚大钱的伪公共知识分子们,反正也是忽悠,搞点“科学旧闻”搭配一下,讲讲故人故事,不也很“人文意味”很“边角料”么?关键是,我估计就算有人这么做了,我看了还是会不满意。因为也许问题不在于“普啥”,而在于今时今日什么形式能“普”什么形式则“普”不成。古典音乐会曾经何时跟现在电影院一样,现在电影院就都差不多变成古典音乐会了……现在就算它讲点儿故人故事吧,都必须要伪装成今人今事;明明记录在案的事情,非要伪装成爆料八卦狗仔队交差作品。其实就算“科学旧闻”,也别指望它诚实——无非还是从中找到一些“边角料”而已,有所言有所不言。

在MATLAB做Fourier变换的相关代码

每次遇到Fourier变换都忘记的基本代码。

如何获得“右半边”的Fourier变换谱?

所谓“右半边”的Fourier变换谱其实就是频率大于零那半边。对FFT来说其实是截取“左半边”。


function [X,freq]=lhsFFT(x,Fs)
% Cuts the left-hand side of FFT
% x is the signal sample to be FTT-ed, Fs is the sampling frequency of the signal
% X is the FFT result, freq is the frequency axis

N = length(x);

freq_bin = 0:N-1; % the frequency bin
freq_res = Fs / N; % the frequency resolution
freq = freq_bin * freq_res; %create the frequency range
X = 2 * fft(x) / N; % normalize the data
cutoff = ceil(N/2); %length of the left-hand side

freq = freq(1:cutOff);
X = X(1:cutOff);

获取某频率的幅值

问题其实就是决定某频率值落在第几个frequency bin,然后四舍五入取最接近的那个频率。


N = length(x);

freq_Res = Fs / N; % the frequency resolution
[X, freq] = lhsFFT(x, Fs) % get the left-hand side FFT

f = 1.234 % The queried frequency is 1.234 Hz for example

freq_bin_prime = round(f/freq_res); % finds the frequency bin closest to f
freq_prime = freq_bin * freq_res; % the resolved frequency closest to f
X_prime = X(freq_bin_prime + 1); % the amplitude of the resolved frequency (vector index starts from 1)

测量正弦信号的频率为什么要用sine wave fitting代替FFT?

理由一:做FFT需要实现coherent sampling,实现coherent sampling需要事先精确获得信号实际频率。用FFT测频率是循环论证自食其果。

理由二:就算通过手动(肉眼定位)来确保coherent sampling,FFT还受bin的限制。假如频率分辨率不高,FFT给出的频率仅仅是最相近的bin的值。一般这个是通过zero padding解决,但是LAOS实验由于其他原因,不能做zero padding。

另:为什么不用zero crossing方法?因为这个方法对噪音非常敏感。本来只有一处zero crossing的,由于噪音会在附近出现N多处。

sine wave fitting的问题在于,如果频率作为parameter的话,这个函数是没办法线性化的。因此只能做iteration。经验表明,fitting的成功率非常依赖于你给的频率初始值。最好要让频率初始值尽可能的接近真实值,否则会收敛不了。所以做sine wave fitting之前仍然有必要采用其他方法对信号频率进行初估。FFT在此派上用场,但不是唯一的办法。

这里有一个相关讨论。

一个现成的软件在此。该软件包含对IEEE标准的几个简单和十分有益具体化,值得重点参考。MatlabCentral上还有一个现成代码可供试用。