FFT的定义

FFT:快速傅里叶变换,是DFT的快速算法。

DFT(Discrete Fourier Transform):离散傅里叶变换。在DTFT之后,将傅里叶变换的结果也进行离散化,就是DFT。

DTFT(Discrete-time Fourier Transform):离散时间傅里叶变换。这里的“离散时间”指的是时域上式离散的,也就是计算机进行了采样。不过傅里叶变换后的结果依然是连续的。

也就是说:DTFT时域离散、频域连续;DFT时域离散、频域离散。

FFT和DFT中的N

DFT数学计算公式:
X(k)=∑n=0N−1x(n)e−j2πknNx(n)=1N∑n=0N−1X(k)ej2πknN\begin{array}{l} X(k) = \sum\limits_{n = 0}^{N - 1} {x(n){e^{ - j\frac{{2\pi kn}}{N}}}} \\ x(n) = \frac{1}{N}\sum\limits_{n = 0}^{N - 1} {X(k){e^{j\frac{{2\pi kn}}{N}}}} \end{array} X(k)=n=0∑N−1​x(n)e−jN2πkn​x(n)=N1​n=0∑N−1​X(k)ejN2πkn​​
根据公式在matlab上自定义dft.m

function[Xk]=dft(xn,N);
n=[0:1:N-1];
k=[0:1:N-1];
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=xn*WNnk;
end

然后设置

xn=[ ];
y1=fft(xn,N)
y2=dft(xn,N)

这个比较简单,结论为MATLAB中对N点序列做fft的结果与N点dft的结果是完全一样的,没有对N点序列进行补0后再做操作。

2.FFT中的n
Y = fft(X,n) 返回 n 点 DFT。如果未指定任何值,则 Y 的大小与 X 相同。
如果 X 是向量且 X 的长度小于 n,则为 X 补上尾零以达到长度 n。
如果 X 是向量且 X 的长度大于 n,则对 X 进行截断以达到长度 n。

3.DFT中的N
例:对R4(n)作不同N点数的DFT,分别为4点,8点,16点。

用fft( )函数之间计算也可,DFT和FFT两者计算后的结果是完全相同的。

xn=[1 1 1 1];
Y1 = fft(xn,4)
Y2 = fft(xn,8)

j

注:
作出它们的频谱图X(f)会发现,由于采样率默认相同,故它们的fs相同,不同的N带来的是频率间隔的不同。故其实它们的连续谱形状应该相同,但是分辨率不同导致了它们的差异。

FFT基础代码

一 须知:
1.我们通常只研究信号FFT变换后形成的离散周期信号的一个周期,周期大小为采样频率Fs,且信号关于Fs/2对称。在FFT后的横坐标中最大不会超过Fs。
2.

T=1/Fs;
df=Fs/N;
t=(0:N-1)*T;

df为频率分辨率,相同的采样点数N下,fs越低则频谱分辨率越高,但会带来高频混叠的影响。x(n)有N个点,X(k)对应的也有N个点,在频域中第n个点对应的频率为(n-1)*df。
3.由于对称性,我们通常研究单侧频谱。当采样点数为N(通常为2的次幂法)时,单侧频谱序列个数如下:
当N为奇数时为(N+1)/2,
当N为偶数时为 (N/2)+1。
4.信号FFT变换后,当k=0,即第一个点,也是频率为0的这个点代表着信号的直流分量。有的信号需要去除直流分量,有一种方法:将其傅里叶变化后的第一个点的幅值设为0。
5.在双侧频谱转换成单侧频谱时,根据权系数的统一性,相应频谱(k≠0)单边谱的幅度谱幅值大小,是双边谱中的两倍。

二 常用FFT代码

Fs=1000; %采样频率
L=1500;  %采样点数
T=1/Fs; %时间间隔
df=Fs/L;  %频率分辨率
t=(0:L-1)*T; % 时间序列
X = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t));
plot(1000*t(1:50),X(1:50)) %*1000是时间的单位换算
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')
Y = fft(X); %Y的结果是L个复数
P2 = abs(Y/L);% 也有写成abs(Y)/L,数学上是等价的,P2为双侧频谱的幅值
P1 = P2(1:L/2+1);%因为是偶数,所以单侧频谱包含点的个数为(L/2)+1
P1(2:end-1) = 2*P1(2:end-1);%除去k=0、k=L/2两点,其余点的幅值*2,P1的幅值就是对应频率真实的幅值。
f = (0:(L/2))*(Fs/L);
figure
plot(f,P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

稍作解释:
1.上一篇讲到,傅里叶的目的是将一个复杂信号分解成几个正弦信号之和,并在频域图上对分解后的正弦信号的两个指标(频率和幅度)进行展现。所以以上述信号为例,当你看到这个信号X = 0.7sin(2pi50t) + sin(2pi120t));你就应该知道它FFT变换后的图像,如图1。图2为未对FFT后纵坐标处理时的照片,可以看出5252/L=525*2/1500=0.7,正好差了2/L倍。

FFT的横纵坐标

1.先说纵坐标为什么*2/L,这个网上的说法太多了,我找了我认为两个靠谱的说法放在了后面参考文章中。值得注意的是并不是所有的点FFT后都需要乘,以L等于偶数同时离散时间序列为实数为例,第一个和第(L/2)+1个,也就是k=0、k=L/2时,需要×1/L。以L=8为例。如图L为偶数,所以单侧频谱的个数为(L/2)+1=5,第一个和第五个×1/L,其余×2/L,(途中P1已经是×1/L的结果了)。
2.关于横坐标的理解见下图。

参考或引用文章
数字信号处理——DFT的一些理解
五种傅里叶变换的分析(FT、FS、DTFT、DFT、DFS)(基于MATLAB)
MATLAB中FFT的使用方法
MathWorks对FFT函数用法的帮助
快速傅里叶变换(FFT) 原理 介绍
matlab-FFT乘2除以N,或者除以N/2的到真实幅度
Matlab中fft后的频谱幅度为什么要乘以2/N?
离散正(余)弦信号的时域与FFT变换后所得频域之间的关系(幅值和相角)

DFT的计算、FFT的基础代码、FFT的横纵坐标问题(matlab)相关推荐

  1. 用matlab求解信号的DFT,利用MATLAB实现信号DFT的计算

    07级电信(2)班 刘坤洋 24 实验一 利用MATLAB 实现信号DFT 的计算 一.实验目的: 1.熟悉利用MATLAB 计算信号DFT 的方法 2.掌握利用MATLAB 实现由DFT 计算线性卷 ...

  2. 信号基础知识--FFT DFT

    clc;close all;clear all; f0=10; fs=100;     %采样率 t=1/fs:1/fs:2;         %共两秒钟,共200个采样点.采样间隔T=1/100 y ...

  3. 快速傅里叶变换 (FFT)基础

    参考博文 频谱分析是一种将复杂信号分解为较简单信号的技术. 首先来很清楚几个概念: FT(Fourier Transformation): 傅里叶变换.其时域信号.频域信号都是连续的. DTFT(Di ...

  4. 数字信号处理(DTFT与DFT、DFS的详细讲解以及FFT算法)

    DTFT与DFT.DFS的详细讲解以及FFT算法 DTFT与DFT.DFS的区别在哪里呢? 离散傅里叶级数DFS 离散傅里叶变换DFT 有限长序列的线性卷积和循环卷积 利用DFT做连续信号的频谱分析 ...

  5. 如何使用计算机实现fft,快速傅立叶变换(FFT)的计算机实现..doc

    快速傅立叶变换(FFT)的计算机实现. 信号与系统课程设计 --FFT的计算机实现 快速傅里叶变换(FFT)的计算机实现 赖智鹏 华中科技大学电气与电子工程学院0809班U200811806 Emai ...

  6. matlab看fft帮助,日记 [2009年06月02日] MATLAB FFT HELP 帮助文档及我的翻译

    fft Fast Fourier Transform 的缩写, 即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇.偶.虚.实等特性,对离散傅立叶变换的算法进行改进获得的.它对傅氏变 ...

  7. 深入浅出解释FFT(四)——fft分析信号频率和相位

    很基础的问题往往很重要,做仿真时候有一个点的差错都会导致结果的错误.在网上找了前人写的东东,总结下希望对大家有帮助,让大家少走一些弯路. 1.  信号的时域采样点N和频域采样点数相同 %####### ...

  8. Matlab中fft作频谱横纵坐标

    关于这个问题,在很早之前就分享过,也通过了解实现了算法,当时看的明白,想的明白,突然要用的时候,又开始疑问,不免有些纠结,与其每次使用的时候都查,浪费时间,还不如,一次搞定. 真心没把哪门没学好的课程 ...

  9. matlab基于傅立叶变换的时域或频域算法计算多普勒频移,展示代码

    可以使用MATLAB的Fourier变换函数fft()来计算多普勒频移.示例代码:%% 计算多普勒频移% 加载信号 x = load('signal.mat');% 计算傅立叶变换 X = fft(x ...

最新文章

  1. 10进制转换为二十六进制字符串A-Z
  2. axios不发起请求_重复的ajax请求让人很受伤
  3. 学生电脑哪个牌子好_面包冷藏车哪个牌子好
  4. 网管员心声:Windows服务有“备”无患
  5. 一步搞清楚多态与类初始化的底层原理
  6. 【java】父类与子类的引用赋值关系
  7. 静态优先权和动态优先权
  8. 程序员在学习编程的时候,想记住所有代码是不可能的!为什么?
  9. 基于AJAX技术的Web会议平台
  10. 服务器集成显卡性能,Win8.1与Ubuntu 14.10:集成显卡性能PK
  11. Elasticsearch分布式机制探究
  12. Linux内核 eBPF基础:kprobe原理源码分析:源码分析
  13. asp.net 独立缓存服务器的研究
  14. FLEX自动完成组件.--AutoSuggest
  15. Spark数据分析技术学习笔记(二)——DataFrame使用
  16. HTML网易云音乐首页动画,仿网易云音乐广告页的转场动画
  17. 迅雷一些版本下载链接
  18. CTF挑战赛-合天网安实验室
  19. 安卓动态调试七种武器之离别钩 – Hooking(上)
  20. 钓鱼网站与反钓鱼技术剖析(圆桌会议)

热门文章

  1. x86 上安装 Snow Leopard 及 搭建 Xcode 全程快播
  2. 直接读取ftp服务器文件,如何在ftp服务器上只读取十二个文件?
  3. 实现一个函数判断某一年是不是润年
  4. 无根树同构_hash
  5. svr公式推导_SVR美白公式——一个元素都不能少
  6. 胜利大逃亡 (广搜)
  7. 模拟人生类游戏推荐——模拟老大爷
  8. 举头望明月,低头敲程序
  9. Linux 命令(228)—— shopt 命令(builtin)
  10. 计算机系统英语作文结尾万能句子,高考英语作文结尾的万能句子