参考链接:简要理解DFT_我叫夏满满的博客-CSDN博客_dft原理

FFT(快速傅里叶变换)其本质就是DFT,只不过可以快速的计算出DFT结果。要理解FFT,必须先理解DFT(DiscreteFourier Transform) 。下面详细讨论DFT,因为DFT懂了之后,FFT就容易的多了。

DFT(FFT)作用:可以将信号从时域变换到频域,而且时域和频域都是离散的,通俗的说,可以求出一个信号由哪些正弦波叠加而成,求出的结果就是这些正弦波的幅度和相位

首先我们要理解为什么一个周期非正弦信号可以拆分出某些频率的正弦波,从下图中可以直观的帮助我们理解。

图片取自于: 傅里叶级数 三角形式 到 复数形式_井底之蛙-hzq的博客-CSDN博客_傅里叶级数的复数形式求法

Q:为什么可以求出正弦波的幅度

这里就要说一下信号的相关性了,我们可以利用信号的相关性检测信号波中是否含有某个频率的信号波:把一个待检测信号波乘以另一个信号波,得到一个新的信号波,再把这个新的信号波所有的点进行累加,从相加的结果就可以判断出这两个信号的相似程度,比如下图:

上图中a,b是待检测信号,c,d是3个周期的正弦信号。很显然a图中含有正弦波:

然后将e图的各点相加,很显然值是正的,这就说明a图中含有与b图同频率的正弦波。

下面我们来看第二个例子:

显然将f图中各点相加结果约等于0了,这说明b图中不含有与b图同频率的正弦波。

这就是DFT的原理,其实就是这么简单,只不过DFT将待检测信号和很多不同频率的正弦波和余弦波相乘,也就是进行了信号相关性检测,从而可以计算出信号中含有的正弦波的幅度,若含有此频率的正弦波,那么幅值不为0,若不含有此正弦波,那么幅值为0。

下面来看一个具体的例子来理解:

图一即为待检测信号,也就是将进行DFT变换的信号,将它分成16个离散的点。图2是一个频率为1的正弦波,也分成16个点。将对应的点相乘,得到图3,再将图3的各个点的幅值相加,结果为10.06。也就是说图1中的图像含有图2的正弦波,此时用到的DFT点数就为16。那么幅度计算公式如下:

即含有的频率为1的正弦波的幅度就是1.25。以此类推,若要求是否含有频率为2的正弦波,将图1和频率为2的正弦波相乘再求和。

Q:为什么要除以呢?

图片来源于: 关于FFT频谱幅度要乘2/N的理解 - 哔哩哔哩

下面我们再开始理解DFT:

DFT的计算公式如下:

其中X(k)表示DFT变换后的数据;x(n)为采样后的模拟信号;N为做DFT的点数;n为序列的长度;公式中的x(n)可以为复信号,实际当中x(n)都是实信号,即虚部为0。此时上式根据欧拉公式可以展开为:

从这个公式可以看出,变换后的数据就是原信号对cos和sin的相关操作,即进行相乘求和(同上述计算信号相关度)。

附:欧拉公式

Q:为什么要将n\N写在2kpi后面呢?

因为在对cos和sin进行相关操作时,k代表和频率为多少的正弦相关。而n和N则是在一个正弦周期内采样N个点,采样间隔为2pi\N,n用来步进,一次步进2pi\N,最后进行累加求和,就得出了X(k)。另外,DFT之后的数据是对称的,比如做8点DFT,采样信号为x(n),DFT之后的数据为X(k),那么X(0)为直流信号,X(1), X(2), X(3), X(5), X(6), X(7),关于X(4)对称,即X(1)=X(7), X(2)=X(6),X(3)=X(5)。

下面我们在代码中实现一次简单的DFT:

from numpy import arange, sin, pi, cos
import matplotlib.pyplot as plt
import cmath
from scipy.fftpack import fft,ifftKl = arange(0, 256, 1)
Xk = []         # 创建保存DFT结果的数组
f0 = 1         # 原始信号频率
fs = 16         # 采样频率
N = len(Kl)     # 原始信号点数
y = [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0]    # x[n]
for k in Kl:  # 求 X[k] k = 1....Ntemp = 0for l in range(0, N):  # 求X[k]cm = 1jcm *= -2*pi*l*k/Ntemp += y[l]*cmath.exp(cm)temp = tempXk.append(abs(temp))yy = fft(y)
yf = abs(yy)      # 用python自带的FFT验证
plt.plot(Kl, Xk, label="DFT")
plt.plot(Kl, yf, label="python FFT")
plt.plot(Kl, y, label="square wave")
plt.legend(loc="lower right")
plt.show()

Discrete Fourier Transform(DCT)的理解相关推荐

  1. Discrete Fourier Transform离散傅里叶变换算法

    DFT 公式: Ak=∑n=0N−1e−i2πNknan,k∈{0,1,...N−1}A_k = \sum_{n=0}^{N-1}e^{-i\frac{2\pi}{N}kn}a_n , k\in \{ ...

  2. 基于CUDA的离散傅里叶变换(Discrete Fourier Transform,DFT)

    最近在做地震勘探的全波形反演,用分频反演的方法,需要对地震波场按照特定的频段进行傅里叶变换,这要用到DFT.在CPU上,DFT的计算非常耗时,当处理三维数据时耗时更加严重,所以,本人用CUDA+SU( ...

  3. 傅立叶变换(Fourier Transform)分析理解

    引言 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人很难能够从感性上得到理解,最近,我偶尔从 ...

  4. FFT(Fast Fourier Transform,快速傅里叶)

    FFT(Fast Fourier Transform,快速傅里叶) DFT(Discrete Fourier Transform,离散傅里叶变换)是傅里叶变换在时域和频域上都呈离散的形式,而FFT,则 ...

  5. 数字图像处理实验(5):PROJECT 04-01 [Multiple Uses],Two-Dimensional Fast Fourier Transform

    实验要求: Objective: To further understand the well-known algorithm Fast Fourier Transform (FFT) and ver ...

  6. java dct变换_Discrete Cosine Transform [DCT] (离散余弦变换)

    Discrete Cosine Transform [DCT] (离散余弦变换) 描述:Binarizer是一个Transformer. 离散余弦变换是与傅里叶变换相关的一种变换,它类似于离散傅立叶变 ...

  7. 使用 scipy.fft 进行Fourier Transform:Python 信号处理

    摘要:Fourier transform 是一个强大的概念,用于各种领域,从纯数学到音频工程甚至金融. 本文分享自华为云社区<使用 scipy.fft 进行Fourier Transform:P ...

  8. Xilinx IP解析之 Fast Fourier Transform(FFT) v9.1

    Xilinx IP解析之 Fast Fourier Transform(FFT) v9.1 前言--两个FFT IP核的区分 在Vivado的IP中搜索FFT,会显示出FFT和LTE FFT,如下图所 ...

  9. 【小波变换】离散小波分解Discrete Wavelet Transform

    此篇博客记录自学离散小波分解的相关内容,以后若有更多理解在此篇更新. 一. 为什么需要离散小波分解    除离散变换外,还有连续小波分解,通过改变分析窗口大小,在时域上移动窗口和基信号相乘,最后在全时 ...

最新文章

  1. 3人小公司1年的创业成本
  2. Android 一个apk多个ICON执行入口
  3. java 文件解析异常_java中异常的解析
  4. hive 导入hdfs数据_将数据加载或导入运行在基于HDFS的数据湖之上的Hive表中的另一种方法。
  5. 开源日志库log4cplus+VS2008使用整理
  6. 初中计算机老师面试自我介绍,信息技术老师自我介绍
  7. 15.A Syntactic Neural Model for General-Purpose Code Generation
  8. 复旦大学计算机研究生初试分数线,复旦大学计算机研究生复试分数线
  9. 人类能够制造出宏观的亚原子材料、粒子材料吗?
  10. 使用计算机视觉和深度学习创建现代 OCR 管道
  11. 如何使用Microsoft PowerPoint制作海报
  12. msysgit - Windows Git安装配置
  13. 计算机网络学习1:计算机网络概论
  14. JVM参数无效(-XX:+HeapDumpOnOutOfMemoryError设置无效)
  15. OpenCV第五章练习p163_5~8
  16. 准确率、精确率、召回率、F1-measure简单总结
  17. (一)买基金的基础知识
  18. 吴恩达加入医疗机器人公司Woebot,AlphaGo Zero问世,高性能完胜旧版 | 大数据24小时
  19. vimperator
  20. Linux实现myshell

热门文章

  1. 比MySQL快801倍,OLAP两大神器ClickHouse和Doris到底怎么选?
  2. 汇编语言 实现1.将数据区buf1中的10个数,传送到数据区buf2 2.计算buf1数据的累加和
  3. java并发锁有哪些,Java并发编程-公平锁与非公平锁
  4. java 地铁线路_地铁线路管理系统
  5. 计算机二级C语言选择题综合考查
  6. GPU类型数据与CPU类型数据转换
  7. java星际小战_星际飞战下载-星际飞战小游戏最新版下载v1.0.4-游迅网
  8. 从《隆中对》中,挖掘对数据分析的一些启示
  9. 国民智能音箱品牌发展史:从春晚到跨年的全民普及
  10. 批判马斯洛需求层次模型