1、对于你这道题,N不能等于8的,至少要大于8
2、你的f2没有定义
3、归一化要除以(N/2)就可以了,直流处的要特殊处理,你看一下书。
N = 16;
n=0:N-1;
fs = 1;
t=n/fs;
f1=2/N;
f2=2f1;
xn=cos(2pif1t)+05cos(2pif2t);
xk=fft(xn,N)/(N/2);
zf=abs(xk);
stem([0:N/2-1],zf(1:N/2))
因为N个样点的信号经过fft以后变成N个样点的频谱,这个频谱是关于第N/2+1样点左右对称的,所以真正有用的频谱数据只有前面一半,后面一半是镜像。mxk11是对前N/2个样点取幅度谱,其实应该是取1:N1/2+1,你这里少取了一个点。具体为什么会镜像请看数字信号处理DFT章节。
Y(1:halfLength+1)中1:halfLength+1是索引,而索引必须是正整数,所以,不能从0开始,要都加1,但是指却是从0值开始到最后一个值。
至于f的算法是不一样的,在f
=((0:halfLength)+1)Fs1/n这里,0:halfLength)+1是数值,不是索引,结果是一个矢量。
现成的FFT程序网上可以下到很多,但如何定义相似度需要考虑一下。可以考虑用相对变化率的形式(相对变化率=(数值1-数值2)/数值1 或者 相对变化率=(数值1-数值2)/数值2 )。
有一种情况跟你的需求很像:设计滤波器后说明滤波效果。这种情况,需要比较变化前后的信号进行幅频特性、相频特性曲线,以此说明滤波效果。在这一过程中就需要对两个信号分别进行FFT变换,以求得幅频曲线和相频曲线。
具体过程如下:
step1:将横坐标定义为t(matlab赋值语句t=[,,];),将纵坐标定义为y(matlab赋值语句y=[,,];),采样频率就是临近两个横坐标差值的倒数(一般横坐标都应为时间);
step2:新建一个m文件(快捷键为ctrl+N);
step3:将如下程序复制到m文件中
t=[,,];%填入横轴数据
y=[,,];%填入纵轴数据
N = size(t,2);%行向量时,列向量是为N = size(t,1);
N = 2^(nextpow2(N)-1);
Y = fft(y,N);
mag_Y = abs(Y)/N2;%各个频率点处的幅值,这个就是fft变换后的数据
f = fs/2linspace(0,1,N/2+1);%对应的频率值
plot(f,mag_Y(1:N/2+1))%显示变换后的曲线
step4:亲测实例
t = 1:0001:10;
y= 2sin(2pi100t);%频率为100Hz
%=================以下同step3中代码==============
N = size(t,2);%行向量时,列向量是为N = size(t,1);
N = 2^(nextpow2(N)-1);
Y = fft(y,N);
mag_Y = abs(Y)/N2;%各个频率点处的幅值,这个就是fft变换后的数据
f = fs/2linspace(0,1,N/2+1);%对应的频率值
plot(f,mag_Y(1:N/2+1))%显示变换后的曲线
%=================以上同step3中代码==============
结果:
由于matlab自带FFT函数有些小瑕疵,所以在100Hz处幅值虽然接近2,但还是有些偏差的,对于偏差的修正网上也有相应的方法,如果需要在留言。
fft的概念最好看书,这个细细分析一下还是能够理解的。你要是没有相关的书的话,这个网站上的也可以看看:>
一般人是不算ROM的大小,至多只是估计。因为一个完整的程序,不同的人,甚至同一个人,程序的思路方法不一样,程序大小会差比较多。而且你的程序,除了算法,还有其他的很多东东,如显示、按键、通信等等,这些可能比你的算法的程序量还要大得多。
所以建议你先用仿真(如PROTEUS仿真),选用足够大的ROM的单片机,编制完整的程序,就知道花了多少的程序空间。
两个问题:
(1)函数名fft与matlab自带的fft函数冲突,建议改名后重新存盘
(2)最好缺两end
改后的程序:
1),stem((0:7),abs(hc(1:8)));
grid;
title('8点正三角波的幅频特性');
hd(1:8)=fft(xd(1:8));
subplot(212),stem((0:7),abs(hd(1:8)));
grid;
title('8点反三角波的幅频特性');
elseif
aa==2
subplot(211),stem((0:15),xc(1:16));
title('8点正三角波补0到16点后的时间波形');
grid;
subplot(212),stem((0:15),xd(1:16));
title('8点反三角波补0到16点后的时间波形');
grid;
elseif
aa==3
hc(1:16)=fft(xc(1:16));
subplot(211),stem((0:15),abs(hc(1:16)));
title('8点正三角波补0到16点后的幅频特性');
end
end
以上就是关于频谱间隔是分数,进行FFT变换的时候如何归一化,基本知道为什么2,4处出现谱线但是编出来的程序下图那样全部的内容,包括:频谱间隔是分数,进行FFT变换的时候如何归一化,基本知道为什么2,4处出现谱线但是编出来的程序下图那样、正弦序列FFT频谱分析程序问题!!、matlab做快速傅里叶变换,用FFT函数,程序看不懂,有高手能解释一下吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)