快速傅里叶变换(Fast Fourier transform,FFT)

利用离散傅里叶变换(DTF)算法进行运算时,复数乘法运行次,复数加法运行次,计算量其实可以通过fft减小。1965年,首先由Cooley-Tukey提出了基-2FFT算法,对DFT的发展起到了极大推进作用。随后又出现了混合基算法。fft 是一种计算DTF的快速算法,利用因子的周期性、共轭对称性、可约性。

1、fft算法主要有以下3种

时域抽取基-2FFT算法(Decimation -In- Time,DIT-FFT)

频域抽取基-2FFT算法(Decimation-In-Freqency,DIF-FFT)

序列长度N可表示为合数的FFT 算法(混合基)

2、fft函数

(matlab说明文档:https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=fft&s_tid=doc_srchtitle)

Y = fft(X)
Y = fft(X,n)
Y = fft(X,n,dim)

2.1 Y = fft(X) ——用快速傅里叶变换 (FFT) 算法计算 X 的离散傅里叶变换 (DFT)。

如果 X 是向量,则 fft(X) 返回该向量的傅里叶变换。

如果 X 是矩阵,则 fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换。

如果 X 是一个多维数组,则 fft(X) 将沿大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。

2.2 Y = fft(X,n) ——返回 n 点 DFT。如果未指定任何值,则 Y 的大小与 X 相同。

如果 X 是向量且 X 的长度小于 n,则为 X 补上尾零以达到长度 n。

如果 X 是向量且 X 的长度大于 n,则对 X 进行截断以达到长度 n。

如果 X 是矩阵,则每列的处理与在向量情况下相同。

如果 X 为多维数组,则大小不等于 1 的第一个数组维度的处理与在向量情况下相同。

2.3 Y = fft(X,n,dim) ——返回沿维度 dim 的傅里叶变换。

如果 X 是矩阵,则 fft(X,n,2) 返回每行的 n 点傅里叶变换。

具体的示例都在官方文档中,这里说说fft函数的特点:

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

根据采样定理,fft能分辨的最高频率为采样频率的一半(即Nyquist频率),函数fft返回值是以Nyqusit频率为轴对称的,Y的前一半与后一半是复数共轭关系,信息其实是重复的。所以,如果进行N点的fft,实际上有用的点数为n+1点(N为奇数或者偶数的情况下有用的点数均相同)。

Fn = (n-1)* Fs /N

Fn是第n点所表示的真实频率值。当然,n只取前一半的点就足够了。这样,可以达到的频率分辨率即为Fs/N。

2.  幅值

作FFT分析时,幅值大小与输入点数有关,要得到真实的幅值大小,需要将变换后的结果除以N。且由于零频在双边谱中本没有被一分为二,所以对于零频外的点还有乘以2,得到的才是真实的频率幅值。

Y = fft(X);     % X为信号
P2 = abs(Y/L);  % 计算双侧频谱 P2
P1 = L*P2(1:L/2+1);             % 将P2的前半段信号赋给P1,P1即是我们关心的部分
P1(2:end-1) = 2*P1(2:end-1);  % 将除零频外的信号乘以2

3.  基频

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

4.  执行N点FFT

在调用格式 2.2 中,函数执行N点FFT。若y为向量且长度小于N,则函数将y补零至长度N,若向量y的长度大于N,则函数截断y使之长度为N。由于fft算法的本质,对于N的选取一般为大于序列长度点数的最小2的幂次方,这样能改善 fft 的计算性能。

N = 2^nextpow2(L);    % 将高斯脉冲转换为频域
Y = fft(X,N);

而如果未制定进行fft的点数N,默认产生的结果为N点,默认进行的fft便是基于混合基来进行计算的,性能当然不会优于基2。

3、fftshift函数

官方文档:

https://ww2.mathworks.cn/help/matlab/ref/fftshift.html

fftshift的功能是将零频分量移到频谱中心。怎么理解这句话呢?fft计算得到的频域信号的频率区间是0~Fs(Fs是采样频率)的,且关于Fs/2对称。称0~FS为数字频率,对应模拟角频。但是我们只关心区间,fftshift函数的功能就是将fft处理之后的部分搬移至,从而使零频分量居于频谱的中心位置。

Y = fftshift(X) 通过将零频分量移动到数组中心,重新排列傅里叶变换 X。

如果 X 是向量,则 fftshift 会将 X 的左右两半部分进行交换。

如果 X 是矩阵,则 fftshift 会将 X 的第一象限与第三象限交换,将第二象限与第四象限交换。

如果 X 是多维数组,则 fftshift 会沿每个维度交换 X 的半空间。

Y = fftshift(X,dim) 沿 X 的维度 dim 执行运算。例如,如果 X 是矩阵,其行表示多个一维变换,则 fftshift(X,2) 会将 X 的每一行的左右两半部分进行交换。

注意:fftshift 没有fft的功能,是在 fft 之后进行的(有需要的话)。

运行代码:

% fftshift
fs = 100;               % sampling frequency
t = 0:(1/fs):(10-1/fs); % time vector
S = cos(2*pi*15*t);
n = length(S);
X = fft(S);
f = (0:n-1)*(fs/n);     %frequency range
power = abs(X).^2/n;    %power
subplot(121);
plot(f,power)
xlabel('f');Y = fftshift(X);
fshift = (-n/2:n/2-1)*(fs/n); % zero-centered frequency range
powershift = abs(Y).^2/n;     % zero-centered power
subplot(122);
plot(fshift,powershift)
xlabel('f');

得到如下的结果:

Matlab中fft函数的使用与原理相关推荐

  1. matlab函数乘阶跃,MATLAB中FFT函数和点乘、乘、单位阶跃函数

    注意问题:1, 对于单位阶跃函数u(t-b)和Dirac函数delta(t-a),可以借用Maple函数库中的定义,他们分别是Heaviside(t-b),Dirca(t-a). 2,点乘和点除代表矩 ...

  2. Matlab中stft函数的使用与原理

    1 引入 频谱分析的方法是建立在如下假设之上: 连续时间信号是频谱上的带限信号,其采样后的离散值可以提供原信号频谱的信息. 带限信号对应的时域信号定义域往往是 .因此,往往采用抗混叠滤波后再采样的方式 ...

  3. Matlab中fft函数详解

    FFT函数 Y = fft(x) 如果x是向量,则fft(x)返回该向量的傅里叶变换 如果x是矩阵,则fft(x)将x的各列视为向量,并返回每列的傅里叶变换. 如果x是一个多维数组,则 fft(X) ...

  4. Matlab中cq是什么,Matlab中gradient函数(梯度计算原理)

    Gradient(F)函数求的是数值上的梯度,假设F为矩阵. >> x=[6,9,3,4,0;5,4,1,2,5;6,7,7,8,0;7,8,9,10,0] x = 6       9   ...

  5. matlab中频域信号IFFT,MATLAB中ifft函数用法、性质、特性-以及与fft的组合应用全面深入解析(含程序)...

    MATLAB中ifft函数用法.性质.特性,以及与fft的组合应用全面深入解析(含程序) 前言 在我之前的<MATLAB中fft函数用法.性质.特性.缺陷全面深入解析(含程序)>中,我已经 ...

  6. matlab fft(x dim),matlab的fft函数

    matlab中fft的用法及注意事项_调查/报告_表格/模板_实用文档.本文是笔者整理的如何使用matlab的fft函数及fftshift函数,希望对大家有所帮助!... C 语言.MATLAB 实现 ...

  7. matlab函数fftshift,matlab中fft算法_matlab中fftshift函数_matlab中fft函数的用法(2)

    plot([0 : PointNum/2 - 1], x1(1:PointNum/2)); grid on subplot(3,1,2); % [REX IMX] am = sqrt(abs(REX. ...

  8. Matlab中sub2ind函数原理及用法!

    Matlab中sub2ind函数原理及用法!

  9. 离散傅里叶变换DFT与FFT,MATLAB的FFT函数使用(原创)——如何使用fft()绘制出真正的频谱图像

    以前一直对MATLAB中fft()函数的使用一直存在疑惑,为什么要加一 些参数,并且如何确定这些参数,也查了许多资料,但很多都感觉只是 表面一说根本没有讲清其本质.但随着学习的推进,慢慢有所领悟,所 ...

最新文章

  1. 定义派生类拷贝构造函数
  2. Java 获取本机IP和Mac以及网卡信息
  3. 阿里开源新一代人机对话模型 ESIM:准确率打破世界纪录,提升至 94.1%!
  4. LFS,编译自己的Linux系统 - 前言
  5. C#的变迁史01 - C# 1.0篇
  6. Hive中NULL的含义
  7. 无交换机实现集群网络互联
  8. Linux下安装NFS共享文件资源
  9. css环形进度条clip,clip实现圆环进度条
  10. android高德地图获取省市编码,android中高德地图地理编码
  11. Tempo数据分析平台,助力企业高效完成数据预处理工作
  12. 山寨小小军团开发笔记 之 GamePool
  13. java 字符串转日历,在Java中将日历字符串转换为日历对象
  14. 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记2
  15. 使用RDLC文件开发报表
  16. 基于Vue使用Arco Design组件封装一个七牛云上传图片的函数
  17. GPT-4 终问世!旧王已死,新王当立!面对AI,人类真的准备好了吗?
  18. 用Windows7玩游戏?小心你的存档!
  19. 阿姨,我真不是修电脑的!
  20. 12.23网络嗅探实验记录

热门文章

  1. HDU 5155 Harry And Magic Box
  2. 《教父1》观后感——第1遍
  3. iphone编辑过的录音怎么还原_我的天呐,原来iPhone里录音不仅能导出,还能转文字?!...
  4. axios是干什么的
  5. 24个基本指标精粹讲解(18)--PSY
  6. js正则的test方法一会返回true一会返回false
  7. java获取客户端IP地址工具类
  8. 只需五步!哈佛学霸教你用Python分析相亲网站数据,在两万异性中找到真爱
  9. XSL3399我开通博客了谢多交流
  10. 安东尼罗宾--激发你的无限潜能[连载]--1 2章