傅立叶变换之后的数据都是一个个的复数,复数有长度和相位的信息。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);


雷达卡




良苦用心 ,
感谢楼主,
感谢分享
京公网安备 11010802022788号







