频谱间隔是分数,进行FFT变换的时候如何归一化,基本知道为什么2,4处出现谱线但是编出来的程序下图那样

频谱间隔是分数,进行FFT变换的时候如何归一化,基本知道为什么2,4处出现谱线但是编出来的程序下图那样,第1张

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函数,程序看不懂,有高手能解释一下吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9526159.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存