必威体育Betway必威体育官网
当前位置:首页 > IT技术

MATLAB快速傅里叶变换(fft)函数详解

时间:2019-07-01 00:45:38来源:IT技术作者:seo实验室小编阅读:83次「手机版」
 

fft

原文

定义:

Matlab帮助文件原文 

The 'i' in the 'Nth root of unity' 是虚数单位

​调用:

​​1.  Y = fft(y);

2.  Y = fft(y,N);

式中,y是序列,Y是序列的快速傅里叶变换。y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。

说明:

1.  函数fft返回值的数据结构具有对称性

根据采样定理,fft能分辨的最高频率为采样频率的一半(即Nyquist频率),函数fft返回值是以Nyqusit频率为轴对称的,Y的前一半与后一半是复数共轭关系。

2.  幅值

作FFT分析时,幅值大小与输入点数有关,要得到真实的幅值大小,只要将变换后的结果乘以2除以N即可(但此时零频—直流分量—的幅值为实际值的2倍)。对此的解释是:Y除以N得到双边谱,再乘以2得到单边谱(零频在双边谱中本没有被一分为二,而转化为单边谱过程中所有幅值均乘以2,所以零频被放大了)。

3.  基频

​若分析数据时长为T,则分析结果的基频就是f0=1/T,分析结果的频率序列为[0:N-1]*f0

4.  执行N点FFT

在调用格式2中,函数执行N点FFT。若y为向量且长度小于N,则函数将y补零至长度N,若向量y的长度大于N,则函数截断y使之长度为N。

注意:

使用N点FFT时,若N大于向量y的长度,将给频谱分析结果带来变化,应该特别注意。

例子:

将对N点FFT进行举例,说明当N大于向量y的长度时给频谱分析带来的变化。

例图

上图中,左列为信号时域图形,右列为对应信号的频谱图。可以看出当N大于向量y的长度时,由于fft自动将100s后的信号值补零,原信号实际变为左下角的时域图形,所以频率发生了变化(增加多种频率的小振幅振动,主峰幅值被削弱)。

结论:

使用N点FFT时,不应使N大于y向量的长度,否则将导致频谱失真。

例子程序:​

clear all   %清除内存所有变量

close all    %关闭所有打开的图形窗口

%% 执行FFT点数与原信号长度相等(100点)

% 构建原信号

N=100;  % 信号长度(变量@@@@@@@)

Fs=1;  % 采样频率

dt=1/Fs;  % 采样间隔

t=[0:N-1]*dt;  % 时间序列

xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]);  

xn=[xn,zeros(1,N-100)];  % 原始信号的值序列

subplot(3,2,1)  % 变量@@@@@@@

plot(t,xn)  % 绘出原始信号

xlabel('时间/s'),title('原始信号(向量长度为100)')  % 变量@@@@@@@

% FFT分析

NN=N;  % 执行100点FFT

XN=fft(xn,NN)/NN;  % 共轭复数,具有对称性

f0=1/(dt*NN);  % 基频

f=[0:ceil((NN-1)/2)]*f0;  % 频率序列

A=abs(XN);  % 幅值序列

subplot(3,2,2),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz')  % 绘制频谱(变量@@@@@@@)

axis([0 0.5 0 1.2])  % 调整坐标范围

title('执行点数等于信号长度(单边谱100执行点)');  % 变量@@@@@@@

%% 执行FFT点数大于原信号长度

% 构建原信号

N=100;  % 信号长度(变量@@@@@@@)

Fs=1;  % 采样频率

dt=1/Fs;  % 采样间隔

t=[0:N-1]*dt;  % 时间序列

xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]);  

xn=[xn,zeros(1,N-100)];  % 原始信号的值序列

subplot(3,2,3)  % 变量@@@@@@@

plot(t,xn)  % 绘出原始信号

xlabel('时间/s'),title('原始信号(向量长度为100)')  % 变量@@@@@@@

% FFT分析

NN=120;  % 执行120点FFT(变量@@@@@@@)

XN=fft(xn,NN)/NN;  % 共轭复数,具有对称性

f0=1/(dt*NN);  % 基频

f=[0:ceil((NN-1)/2)]*f0;  % 频率序列

A=abs(XN);  % 幅值序列

subplot(3,2,4),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz')  % 绘制频谱(变量@@@@@@@)

axis([0 0.5 0 1.2])  % 调整坐标范围

title('执行点数大于信号长度(单边谱120执行点)');  % 变量@@@@@@@

%% 执行FFT点数与原信号长度相等(120点)

% 构建原信号

N=120;  % 信号长度(变量@@@@@@@)

Fs=1;  % 采样频率

dt=1/Fs;  % 采样间隔

t=[0:N-1]*dt;  % 时间序列

xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]);  

xn=[xn,zeros(1,N-100)];  % 原始信号的值序列

subplot(3,2,5)  % 变量@@@@@@@

plot(t,xn)  % 绘出原始信号

xlabel('时间/s'),title('原始信号(向量长度为120)')  % 变量@@@@@@@

% FFT分析

NN=120;  % 执行120点FFT(变量@@@@@@@)

XN=fft(xn,NN)/NN;  % 共轭复数,具有对称性

f0=1/(dt*NN);  % 基频

f=[0:ceil((NN-1)/2)]*f0;  % 频率序列

A=abs(XN);  % 幅值序列

subplot(3,2,6),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz')  % 绘制频谱(变量@@@@@@@)

axis([0 0.5 0 1.2])  % 调整坐标范围

title('执行点数等于信号长度(单边谱120执行点)');  % 变量@@@@@@@

相关阅读

FFT算法的优化——提高FFT算法一倍的时空效率

前言 由于本人学习FFT时第一份代码并不是从普通的FFT学起的,而是直接从一个经过优化的版本开始学。这是一个利用到共轭复数性质的

FFT算法原理

非周期性连续时间信号x(t)的傅里叶变换可以表示为式中计算出来的是信号x(t)的连续频谱。但是,在实际的控制系统中能够得到的是连续

快速傅里叶变换及java实现

傅里叶变换:傅里叶变换是一种线性的积分变换。它的理论依据是:任何连续周期信号都可以由一组适当的正弦曲线组合而成,即使用简单的正

FFT详解

最新更新 2018.6.29 新增了“关于DFT的再次思考” 和 “有关FFT算法实现机理的再讨论”两个小节,希望能对没学明白的同学有所帮助

[笔记]FFT算法

前言 对于学通信的人来说,在学到数字信号处理时都会学到一个东东,叫做快速傅里叶变换(Fast Fourier Transform,简称FFT)。这东西真

分享到:

栏目导航

推荐阅读

热门阅读