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上还有一个现成代码可供试用。

我工作上的一些缺点

搞搞文化大革命,自我检讨下。下面说到的所谓“工作上的缺点”有大的也有小的。

一是Word的使用问题。论文投稿和各种文书都是要经导师最后处理送交的。因此我在做的时候应该考虑方便导师编辑修改。有几点需要注意。

一是各种域的使用。首先就是EndNote插件生成的各种域,其次就是我自己做的图、表、公式交叉引用的域。使这些域代码其实仅在我从无到有地写一篇文章的时候才会有用。等文章成型了,不需要大修之后,就要把所有域结果转化为一般文本。中途发给导师的版本也需要把所有域结果转化为文本,等导师发回来修改,如果有确有必要利用域功能,再跟本机的以往版本小心地整合,把导师改了的部分替换进去。这么做能够保留原有的域代码。修改完之后再把域代码转成文本发回给导师。如果没必要使用域功能就不用再这么弄了。因为只有需要大修的时候才会需要利用域功能。

其次就是文章模版格式问题。各期刊的格式说明纷繁芜杂,在此条件下导师一律在意的是:参考文献格式、图的标号和说明、摘要长短、关键词个数等。导师一般优先按照新发表论文或新上线preprint的格式。

不要把麻烦留给期刊编辑,人家没要求的方面,能顾及的还是一律要顾及。例如“期刊说明没具体要求图要不要有框”,但假如人家上线的文章的图一律是有框的,你也得加框,“人家期刊没要求”这个借口是不成立的。

与导师商量修改后,要把所有修改意见总结成一个list,不要说改这个就改这个。因为文章改来改去,有时会改出前后矛盾的莫名奇妙的新错误,而大家往往都会以为改了的就是对的,不总体看的话很难发现这种“派生”的错误。

公式使用Office自带的公式编辑器(这个我一向都是),图使用OriginPro。OriginPro不要改默认字体。因为导师电脑是没改默认字体的。默认字体不一样,在我机子上的OriginPro看着正常的图,到了导师机子那里保不准会出现异常,增加导师的麻烦。

跟导师讨论问题的时候,不要对自己的记忆力和智商太有信心。事实证明聊完了还是会忘,可能是因为我导师喜欢轻松地闲聊,不喜欢下命令。所以兴兴奋奋地聊完了之后很容易忘了要做的一共有什么。还是要带个笔记本,看来这不只是装装样子。

以上是关于Word使用的问题。我另一个工作上的问题是做事风格。我做事习惯完全不理会整件事情的进度。这可能是因为绝大多数任务恰好就是我的兴趣,一直以来,我只要凭兴趣做,多半不影响完成任务。因此在任务进度和所谓“执行力”方面一直没有真正的锻炼。我习惯挑任务中最有兴趣的那一part先做,而且一做就走火入魔不管其他部分,到最后时间拖很久,也很狼狈。这个改起来有点难但还是要改的。