Monthly Archives: May 2012

质疑的能力和勇气是哪里来的?

经常有老生常谈的论调是说中国的学生缺乏“质疑精神”。整天只停留在这种讨论层面的人,似乎自己就不经常质疑。质疑过才知道,问题的关键不是在于具不具备这种“精神”,而是在于具不具备这种能力和勇气。勇气很重要,这很好理解。例如,质疑某些东西你就要具备闯美国大使馆的勇气。但能力是很多人忽视的东西。叫你质疑,你连质疑啥都不知道。勇气是有的,乱质疑一通,这才是“中国学生”最常见的现象,尤其是在网上。去科学网看看那些个评论的水平就能了解了。所以我觉得中国学生不是缺乏质疑的“精神”或者“勇气”,而是缺乏质疑的“能力”。

由于战乱和“文革”,目前我们社会充斥着的是不学无术的人。但是人人都要上中小学,所以中小学充斥着不学无术的老师。不学无术的人做老师,自然就不敢传授放诸四海而皆准的东西——逻辑。因为,教懂了学生这个,日后学生反过来质疑自己,一旦答不上来,就没有权威了——而权威感是不学无术的人维持尊严的工具。所以,中小学上课,并不需要逻辑。老师讲的是对的——哪怕老师这次跟上次讲的自相矛盾吧。所以中国的中小学教出来的学生不尊敬老师。同时也没有质疑的能力——逻辑。

不懂质疑的一个表现是,不敢质疑问题本身。好像一个一旦被提出,就无论如何也得回答似的。因为考试就是这样的,试题都已经出在试卷上了“试论社会主义制度的优越性”,你无论觉得这道题本身有多扯,在你看到它的时候,质疑已经迟了。长此以往,学生习惯了硬着头皮回答胡扯出来的问题,甚至都感觉不到问题本身有多扯。

所以为什么现在我们的大学经常提倡“创新”,就在本科生中间搞各种各样打着“创新”旗号的比赛,结果催生出来的作品,无非都是一些“回答问题”、“解决问题”,特别顺理成章。因为,领导内心其实要的是顺理成章式的“创新”,决不希望离经叛道式的“创新”。这跟中小学老师不学无术的后果是类似的。

波形重构程序GUI

为LAOS波形重构做了一个GUI。

波形重构GUI

除了上一篇文章提到的一些问题外,还有其他的难题。最主要的就是,当原信号的数据量特别大的时候,正弦波拟合函数和MITLaos都会出错。我设计了一个判断,适当时候把信号down sample了再做正弦波拟合和MITLaos,前者基本没问题了,但后者还是不时出问题。只要正弦波拟合没问题的话,波形重构是没问题的,没必要卡在MITLaos上。所以我打算不用MITLaos,直接在重构了的波形上求导得到G_M、G_L等参数。事实上,在程序中G_k参数就是通过直接求导得到的,结果令人满意。

波形重构代码

对真实世界的信号进行求导,需要先大幅提高信号的信噪比,否则求导运算就是一个噪音放大器。对于LAOS实验的信号,由于假设其为一系列奇次谐波的和:\sigma\left(t \right )=\sum_{n=1:\textup{odd}}^\infty\sigma_\textup{n}\sin\left(n\omega t+\delta_\textup{n} \right )。因此,可以据此直接进行波形重构。即通过FFT得到信号的谐波振幅和相位角,按照此式重构一个平滑的波型,再拿去做微分。原理很简单,但是在MATLAB里整了半天,强度是对的,但相位角永远是错的。研究了一晚上,才发现FFT得到的相位角总是少了90°,也不知道什么原因。总之加上这90°之后就完美了。为了减少日后摸索,把代码贴在这里:


clear all;close all;clc;

%============ Generate the signal for reconstruction ============%

fs=57; % sampling frequency
fi0=10/3; % input frequency

t=0:1/fs:123456/fs; % the length of signal is 12345.
t=t';
delta=[1 3 2 1];
x1=sin(2*pi*fi0*t); % the input signal is a sinusoidal wave;
x2=12*sin(2*pi*fi0*t+1) +3*sin(3*2*pi*fi0*t+3)+0.8*sin(5*2*pi*fi0*t+2)+0.02*sin(7*2*pi*fi0*t+1) +2*rand(size(t)); % the output is a sum of odd harmonics

x=[x1 x2];

%============ Reconstruction begins ============%
fi=sinfapm(x(:,1),fs); % the frequency is obtained by sinewave fitting.

Nr_cycles=floor(fi*length(x)/fs); % number of comlete cycles

N=round(Nr_cycles*fs/fi); % cutoff length for coherent sampling
x=x(1:N,:);

t=t(1:N); % cut the time axis too

Xraw=fft(x(:,2));
phase=angle(Xraw);

freq_bin=0:N-1; % frequency bin
freq_res=fs/N; % frequency resolution
freq_i=freq_bin*freq_res; % frequency axis

cutoff=ceil(N/2); % cut the first half of FFT
Xraw=2*Xraw(1:cutoff)/N;
phase=phase(1:cutoff);

max_nr_harm=7; % in practice the max number of harmonics is determined by the Nyquist frequency

I_n=zeros((max_nr_harm+1)/2,1); % amplitudes of the odd harmonics
delta_n=zeros((max_nr_harm+1)/2,1); % phase angles of the odd harmonics

% extract the harmonic information
for n=1:(max_nr_harm+1)/2
I_n(n)=abs(Xraw(round((2*n-1)*fi/freq_res)+1));
delta_n(n)=phase(round((2*n-1)*fi/freq_res)+1)+0.5*pi; % for the phase angles to be correct 0.5*pi must be added. The reason is unknown.
end
DC=abs(Xraw(1))*cos(angle(Xraw(1)))/2; % Normalization of the DC component need not multiply with 2, so the division by 2. The cosine factor determine the sign of DC offset.

fs2=300; % reconstruct the signal at a higher sampling frequency

t2=0:1/fs2:t(end);
t2=t2';

reconst=zeros(length(t2),2);
reconst(:,1)=sin(2*pi*fi*t2); % the input signal at high sampling frequency

% reconstruct the output signal by summing up the sine components
for n=1:2:max_nr_harm
reconst(:,2)=reconst(:,2)+I_n((n+1)/2)*sin(n*2*pi*fi*t2+delta_n((n+1)/2));
end
reconst(:,2)=reconst(:,2)+DC; % DC shift

plot(x(:,1),x(:,2),'k',reconst(:,1),reconst(:,2),'r')

为了展示,该代码生成一个示范信号。这个示范信号的频率、取样频率和长度都尽可能的任意(频率是个除不尽的小数,取样频率是个质数,长度是12345),也增加了比较明显的噪音。波形重构时,频率是通过对输入信号进行正弦波拟合来获得的。这一步对原信号的噪音还是十分敏感的。如果在以上代码给原信号加上高于千分之一的噪音,整个代码的结果就完全不及格了。这就要由于是后面决定谐波所处的frequency bin那步对信号频率的准确性十分敏感。

有了信号的频率,就可以进行相干取样、FFT……一切都按正常进行。

以上代码本身会给出一个结果比较。我用以上方法对一个真实的LAOS信号进行重构,得到的结果如下(黑的是实验结果,红的是重构曲线):

实际信号示范

实际信号示范