傅立叶变换的内容我也是刚学,如果有不到之处,请大家批评指正。上次书中关于傅立叶变换的内容还剩一点,现在补充完毕。
傅立叶变换之后的数据都是一个个的复数,复数有长度和相位的信息。matlab中的abs和angle这两个方程可以计算复数的长度和相位。
例子:
>>t=0:1/100:10-1/100; %创建一个时间的向量
>>x=sin(2*pi*15*t)+sin(2*pi*40*t); %跟随时间变化的一个序列
>>y=fft(x); %傅立叶变换
>>m=abs(y); %变换之后数据中的每个复数的长度
>>p=unwrap(angle(y)); %先用angle方程获得每个复数的相位信息,然后unwrap这个方程来平滑相邻的两 %相位之间,matlab对于相邻的两个相位之间的跳跃有个上届,pi,也就是相邻的
%两个相位之间的差值不能超过pi,这也很好理解,相邻的两个复数之间的夹角总
%有一个小于pi。通过加或减2pi的倍数,总能找到这个小于pi的夹角。unwrap就是
%这样一个过程。
>>f=(0:length(y)-1)'*100/length(y); %频率向量
>>subplot(2,1,1), plot(f,m), %将傅立叶变换后的数据的长度和相位对频率画图。
>>ylabel('Abs. Magnitude'), grid on
>>subplot(2,1,2), plot(f,p*180/pi)
>>ylabel('Phase [Degrees]'), grid on
>>xlabel('Frequency [Hertz]')
50Hz是Nyquist频数。可以发现复数长度对频率的画图在50Hz处是完全对称的,也就是说信号中有用的信息包含在0-50Hz之间。
方程fft的运算速度取决于傅立叶变换的长度,也就是有多少数据点要用来进行傅立叶变换。这一点在下面的命令中更加的清楚:
y=fft(x,n) %这个方程之前介绍过了。
当n等于2的m次幂时,fft的运行速度最快。其中m为正整数。所以在有的傅立叶变换中,通常把要变换的数据的长度变为2的m次幂。这需要用到下面这个命令:nextpow2(L)
假设L是原始数据的长度,nextpow2(L)给出的是在所有大于等于L的2的m次幂中,最小的那个m。得出这个数之后,再将数据的长度定义为:
>>NFFT=2^nextpow2(L);