FFT

是一种如雷贯耳的快速算法,应用范围及其广泛,就不多说了。不过 DFT 很多人并不是很清楚,只知道 DFT 比 FFT

效率低,速度慢。实际上,在很多应用场合下,DFT 反而会比 FFT 效率高很多。

首先,回顾一下复数的特性:

V = R + jI = M*(R/M + j I/M) = M*(cos(A) + j

sin(A)) = M*exp(j

A) (1)

where

R is the real and I is the image, M = sqrt(R*R + I*I) and

A=arctan2(R, I) is the angle.

DFT/FFT 首要的任务是确定系统的基频(Fundamental Frequency),

这样就能确定系统一个周期的采样点数。基频在同一个系统中可根据需要而采用不同的值。现在假设系统的采样时间为

Ts, 周期采样点数 N (对于

FFT, 一般要求 N = 2*M = 2^L, DFT 则无此要求),则第

H 次谐波的 DFT 的计算公式可以从基本的

Fourier 积分公式中得出:

V(k) = sum (x(k - n) * exp( j 2* n *PI

* H /N)

*2/N) (2)

这里, n = 0 to N-1,

sum 是 N 项之和, 也就是一个周波(cycle)

的数据乘积之和。

累加一般可以化成迭代形式,公式 (2) 的迭代形式:

V(k)

= V(k-1) + (x(k) - x(k-N))

* exp(j 2*k*PI * H/N) *

2/N (3)

展开形式:

V_R(k)

=

V_R(k-1) + (x(k)

- x(k-N)) * cos(2*k*PI * H/N) *

2/N

V_I(k)

=

V_I(k-1) + (x(k)

- x(k-N)) * sin(2*k*PI * H/N) *

2/N (4)

通过公式(2)可以得出:

H = 0, DC offset: V(k) = (x(k) + x(k-1) + … +

x(k-N-1) ) * 2/N

H = 1, 基波:V(k) = (x(k-1) * exp(j 2 * PI

/N) + … + x(k-N-1) * exp(j 2*

(N-1)* PI/N) * 2/N

….

H = N/2: (省略)

从上面的公式可以看出,如果要计算所有的谐波,必须要计算

exp(j

2*n * PI *H /N) = cos(2*n*PI*H/N) + j

sin(2*n*PI*H/N) (5)

where n = 0 to N-1, H = 0 to N/2

公式(5)有一定的规律,因为cos, sin 是周期性的,也就是说总共 2* N* N/2

(不算DC) 个系数中有大量的重复, 最终都可以归结成 2* N 个系数:

exp(j 2*n * PI *

/N) = cos(2*n*PI*/N) + j

sin(2*n*PI*/N) (6)

where n = 0 to

N-1

FFT 通过巧妙的安排,仅使用 (6) 中 2* N 个系数 (

考虑到 cos(2PI*n/N) = sin(2PI*(n+N/4)/N) , 可进一步减少到 N)

,可以排除大量的冗余计算,从而提高速度,有人做过测算,当N 在 8 以上,DFT 开始超过 FFT, N/2+1次 DFT

计算量随N呈指数形式上升, 而 FFT 仅呈线性上升。关于FFT 的蝶形计算,到处都是,这里就不说了。

现在来看看FFT 的结果,把 N = 2M = 2^L 个数据通过 FFT 或N/2+1 次DFT

分解后得到N/2+1 个复数:

F = [DC, V(1), V(2), …., V(M) ]

序列F 中的每一个V 可以用公式(1)求出幅度和相位,也就是说,得到了频谱, 而这个频谱可由 FFT

算法一次得到,而DFT 分别做 N/2 +1 次。

如果我们的应用不是得到全部的频谱,比如音响的图示均衡器,仅仅需要某几个频点的幅值,又或者对于一个电力系统,仅关心50Hz基波, 2,

3, 5 次谐波,这时候 FFT 中的 10 次或者 20次谐波就显得多余了。那么,我们可以做几次DFT, 例如

4次,求得几个关键的谐波,这时的运算量反而少于 FFT. 更重要的是对于实时采样系统,使用迭代的DFT 公式(3),

可以在定时采样后立刻迭代计算几个关键的谐波,分散计算强度,让DFT 的运算量更低。

另一个重要的概念是DFT/FFT 的基频(Fundamental

Frequency), 假设采样频率为 fs, 采样点数为N, 那么基频:

f0 = fs / N

举个例子,电力电压采样频率为 800 Hz, 如果选用 N =

16, 那么基频就是 50Hz, 意味着经过 FFT/DFT 后,复数V(1) 就是 50Hz

电压信号的矢量。现在看另一种实际应用,发电机定子接地保护中的 20 Hz谐波注入 (Low Frequency Signal

Injection), 当 20 Hz 信号被注入到零线 (Neutral), 如果依旧使用50基频, 那么计算出的 50Hz

电压以及 150Hz 的三次谐波会受到 20Hz 信号的干扰,因为50基频无法排除 20 Hz 信号。这时我们可以使用 10 Hz

基频, 也就是同样的 800Hz采样频率, 但 N = 5*16 = 80, 通过 3 次 DFT 可以得出2 次谐波(20Hz) ,

5次谐波(50Hz) 以及15 次谐波 (150Hz) 的正确幅值。

linux下dft计算标准函数,FFT/DFT计算方法相关推荐

  1. linux下dft计算标准函数,dft计算(密度泛函理论dft计算)

    能克服时间域与频率域之间相互转换的计算障碍,在光谱.大气波谱分析.数字信号处理等方面有广泛应用的一种快速算法.快速傅氏变换(FFT),是离散傅氏变换的快速. 1991年,Anisimov等人发现,在传 ...

  2. matlab在linux效率高吗,取代matlab, Linux下科学计算环境的搭建

    不久前,学姐发给我一程序,我开虚拟机跑matlab算了一边,虽然我给了虚拟的XP 512M的内存,还是慢的要命.足足等了30s才出来结果.这还是只算了一遍,如果是算两层循环,96*2遍的话,我去新街口 ...

  3. linux下时间戳计算时间差,linux 时间戳及时间差计算

    使用时间戳转换为具体格式的日期输出,输出格式为:date -d '1970-01-01 UTC Timestamp seconds' +"%Y-%m-%d %T %z" [root ...

  4. DFT的计算、FFT的基础代码、FFT的横纵坐标问题(matlab)

    FFT的定义 FFT:快速傅里叶变换,是DFT的快速算法. DFT(Discrete Fourier Transform):离散傅里叶变换.在DTFT之后,将傅里叶变换的结果也进行离散化,就是DFT. ...

  5. Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析

    文章目录 1. 定义 2. 变换和处理 3. 函数 4. 实例演示 例1:单频正弦信号(整数周期采样) 例2:单频正弦信号(非整数周期采样) 例3:含有直流分量的单频正弦信号 例4:正弦复合信号 例5 ...

  6. FFT/DFT/DCT

    FFT:快速傅里叶变换--DFT快速模式 DFT:离散傅里叶变换 DCT:离散余弦变换 一.介绍 快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(D ...

  7. DFT计算基本要素之一-倒易空间和k点

    目录 1平面波函数和布里渊区 2 k空间中的积分 Guass-Legendre(高斯-勒让德)求积方法 | Guass型求积公式 + Legendre多项式 3在布里渊区如何选择点 4 k空间的总结 ...

  8. linux中double大小,linux 下 float 和 double 精度计算差别

    今天在根据需求写代码时候,偶尔发现linux 下 设置变量类型 float 和double 计算时, 得到的结果是不一样的. 要求: 设定值 = 传入值 * 10 * 122.88 /1000; ca ...

  9. linux系统退出当前计算节点命令,Linux下60个系统命令详细解.doc

    Linux下60个系统命令详细解 嵌入式学习指引--Linux下60个系统命令详细解 Linux为用户提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权 ...

  10. linux中计算高斯的进程,linux下运行高斯比windows的优势

    转引自GaussianFAQ第一章第四节 (1.4) 难道非要用Linux算高斯吗?Windows算高斯的缺陷是什么? 后续问题:听说Linux很难的.我是电脑小白,在Windows上都不太懂,只会最 ...

最新文章

  1. 数据库名、数据库实例、全局数据库名、服务名、SID等的区别
  2. jQuery 1.6 源码学习(六)——core.js[6]之jQuery对象/数组操作相关方法
  3. Scholomance Academy 读题训练,模拟(沈阳)
  4. c语言 数组指针,C语言数组名及指向数组指针的小结
  5. types是什么意思中文翻译成_types 和 @types 是什么?
  6. 在Gradle中为JPMS构建Java 6-8库
  7. 关于Apache2.4版本的phpMyAdmin的配置
  8. c# 小票机打印二维条码_C#小票打印机
  9. PN512使用的一些小技巧
  10. 菜鸟驿站是什么快递_菜鸟驿站支持哪些快递(菜鸟驿站默认发什么快递)
  11. 在VSCode中使用CUDA
  12. 【矩阵论】矩阵微积分的一些公式
  13. 塞班为什么那时候只有java_回忆S60(塞班)年代的JAVA游戏
  14. MMC 事件查看器无法打开
  15. MATLAB--数字图像处理 图像直方图均衡化
  16. Elasticsearch 快速检索的秘诀
  17. 2022 年第十二届 MathorCup 高校数学建模挑战赛思路
  18. 福特汉姆大学计算机科学专业,留学福特汉姆大学专业
  19. UVA_12676_Inverting Huffman(哈夫曼树)
  20. 自研数据分析工具——yandas系列一:分析泰坦尼克号沉船事件中的乘客信息表

热门文章

  1. 907计算机专业基础与408相比,2018计算机考研专业课精选练习题(4)
  2. R语言ggplot2可视化:loess回归曲线可视化、填充两条 loess回归曲线之间的区域实战(Fill region between two loess-smoothed lines)
  3. 值得收藏-50个免费可商用图库
  4. 怎么自己制作返利机器人教程分享
  5. c语言思维导图(学习笔记)
  6. photoshop制作ico图标
  7. 前端promise、async重点总结
  8. UCI糖尿病数据利用逻辑回归算法进行训练和预测
  9. Android Serach框架使详解
  10. 小觅双目+IMU联合标定