貌似这是个书呆子编滴程序,以为乘法有交换律就随意改变位置,完全不管物理意义好不好理解,其实不就是采样定理要除2嘛!fft后最高频率是采样频率滴一半,计算频率数组时是以此原理再按几分之几均分其它部分,其实最易理解滴是(0:length(Yc)-1) /length(Yc)(Fs/2)这种表达,只不过原式与这式数学上计算结果相同。还有乘除法不用点运算,小心编译出错,真是相当糟糕的代码!
如果没看错是再求信号的功率谱,
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
Y(1:halfLength+1)中1:halfLength+1是索引,而索引必须是正整数,所以,不能从0开始,要都加1,但是指却是从0值开始到最后一个值。
至于f的算法是不一样的,在f
=((0:halfLength)+1)Fs1/n这里,0:halfLength)+1是数值,不是索引,结果是一个矢量。
直接用X1=fft(x1,2048);也是可以的。但是,这两种语句,处理的结果是不同的。
现程序会在-2pi,0,2pi三处附近出现信号波形,而X1=fft(x1,2048);语句只在-2pi,2pi两处出现波形,你可试试。
另外,把plot(w,abs(X1));改为plot(w,X1);更清楚。
fft是内建函数,不是matlab写的,看不到源代码的
下面是我写的一个fft,可以用
function xn=myfft(x)
N=length(x);
M=log2(N);
xtmp=zeros(1,N);
value=zeros(1,M);
for i=0:N-1
repr=i;
for t=1:1:M
repr=bitshift(i,1-t);
value(t)=bitand(repr,1);
end
pos=0;
for k=1:1:M
pos=pos+value(k)2^(M-k);
end
xtmp(pos+1)=x(i+1);
end
for i=1:M
deepth=2^(i-1);
width=2^(M-i);
for t=1:2^i:N
for k=1:deepth
tmp=xtmp(t+k-1);
wn=width(k-1);
xtmp(t+k-1)=tmp+exp(-j2piwn/N)xtmp(t+k+deepth-1);
xtmp(t+k+deepth-1)=tmp-exp(-j2piwn/N)xtmp(t+k+deepth-1);
end
end
end
xn=xtmp;
望采纳!
以上就是关于matlab中fft的使用问题全部的内容,包括:matlab中fft的使用问题、MATLAB中的FFT应用、matlab做快速傅里叶变换,用FFT函数,程序看不懂,有高手能解释一下吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)