
本帖最后由 baiyongbin2009 于 2015-4-11 10:58 编辑 特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接 第27章 FFT的Matlab实现 本章主要讲解fft,ifft和fftshift在matlab上的实现。 27.1 FFT函数 27.2 IFFT函数 27.3 FFTSHIFT函数 27.4 总结 27.1 FFT函数: h y1 G. B7 i3 \: t 27.1.1 语法 Y = fft(x) Y = fft(X,n) Y = fft(X,[],dim) Y = fft(X,n,dim) 27.1.2 定义 Y = fft(x) 和 y = ifft(X)分别用于实现正变换和逆变换,公式描述如下: ![]() 27.1.3 描述 Y = fft(x) 此函数用于返回向量x的离散傅立叶变换(DFT),计算时使用快速傅里叶算法(fast Fourier transform (FFT))。 如果输入X是一个矩阵,Y = fft(X)返回该矩阵的每列的傅里叶变换。 如果输入X是一个多维数组,实现第一个尺寸不为1的维度的FFT变化,注意这里第一个尺寸不为1是指一个矩阵的第一个尺寸不为1的维。 比如一个矩阵是2*1,那么第一个尺寸不为1的维就是行(尺寸为2) X是 1*2*3表示第一个尺寸不为1的维就是列(尺寸为2) X为维数5*6*2的话,第一个尺寸不为1的维就是行(尺寸为5)) Y = fft(X,n) 此函数用于返回n点的DFT。fft(n)和fft(X,n)是等同的,其中n是向量X中第一个尺寸不为1的维度。如果X的长度小于n,则X的长度通过填充零达到长度为n。如果X的长度大于n,序列X被截断。当X是一个矩阵,各列的长度都以相同的方式进行调整。 Y = fft(X,[],dim) Y = fft(X,n,dim) 上面两个函数用于实现指定维度的FFT运算。 27.1.4 FFT实例一:幅频响应 傅里叶变换的一个常见用途就是查找埋藏在噪声信号中的实际信号的频率成分。下面我们考虑一个这样的例子: 采样率是1000Hz ,信号由如下三个波形组成。 (1)50Hz的正弦波、振幅0,7。 (2)70Hz正弦波、振幅1。 (3)均值为0的随机噪声。 实际运行代码如下: Fs = 1000; %采样率 T = 1/Fs; %采样时间单位 L = 1000; %信号长度 t = (0 ' f+ w7 Q* v6 O2 K9 R8 Y![]() x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); %原始信号 y = x + 2*randn(size(t)); %原始信号叠加了噪声后 plot(Fs*t(1:50),y(1:50)); %绘制波形 title('原始信号+零均值随机噪声 '); xlabel('时间单位:ms'); 运行Matlab后,显示波形如下: ![]() 通过上面的截图,我们是很难发现波形中的频率成分,下面我们通过FFT变换,从频域观察就很方便了,Matlab运行代码如下: Fs = 1000; %采样率 T = 1/Fs; %采样时间单位 L = 1000; %信号长度 t = (0 6 V! j8 ^* w \& h. E1 J![]() x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); %原始信号 y = x + 2*randn(size(t)); %原始信号叠加了噪声后 & y" f3 y& c/ i% C- W& N2 ~1 o1 g! [3 uNFFT = 2^nextpow2(L); %求得最接近采样点的2^n,由于上面是1000点,那么最近的就是1024点。 Y=fft(y,NFFT)/L; % 进行FFT变换,除以总的采样点数,方便观察实际值。 f = Fs/2*linspace(0,1,NFFT/2+1); %频率轴,这里只显示Fs/2部分,另一半是对称的。 9 @% n/ {6 p# j0 L8 I, [plot(f,2*abs(Y(1:NFFT/2+1))) %绘制波形 title('幅频相应'); xlabel('频率'); ylabel('幅度'); ![]() 从上面的幅频相应,我们可以看出,两个正弦波的频谱并不是准确的0.5和1,而是比较接近,这个就是咱们在上节教程中所示的频谱泄露以及噪声的干扰。 27.1.5 FFT实例二:相频响应 这里我们以采样率=256Hz采样信号1.5*sin(2*pi*50*t+pi/3),并求出其幅频和相频响应,Matlab上面运行的代码如下: Fs = 256; % 采样率 N = 256; % 采样点数 n = 0:N-1; % 采样序列 t = 0:1/Fs:1-1/Fs; % 时间序列 f = n * Fs / N; %真实的频率 x = 1.5*sin(2*pi*50*t+pi/3) ; %原始信号 y = fft(x, N); %对原始信号做FFT变换 Mag = abs(y); %求FFT转换结果的模值 subplot(2,1,1); plot(f, Mag); %绘制幅频相应曲线 title('幅频相应'); xlabel('频率/Hz'); ylabel('幅度'); ' i. O. Z8 ]+ a ~6 _subplot(2,1,2); plot(f, angle(y)*180/pi); %绘制相频响应曲线,注意这将弧度转换成了角度 title('相频响应'); xlabel('频率/Hz'); ylabel('幅度'); 运行后求出的幅频相应和相频响应结果如下: ![]() |
27.2.1 语法
27.2.2 描述
27.2.3 IFFT实例