基于matlab的fft算法程序设计

  • 格式:doc
  • 大小:123.08 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

※※※※※※※※※

※※

※※

※※※※※※※※※

课题名称基于matlab的FFT算法程序设计

姓名

学号

学院

专业

指导教师

基于matlab 的FFT 算法程序设计

1 设计目的

(1)掌握FFT 算法程序的matlab 的实现。

(2)了解matlab 中对信号做频谱分析时如何设置参数。 (3)了解FFT 算法的原理。 (4)熟悉信号的各种频谱分析图。

2 设计思路

利用matlab 编程实现

(1) 利用原理分析出该信号的取样频率以及取样点数大概为多少才合适。 (2) 对未进行加噪声的信号进行幅频分析,然后恢复信号。 (3) 将原始信号加进噪声并进行幅频分析,然后恢复信号。 (4) 比对加噪声前后信号的幅频图,看有何区别再进行总结。

3 设计过程

3.1 设计原理

(1) FFT 变换原理

N 点序列的DFT 和IDFT 变换定义式如下:

1

[][]N kn N

k x k x n W

-==∑

(1) 1

10

1

[][]N kn N

k x n X k W

N

--==

(2)

利用旋转因子

2N j nk

kn N

W

e

π-=

(3)

具有周期性,可以得到快速算法(FFT )。

在MATLAB 中,可以用函数

(,)X fft x N =

(4)

(,)x ifft X N =

(5)

计算N 点序列的DFT 正、反变换。

(2) FFT 中选择频率以及采样点的标准

一个模拟信号,经过ADC 采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,采样得到的数字信号,就可以做FFT (快速傅里叶变换)了。N 个采样点,经过FFT 之后,就可以得到N 个点的FFT 结果。为了方便进行FFT 运算,通常N 取2的整数次方。

假设采样频率为F s ,信号频率F ,采样点数为N 。那么FFT 之后结果就是一个为N 点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A ,那么FFT 的结果的每个点(除了第一个点直流分量之外)的模值就是A 的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N 倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz ),而最后一个点N 的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率F s ,这中间被N-1个点平均分成N 等份,每个点的频率依次增加。例如某点n 所表示的频率为:

n F (1)/s n F N =-*

(6)

由公式(2-6)可以看出,F n 所能分辨到频率为为F s /N ,如果采样频率F s 为1024Hz ,采样点数为1024点,则可以分辨到1Hz 。1024Hz 的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT ,则结果可以分析到1Hz ,如果采样2秒时间的信号并做FFT ,则结果可以分析到0.5Hz 。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。

假设FFT 之后某点n 用复数a+b*i 表示,那么这个复数的模就是A n =根号a*a+b*b ,相位就是:

tan 2(,)P a b a =

(7)

根据以上的结果,就可以计算出n 点(n≠1,且n<=N/2)对应的信号的表达式为:

/(/2)cos(2)2/cos(2)n n n n n n A N pi F t P A N pi F t P ****+*****+

(8)

对于n=1点的信号,是直流分量,幅度即为A 1/N 。

由于FFT 结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。

(3)设计程序利用分析出的取样频率以及频率取样点来画出该信号在加噪声与不加噪声的情况下的幅频图,并进行比对。

3.2 设计流程图

图1 程序总流程图

4 仿真实现过程

4.1源程序代码 fs=100;%设定采样频率 N=128; n=0:N-1;

t=n/fs;

f0=10;%设定正弦信号频率

%生成正弦信号

x=sin(2*pi*f0*t);

figure(1);

subplot(121);

plot(t,x);%作正弦信号的时域波形

xlabel('t');

ylabel('y');

title('正弦信号时域波形');

grid;

%进行FFT变换并做频谱图

y=fft(x,N);%进行fft变换

mag=abs(y);%求幅值

f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换figure(2);

subplot(121);

plot(f,mag);%做频谱图

axis([0,100,0,80]);

xlabel('频率(Hz)');

ylabel('幅值');

title('正弦信号幅频谱图N=128');

grid;

%用IFFT恢复原始信号

xifft=ifft(y);

magx=real(xifft);

ti=[0:length(xifft)-1]/fs;

figure(3);

subplot(121);

plot(ti,magx);

xlabel('t');

ylabel('y');

title('通过IFFT转换的正弦信号波形');

grid;

%对信号加信噪比为16的高斯白噪声