由于DFT算法太慢,FFT是更加快速的算法。

生成采样信号

import numpy as npf0,f1 = 0.5,2 # 最高频率为f1
T = 1/f0 # 采样时间为最低频率对应的周期
fs = m*f1 # 采样频率为最高频率的m倍
dt = 1/fs # 采样间隔# 生产采样信号
t = np.arange(0,T,dt)
y = 3 + 2*np.sin(2*np.pi*f0*t+np.pi/2) + np.sin(2*np.pi*f1*t+np.pi/3)

编写DFT程序

# 进行dft
N = len(y)
X_dft = np.zeros([N],dtype=complex) # 生成N个元素的向量
for k in range(N):for n in range(N):# 累加X_dft[k] = X_dft[k] + y[n]*np.exp(-2j*np.pi*k*n/N)
# 舍去
X_dft = np.round(X_dft,4)
print(X_dft)

运行已有的FFT函数

进行FFT变换

X_fft = np.fft.fft(y)
X_fft = np.round(X_fft,4)
print(X_fft)

幅值

# 取模后,第一个元素除以N,其余元素除以N/2,才是幅值
X_fft_abs = abs(X_fft)/len(y)*2
X_fft_abs[0] = X_fft_abs[0]/2
X_fft_abs = np.round(X_fft_abs,4)

相位

# 结果加pi/2才是相位
X_fft_phase = np.angle(X_fft) + np.pi/2
X_fft_phase[0] = 0

频率序列

freq = np.fft.fftfreq(len(y),dt)

我们所要的信息是:
f=0,A=3
f=0.5,A=2,Φ=1.5708
f=2,A=1,Φ=1.0472
其他值不是我们关心的。

比如下面这行代码没啥意思,虽然在这没啥意思,但如果要编写程序自动找出幅值与之对应的相位以及频率,这么做会方便查找。

X_fft_phase[0] = 0

对比 已编好的FFT与自编的DFT

第一组 m = 3,N=12

第二组 m = 4,N=16=2^4

因为时间太短不明显,将采样时间调长,T=1/f0*100

第一组,fft用时0.0019s,dft用时5s,第二组,fft用时0.0s,dft用时9s
这只是一次统计,但可以说明fft速度就是快,dft速度特别慢。因为速度太快,所以没有显示出变换序列是2的整数次方,fft会更快。

理论上对于fft算法,变换序列是2的整数次方,会更快。

DFT的快速算法有好多种,有名的是库利-图基快速傅里叶变换算法(Cooley-Tukey)即FFT算法。

https://www.wanweibaike.com/wiki-快速傅里叶变换#其他算法

术语

混叠:采样率低于最高频率的2倍造成的(欠采样造成的)

能量泄露:采样时间过短造成的(用于FFT的信号过短造成的)

栅栏效应:虽然采样率满足最高频率的2倍,但还是太低造成的

总之,采样率尽量高、采样时间尽量长、采样时间尽量为各分量周期的倍数(整周期采样),就不会发生这些,分解得到的幅值、相位越接近实际。

疑问:在此实验中,采样时间为1/f0,我的采样率为2*f1时,就会出现混叠,导致f=2对应的幅值能量泄露,因此改为3*f1,不知道什么问题?

十大著名算法——出自Guest Editors Introduction to the top 10 algorithms

蒙特卡洛的Metropolis算法
线性规划中的单纯形法
Krylov子空间迭代法
矩阵计算的分解方法
Fotran最优化编译器
计算特征值的QR算法
用于排序的quicksort算法
FFT
整数关系探测
快速多级子法

FFT与DFT,以及DFT程序相关推荐

  1. 利用dft的定义计算dft的matlab程序_CP2K教程系列之静态计算(Pymatflow篇)

    本系列CP2K教程是<CP2K菜根谭>的升级版,在旧版基础上添加了如何结合Pymatflow工具简化计算流程的内容.话不多说,本文将为您带来CP2K系列教程中的静态计算部分. 静态计算设置 ...

  2. idft重建图像 matlab_1周学FFT——第2天 DFT和IDFT的MATLAB实现

    根据定义式,可写出DFT的MATLAB代码如下[从玉良,2009,p72]: function [f, Xk] = mydft(xn, fs, N) % DFT n = [0:1:N-1]; k = ...

  3. FFT学习笔记(DFT,IDFT)

    昨天参悟了一天FFT,总算是理解了,今天的莫比乌斯反演也不太懂,干脆弃疗,决定来认真水一发博客. 什么是FFT? FFT(Fast Fourier Transformation),即为快速傅氏变换,是 ...

  4. 【DFT】DFT入门介绍

    一.什么是DFT DFT全称可测试性技术(DesignFor Test),是一种专为测试的集成电路设计.这里的测试一般指两部分:一是为筛出好芯片(无物理缺陷)出货而进行的量产测试:二是为芯片回来后的调 ...

  5. FFT学习应用之Matlab程序(频率泄露实例)

    fs=60;N=120; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=3*sin(2*pi*10*t)+3*sin(2*pi*20*t)+3*sin(2*pi*25*t);% ...

  6. DFT(离散傅里叶变换)与FFT(快速傅里叶变换)初识

    2019独角兽企业重金招聘Python工程师标准>>> 一. 简介 离散傅里叶变换(Discrete Fourier Transform, DFT)是数字信号处理最重要的基石之一,也 ...

  7. 傅里叶变换、离散傅里叶变换(DFT)、快速傅里叶变换(FFT)详解

    前置知识 以下内容参考<复变函数与积分变换>,如果对积分变换有所了解,完全可以跳过忽略 复数的三角表达式如下 Z=r(cosθ+isinθ)Z=r(cos\theta+isin\theta ...

  8. 离散傅里叶变换-DFT(FFT基础)

    本文是从最基础的知识开始讲解,力求用最通俗易懂的文字将问题将的通俗易懂,大神勿喷,多多指教啊,虽然说是从零学习FFT,但是基本的数学知识还是要有的,sin,cos,等. FFT(快速傅里叶变换)其本质 ...

  9. matlab fft实现dft,matlab实现dft和fft

    对任意长度的序列进行傅里叶变换 DFT 与 FFT 的运算时间比较 设计要求 利用 Matlab 或者 C 语言设计 DFT 和 FFT 程序,比较两种频谱分析方法的 计算速度,并与...... DF ...

  10. 【NCC】之三:FFT(DFT)加速协方差的计算

    FFT加速计算两个图的协方差 文章目录 <center> FFT加速计算两个图的协方差 1. 傅里叶变换和卷积 1.1 卷积定理 1.2 空域卷积和频域乘积的复杂度 2. opencv中的 ...

最新文章

  1. 组合使用Laravel和vfsStream测试文件上传
  2. Swift 5 将进一步减小 iOS 应用安装包大小
  3. php class类的用法详细总结
  4. 什么是高并发,如何避免高并发
  5. 使用@OrderBy对Spring Data MongoDB集合进行排序
  6. 前端初学者开发学习视频_初学者学习前端开发的实用指南
  7. ubuntu下集群设置静态ip
  8. linux 针对目录空间配额,linux磁盘配额quota
  9. 【面向对象】聚合的四种语义
  10. JeeWx 捷微 2.2 发布,微信管家平台
  11. 容器编排技术 -- Kubernetes kubectl rollout history 命令详解
  12. HDU 4870 Rating(高斯消元 )
  13. [luogu1880] [NOI1995]石子合并
  14. 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染
  15. 2022年上半年网络工程师下午真题及答案
  16. MSProject的使用教程
  17. ubuntu开机自启动python程序
  18. php获取上月月初,php获取当前月与上个月月初及月末时间戳的方法
  19. 点位定位打开活动,到了某个点位后才可以打卡的活动,让打卡更具体,overflow: visible默认情况下,溢出是可见的
  20. Android音乐播放器-热门榜单

热门文章

  1. 解析创新教育体系中的创客教育
  2. 电子商务管理系统mysql_电子商务数据库平台管理系统
  3. easyAR unity3d识别拍照图片
  4. Java and bitwise shift operators
  5. 容量耦合系数模型_耦合度计算的常见错误分析
  6. ssm+Vue计算机毕业设计在线音乐网站(程序+LW文档)
  7. 柳永利计算机学院,师德之星-汤永利
  8. 大物实验求不确定度代码(简单版)
  9. DBCP连接池原理分析
  10. C语言作业教师评语咋写,实验报告教师评语.doc