n要取最接近数据长度的2的整数次方,命令是2^nextpow2(N),其中N是实际数据长度,因为这样的n可以使fft更快。比如,N=1021,执行n=2^nextpow2(N)后,n=2^10=1024。而你说的512也是这个道理。
f为表示频率的横轴,它的长度必须和abs(y)的长度相等,它们都是在图形上显示的长度。比如,f显示n的一半,abs(y)也要取n的一半:plot(f(1:n/2),Y(1:n/2)),其中Y=abs(y)。
注意:做fft的数据长度是整个的数据长度,plot显示的长度可以任取。
如果没看错是再求信号的功率谱,
Fs=2048;
%
设定采样点数
FFTN=1024;
%设定FFT点数
t=(0:1023)/Fs;
%
设定正弦信号的采样时间点
x=2sin(2pi256t+pi/8);
%
产生正弦信号
y=fftshift(fft(x,FFTN));
%这句没太看懂,应该是求信号的功率谱,但结果是复数,需取模,这句需楼主在核实下
yam=abs(y)2/FFTN;
%需取模,
f=((0:FFTN-1)-FFTN/2)Fs/FFTN;
%设定画图时的横坐标,Hz为单位
figure(1);plot(f,yam);xlabel('f(Hz)');ylabel('幅值');
%
以横坐标Hz,纵坐标取模结果,画图,
[amax
index]=max(yam);
%取纵坐标最大值和序号
gmax=angle(y(index));
%这句也没太看,取出模值最大值进行什么处理,
fmax=f(index);
%取出模值最大点对应的频率值
以上除了标注的,其他应该没问题,楼主在看看那两句吧,查查matlab的help
fft在MATLAB中是离散傅里叶变换的快速算法。
FFT使算法复杂度由原本DFT的O(n^2) 变为 O(nlogn)
通过它把信号从时间域变换到频率域,这个转换有助于研究信号的功率谱(频谱结构、变化规律),和使某些问题的计算更有效率。
a=10; b=10; x=0:30; y=((x-a)/b>=0)((x-a)/b<=1) subplot(2,1,1) plot(x,y) %这个是波形 N=size(y); N=N(2); yy=abs(fft(y))/N2; subplot(2,1,2) stem(yy) %这个是频谱
当你的抽样频率没有大于两倍的信号最大频率时,将会发生混频,那时的幅频特性图就不是高分辨的。很明显,你这个图已经符合要求,只是你没有加绝对值abs()函数。你可以选择用stem()函数来绘制图形。例如stem(abs(f,Y(1:257)))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)