FFT与DFT,以及DFT程序
由于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程序相关推荐
- 利用dft的定义计算dft的matlab程序_CP2K教程系列之静态计算(Pymatflow篇)
本系列CP2K教程是<CP2K菜根谭>的升级版,在旧版基础上添加了如何结合Pymatflow工具简化计算流程的内容.话不多说,本文将为您带来CP2K系列教程中的静态计算部分. 静态计算设置 ...
- 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 = ...
- FFT学习笔记(DFT,IDFT)
昨天参悟了一天FFT,总算是理解了,今天的莫比乌斯反演也不太懂,干脆弃疗,决定来认真水一发博客. 什么是FFT? FFT(Fast Fourier Transformation),即为快速傅氏变换,是 ...
- 【DFT】DFT入门介绍
一.什么是DFT DFT全称可测试性技术(DesignFor Test),是一种专为测试的集成电路设计.这里的测试一般指两部分:一是为筛出好芯片(无物理缺陷)出货而进行的量产测试:二是为芯片回来后的调 ...
- 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);% ...
- DFT(离散傅里叶变换)与FFT(快速傅里叶变换)初识
2019独角兽企业重金招聘Python工程师标准>>> 一. 简介 离散傅里叶变换(Discrete Fourier Transform, DFT)是数字信号处理最重要的基石之一,也 ...
- 傅里叶变换、离散傅里叶变换(DFT)、快速傅里叶变换(FFT)详解
前置知识 以下内容参考<复变函数与积分变换>,如果对积分变换有所了解,完全可以跳过忽略 复数的三角表达式如下 Z=r(cosθ+isinθ)Z=r(cos\theta+isin\theta ...
- 离散傅里叶变换-DFT(FFT基础)
本文是从最基础的知识开始讲解,力求用最通俗易懂的文字将问题将的通俗易懂,大神勿喷,多多指教啊,虽然说是从零学习FFT,但是基本的数学知识还是要有的,sin,cos,等. FFT(快速傅里叶变换)其本质 ...
- matlab fft实现dft,matlab实现dft和fft
对任意长度的序列进行傅里叶变换 DFT 与 FFT 的运算时间比较 设计要求 利用 Matlab 或者 C 语言设计 DFT 和 FFT 程序,比较两种频谱分析方法的 计算速度,并与...... DF ...
- 【NCC】之三:FFT(DFT)加速协方差的计算
FFT加速计算两个图的协方差 文章目录 <center> FFT加速计算两个图的协方差 1. 傅里叶变换和卷积 1.1 卷积定理 1.2 空域卷积和频域乘积的复杂度 2. opencv中的 ...
最新文章
- 组合使用Laravel和vfsStream测试文件上传
- Swift 5 将进一步减小 iOS 应用安装包大小
- php class类的用法详细总结
- 什么是高并发,如何避免高并发
- 使用@OrderBy对Spring Data MongoDB集合进行排序
- 前端初学者开发学习视频_初学者学习前端开发的实用指南
- ubuntu下集群设置静态ip
- linux 针对目录空间配额,linux磁盘配额quota
- 【面向对象】聚合的四种语义
- JeeWx 捷微 2.2 发布,微信管家平台
- 容器编排技术 -- Kubernetes kubectl rollout history 命令详解
- HDU 4870 Rating(高斯消元 )
- [luogu1880] [NOI1995]石子合并
- 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染
- 2022年上半年网络工程师下午真题及答案
- MSProject的使用教程
- ubuntu开机自启动python程序
- php获取上月月初,php获取当前月与上个月月初及月末时间戳的方法
- 点位定位打开活动,到了某个点位后才可以打卡的活动,让打卡更具体,overflow: visible默认情况下,溢出是可见的
- Android音乐播放器-热门榜单