matlab中nfft指的什么,FFT在matlab中的使⽤⽅法
FFT在matlab中的⽤法
⼀、FFT的物理意义
FFT是离散傅⽴叶变换的快速算法,可以将⼀个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采⽤FFT变换的原因。另外,FFT可以将⼀个信号的频谱提取出来,这在频谱分析⽅⾯也是经常⽤的。 虽然很多⼈都知道FFT是什么,可以⽤来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使⽤多少点来做FFT。 ⼀个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要⼤于信号频率的两倍,这些我就不在此罗嗦了。 采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了⽅便进⾏FFT运算,通常N取2的整数次⽅。
⼆、计算序列的FFT变换
求序列{2,3,3,2}的DFT变换。
>> N=4;
>> n=0:N-1;
>> xn=[2 3 3 2];
>> xk=fft(xn)
运算结果如下:
xk =
10.0000 + 0.0000i -1.0000 - 1.0000i 0.0000 + 0.0000i -1.0000 + 1.0000i
带⼊公式检验:
X[k]=∑n=0N−1X[n]WNnkX[k]=\sum_{n=0}^{N-1}X[n]W_N^{nk}X[k]=n=0∑N−1X[n]WNnk
X[0]=2W40+3W40+3W40+2W40=10X[0]=2W_4^{0}+3W_4^{0}+3W_4^{0}+2W_4^{0}=10X[0]=2W40+3W40+3W40
+2W40=10
X[1]=2W40+3W41+3W42+2W43=−1−iX[1]=2W_4^{0}+3W_4^{1}+3W_4^{2}+2W_4^{3}=-1-iX[1]=2W40+3W41+3W42 +2W43=−1−i
X[2]=2W40+3W42+3W44+2W46=0X[2]=2W_4^{0}+3W_4^{2}+3W_4^{4}+2W_4^{6}=0X[2]=2W40+3W42+3W44
+2W46=0
X[3]=2W40+3W43+3W46+2W49=−1+iX[3]=2W_4^{0}+3W_4^{3}+3W_4^{6}+2W_4^{9}=-1+iX[3]=2W40+3W43+3W46 +2W49=−1+i
公式运算结果与matlab仿真结果⼀致。
xk与xn的维数相同,共有4个元素。xk的第⼀个数对应于直流分量,即频率值为0,在傅⾥叶级数的叠加中,它仅仅影响全部波形相对于数轴整体向上或是向下⽽不改变波的形状。
三、计算三⾓信号的FFT变换
1、分析采样点N的数量对FFT结果的影响
做n个点的FFT,表⽰在时域上对原来的信号取了n个点来做频谱分析,n点FFT变换的结果仍为n个点。
信号⼀:y=0.5sin(2pi20t)+2sin(2pi40t)
可以很容易的看出信号的由频率为20和40的两个分量组成,其中最⾼频率为40,根据奈科斯特定律,
在这⾥我将抽样信号fs设定为100HZ,采样点N分别设定为128和2048。
N=128
>> fs=100;
>> N=128;
>> n=0:N-1;
>> t=n/fs;
>> y=0.5*sin(2*pi*20*t)+2*sin(2*pi*40*t);
>> x=fft(y,N);
>> m=abs(x);
>> f=n*fs/N;matlab学好了有什么用
>> subplot(2,2,1),plot(f,m);
>> xlabel('频率/Hz');
>> ylabel('振幅');title('N=128');
>> grid on;
>> subplot(2,2,2),plot(f(1:N/2),m(1:N/2));
>> grid on;
N=2048
>> fs=100;
>> N=2048;
>> n=0:N-1;
>> t=n/fs;
>> y=0.5*sin(2*pi*20*t)+2*sin(2*pi*40*t);
>> x=fft(y,N);
>> m=abs(x);
>> f=n*fs/N;
>> subplot(2,2,3),plot(f,m);
>> xlabel('频率/Hz');
>> ylabel('振幅');title('N=2048');
>> grid on;
>> subplot(2,2,4),plot(f(1:N/2),m(1:N/2));
>> grid on;
分析结果:
这⾥的fs是采样频率。⽽我们通常只关⼼0-pi中的频谱,因为根据奈科斯特定律,只有f=fs/2范围内的信号才是被采样到的有效信号。那么,在w的范围内,得到的频谱肯定是关于n/2对称的。
⽤100Hz做了128个点FFT之后,因为频率分辨率是100/128(25/32)Hz,如果原来的信号在2Hz或者1Hz有分量,你在频谱上是看不见的,这就表⽰你越想频谱画得逼真,就必须取越多的点数来做FFT,n就越⼤,你在时域上就必须取更长的信号样本来做分析。但是⽆论如何,由于离散采样的原理,你不可能完全准确地画出原来连续时间信号的真实频谱,只能⽆限接近(就是n⽆限⼤的时候),这个就叫做频率泄露。在采样频率fs不变得情况下,频率泄漏可以通过取更多的点来改善,也可以通过做FFT前加窗来改善,这就是另外⼀个话题了。
第k个点的实际频率的计算为f(k)=k*(fs/n)
运⾏结果:
2、对FFT输出结果的探究
从上⼀节“分析采样点N的数量对FFT结果的影响”我们可以看出不管采样点数⽬是多少,其频率为20的分量和频率为40的分量的振幅之⽐依然是1:4。这是为什么呢?我们知道FFT之后结果就是⼀个为N点的复数。每⼀个点就对应着⼀个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?
信号⼆:y=2+0.5sin(2pi20t)+2sin(2pi40t)
我以128HZ的采样频率对其采样,采样点N=128。我们的信号有3个频率分量0HZ、20HZ、40HZ。
>> fs=128;
>> N=128;
>> n=0:N-1;
>> t=n/fs;
>> y=2+0.5*sin(2*pi*20*t)+2*sin(2*pi*40*t);
>> x=fft(y,N)
输出结果:
x =
1.0e+02 *
Columns 1 through 7
2.5600 + 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i
Columns 8 through 14
-0.0000 + 0.0000i -0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 -0.0000i
0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i -0.0000 -0.3200i
Columns 22 through 28
0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i
Columns 29 through 35
0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 -0.0000i
Columns 36 through 42
0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i -0.0000 - 1.2800i 0.0000 -0.0000i
Columns 43 through 49
0.0000 - 0.0000i 0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i
Columns 50 through 56
0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i
Columns 57 through 63
-0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 -0.0000i
Columns 64 through 70
0.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000 -0.0000i
Columns 71 through 77
0.0000 - 0.0000i -0.0000 + 0.0000i -0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i
Columns 78 through 84
0.0000 - 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0000i 0.0000 +
0.0000i
Columns 85 through 91
-0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i -0.0000 + 1.2800i 0.0000 - 0.0000i 0.0000 -0.0000i
Columns 92 through 98
-0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i -0.0000 -0.0000i
Columns 99 through 105
0.0000 - 0.0000i -0.0000 + 0.0000i 0.0000 - 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i
0.0000 - 0.0000i -0.0000 + 0.0000i 0.0000 + 0.0000i -0.0000 + 0.3200i -0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 -0.0000i
Columns 113 through 119
-0.0000 + 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i
Columns 120 through 126
-0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 -0.0000i
Columns 127 through 128
0.0000 + 0.0000i -0.0000 + 0.0000i
可以发现:
第1个点:2.5600 + 0.0000i 模值256
第2个点:-0.0000 - 0.0000i
第20个点:-0.0000 + 0.0000i
第21个点: -0.0000 - 0.3200i 模值32
第22个点:-0.0000 + 0.0000i
第40个点:0.0000 + 0.0000i
第41个点:-0.0000 - 1.2800i模值128
第42个点:0.0000 + 0.0000i
可以发现只有在第1、21、41点处才有幅值,画出其频谱图观察。
>> m=abs(x);
>> f=n*fs/N;
>> plot(f,m);
>> xlabel('频率/Hz');
>> ylabel('振幅');title('N=128');
>> grid on;
运⾏结果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论