彻底搞懂傅里叶变换之实用干货分享(四)-离散傅里叶变换(DFT)

傅里叶变换(DFT)从原理到代码 FFT傅里叶变换相关知识 阅读详情

hello, 小伙伴们,我们继续进行傅里叶变换的讲解,更多有关傅里叶变换的公式原理、公式推导及代码实现等,可在作者主页下的视频或文章列表中找到。

本文讲解离散傅里叶变换的公式推导及代码实现,同时理解本文需要一定的傅里叶相关基础知识,为了更好的理解本文,建议你先阅读以下文章。

AI工作室:彻底搞懂傅里叶变换之实用干货分享(一)-从原理到实战文章汇总21 赞同 · 1 评论文章

AI工作室:彻底搞懂傅里叶变换之实用干货分享(二)-傅里叶级数38 赞同 · 6 评论文章

AI工作室:彻底搞懂傅里叶变换之实用干货分享(三)-傅里叶变换基础14 赞同 · 2 评论文章

1.复数形式傅里叶变换与逆变换

傅里叶变换一般指的是连续傅里叶变换,其定义如下:

傅里叶逆变换的定义如下:

有了傅里叶变换了,为什么还要搞出个离散傅里叶变换呢?我们从上面公式可以看出,不管是傅里叶变换还是逆变换都是正负无穷的连续积分,这在数学公式上尚可以根据微分及极限求解公式进行计算,但却不太方便在计算机上实现,因为计算机是一个离散系统,那离散傅里叶变换就是用来解决这个问题的,使用计算机这个离散系统进行有限近似计算。不过在讲离散傅里叶变换之前,先说说离散时间傅里叶变换(DTFT)。

2.离散时间傅里叶变换(DTFT)

在离散系统中,假如x(t)为连续系统信号,要转换成离散系统,就要先进行采样,采样频率为 fs ,采样点时间间隔为 Ts=1fs ,冲击采样序列为:

则取样之后的信号为

这里t如果取的不是 Ts 的整数倍,其值没有定义,即只能取 Ts 的整数倍。

连续信号的傅里叶变换的定义为

则采样后的信号傅里叶变换为

交换一下积分与求和顺序

由 δ(t) 的筛选性

得

对数字系统而言,我们只有x(t)采样后的信号{x[n]},注意,它是一个序列,第n个采样发生在时间t=nTs,因此,可将连续信号的傅里叶变换写成如下形式:

上式称为离散时间傅里叶变换(Discrete Time Fourier Transform),简称DTFT,也就是无限长离散信号如何进行傅里叶变换。

3.离散傅里叶变换(DFT)与逆变换(IDFT)

离散时间傅里叶变换中原始信号还是无限长的,即使采样后,采样点也是无限个,可以认为周期为无限长,因此它的频谱就趋向于连续,而连续的频谱同样不利于计算机处理,所以频率也要离散化才行,所需要的技术就是离散傅里叶变换DFT(Discrete Fourier Transform),即具有周期特性离散信号的傅里叶级数(就是将无限长的离散信号进行截短至N个采样点,然后将这个N个采样点进行周期延拓,变成周期信号,这样其频率就离散了)。

离散傅里叶变换与连续傅里叶变换“类似”,只不过把积分换成级数,DFT以及IDFT的定义如下:

下面进行详细推导。

我们知道,周期函数可以用傅里叶级数展开,在引入 δ(t) 函数后,更一般的周期函数也能被展开了,因为可以使用 δ(t) 函数进行采样,变成有限长离散序列,可以看成是周期信号。

根据连续信号x(t)按照采样时间Ts进行抽样N次δ(t−nTs),并将这N个数值进行周期延拓,可以得到周期的离散信号x[n],其周期T=N*Ts,频率为f=2pi/T,在一个周期T内,其共表达式为

令

可以获得离散周期信号的傅里叶级数为

由δ(t)函数的筛选性,有

令

得

这就是离散周期信号的傅里叶变换,理论上离散周期信号的频谱是有无穷多的,但是由于 e−i2πNkn 的周期性(将其展开成三角函数后sin和cos),一般我们只取主值区间0<=k<N-1进行研究。

上面我们计算了离散周期信号的频谱,即不同频率分量下对应的系数,下面将得出一个重要的结论

也就是说

离散周期傅里叶变换后第k个数对应的频率是 kNfs

同时,离散周期傅里叶变换后,计算出来的是一个复数形式,即用正弦和余弦组合的形式近似表示原始信号,所以幅值应该是两者的组合,sqrt(A_sin^2 + A_cos^2)。

4.离散傅里叶变换的物理意义

采样定理:采样频率大于信号中最高频率的2倍时,采样后的数字信号可以完整地恢复出原始信号。一般实际应用中保证采样频率为信号最高频率的2.56~4倍。

假设信号频率为F,采样频率为Fs,采样点数为N。为了方便进行DFT运算,通常N取2的整数次幂。

N个采样点,经过DFT变换后的结果为N个复数,每个复数对应一个频率(第n<=N/2个点对应的频率为(n-1)/N*Fs),该复数的模值表示该频率的振幅特征。怎么去理解这段话呢,还要从信号的傅里叶级数复数形式说起,对于时域信号f(t),其傅里叶级数展开为

其中

在离散傅里叶中,n不是取无穷个,而是N个,于是有

其中

可以看到,原始时域信号f(t)经DFT后,DFT的结果其实是原始信号傅里叶展开的个项系数,c0为常数项,cn是不同频率的正余弦系数。

该振幅特征和原始信号的振幅之间的关系是:如果原始信号的振幅为A,则DFT结果的每个点(除了第一个直流分量点)的模值就是A的N/2倍;而第一个点的模值是直流分量振幅的N倍。同时,这N个复数点去掉第一个点(直流分量)后剩下的N-1个点是关于其中心共轭对称的,因此实际只需要取前一半点的频谱即可,因为共轭对称的两个点的模值(振幅)相同。

##注意,以上结论是针对numpy的fft运算结果总结的,在numpy.fft中没有进行1/N归一化处理,而上面推导中都是除N的,即

5.实验验证

上面列了一些公式,比较抽象,下面我们根据公式,使用python编写程序进行验证。

这里我们定义一个时域信号

y=2+3cos(2π×50t)+1.5cos(2π×75t)

不难求出其包含一个50hz和一个75hz的频率信号。

下面使用256hz的采样频率,对信号进行离散化,得到x[n],然后先做离散傅里叶变换,分析其频谱,再做逆傅里叶变换,还原回原时域信号。同时,为了验证计算的正确性,在程序里分别使用np.fft模块,同时再根据离散傅里叶变换公式分别作了计算,并进行对比。

#! /usr/bin/python3
# -*- encoding:utf-8 -*-

import matplotlib.pyplot as plt
from matplotlib.pylab import mpl
import numpy as np
from numpy import pi, cos, sin

# 中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def test2():
    '''
    离散傅里叶变换
    一维时序信号y,它由2V的直流分量(0Hz),和振幅为3V,频率为50Hz的交流信号,以及振幅为1.5V,频率为75Hz的交流信号组成:
    y = 2 + 3*np.cos(2*np.pi*50*t) + 1.5*np.cos(2*np.pi*75*t)
    然后我们采用256Hz的采样频率,总共采样256个点。
    '''
    fs = 256  # 采样频率, 要大于信号频率的两倍
    t = np.arange(0, 1, 1.0 / fs)  # 1秒采样fs个点
    N = len(t)
    freq = np.arange(N)  # 频率counter

    # x = 2 + 3 * cos(2 * pi * 50 * t) + 1.5 * cos(2 * pi * 75 * t)  # 离散化后的x[n]
    x = 2 + 3 * cos(2 * pi * 10 * t) + 1.5 * cos(2 * pi * 15 * t)  # 离散化后的x[n]

    X = np.fft.fft(x)  # 离散傅里叶变换

    '''
    根据STFT公式原理,实现的STFT计算,做了/N的标准化
    '''
    X2 = np.zeros(N, dtype=np.complex)  # X[n]
    for k in range(0, N):  # 0,1,2,...,N-1
        for n in range(0, N):  # 0,1,2,...,N-1
            # X[k] = X[k] + x[n] * np.exp(-2j * pi * k * n / N)
            X2[k] = X2[k] + (1 / N) * x[n] * np.exp(-2j * pi * k * n / N)

    fig, ax = plt.subplots(5, 1, figsize=(12, 12))

    # 绘制原始时域图像
    ax[0].plot(t, x, label='原始时域信号')
    ax[0].set_xlabel('Time (s)')
    ax[0].set_ylabel('Amplitude')

    ax[1].plot(freq, abs(X), 'r', label='调用np.fft库计算结果')
    ax[1].set_xlabel('Freq (Hz)')
    ax[1].set_ylabel('Amplitude')
    ax[1].legend()

    ax[2].plot(freq, abs(X2), 'r', label='根据STFT计算结果')
    ax[2].set_xlabel('Freq (Hz)')
    ax[2].set_ylabel('Amplitude')
    ax[2].legend()

    X_norm = X / (N / 2)  # 换算成实际的振幅
    X_norm[0] = X_norm[0] / 2
    ax[3].plot(freq, abs(X_norm), 'r', label='转换为原始信号振幅')
    ax[3].set_xlabel('Freq (Hz)')
    ax[3].set_ylabel('Amplitude')
    ax[3].set_yticks(np.arange(0, 3))
    ax[3].legend()
    
    freq_half = freq[range(int(N / 2))]  # 前一半频率
    X_half = X_norm[range(int(N / 2))]

    ax[4].plot(freq_half, abs(X_half), 'b', label='前N/2个频率')
    ax[4].set_xlabel('Freq (Hz)')
    ax[4].set_ylabel('Amplitude')
    ax[4].set_yticks(np.arange(0, 3))
    ax[4].legend()

    plt.show()

test2()

程序输出结果如下,可以看出,不管使用推导公式还是调用库,其计算结果都是正确的。

转载:

anders 南京航空航天大学 机械电子硕士

https://zhuanlan.zhihu.com/p/405143684?utm_id=0

离散时间傅里叶变换(DTFT)、离散傅里叶变换(DFT)和快速傅里叶变换(FFT)之间的联系和区别 本博文介绍、比较、分析了DTFT、DFT和FFT 阅读详情

相关推荐

傅里叶变换

本章所有的滤波都是通过傅里叶变换在频率域中实现的 傅里叶变换在诸如图像增强、图像复原、图像数据压缩等方面起着很重要的作用 傅里叶变换(DFT): 傅里叶变换的直流分量:频率域原点处变换的值[F(0,0)] ...

南淮北安的博客 4204

离散傅里叶变换(DFT)

DFT变换基本原理与算法实现

weixin_60737527的博客 2万+

离散傅里叶变换DFT的代码实现

dft的Python与c++实现

驽马十驾,功在不舍;锲而不舍,金石可镂。 841

【算法】离散傅里叶变换(DFT)

真实的系统是会离散的,时变的。理想者将瞬时态看成时线性的系统,将时变系统分成了不同阶段。离散在围观层面是连续的,但从表层感受时,变化是迅猛的,可以忽略不计变化的过程,因而成为了离散。 一、离散系统 离散控制系统是指在控制系统的一处或数处信号为脉冲序列或数码的系统。如果在系统中使用了采样开关,将连续信号转变为脉冲序列去控制系统,则称此系统为采样控制系统。如果在系统中采用了数字计算机或数字控制器,其信号是以数码形式传递的,则称此系统为数字控制系统。通常把采样控制系统和数字控制系统统称为离散控制系统。离散系统.

Carol0630的博客 2万+

一维有限长序列的离散傅里叶变换

一维有限长序列的离散傅里叶变换是周期序列的离散傅里叶级数的主值区间上的幅值

单细胞双胞过滤-scrublet安装

pip install scrublet ----use-pep517有如下报错,分析可知安装annoy时不会自动更新gcc的版本,centos默认是4.8.5。pip install scrublet ----use-pep517 仍然报错,但似乎不影响使用,提示Successfully installed。打开终端,进入Python环境,输入以下代码,查看Python安装位置。暂时还没尝试是否存在问题,如果存在问题,降级scrublet版本。包的开发依赖的是比较低版本的numpy,会用到。

hzau_t的博客 792

二维离散傅里叶变换

在学完一维的傅里叶变换后,紧接着就是二维的傅里叶变换了。直接上干货吧!!! 途中会用到opencv读取与显示图片。 一. 公式 M表示图像的行数,N表示图像的列数。 经过欧拉公式可以得一下形式,这样就可以轻松得到实部和虚部了。 其逆变换 4. 将傅里叶保护后的图像中心化。只需要在傅里叶变换的f(x,y)前面成以一个(-1)的x+y次方就可以了。其数学推导可以自行去百度。 看完上面的公式之后...

weixin_44678052的博客 3389

Potplayer + LAVFilters + madVR 配置教程

文章目录Potplayer + LAVFilters + madVR 配置教程工具安装篇设置调教1.potplayer播放器设置加载LAVFilters和madVR1.选择“源滤镜/分离器”选项,选择“滤镜/解码器管理”2.“添加外部滤镜”3.浏览到刚才LAVFilters解压的文件夹,分别添加图示项。4.添加后回到管理界面设置,点击左边的”LAV AudioDecoder”,将右边”音频解码器”...

re 16万+

过采样系列二:傅里叶变换与信噪比

分享,让知识变得更简单 公众号:工程师看海 欢迎转发支持 傅里叶变换的提出让人们看问题的角度从时域变成了频域,多了一个维度。快速傅里叶变换算法的提出普及了傅里叶变换在工程领域的应用,在科学计算和数字信号处理等领域,离散傅里叶变换(DFT)至今依然是非常有效的工具之一。 比如下图是一个幅度为1、频率为2Hz的正弦波和它的离散傅里叶变换后的结果。 公众号后台回复:matlab FFT 可以得到原始matlab代码 信噪比(SNR)是信号与噪声的比率,它是衡量通信或模拟系统性能的重要指标之一

《运放秘籍》系列视频原创作者、畅销书《硬件设计指南 从器件认知到手机基带设计》原创作者 6109

Android AudioFlinger实战:如何用FastMixer优化低延迟音频流(附调试技巧)

本文深入解析了Android AudioFlinger的FastMixer线程机制,指导开发者如何利用该技术优化低延迟音频流。通过实战配置AAudio API、调整硬件缓冲区及线程优先级,并结合adb、Systrace等调试技巧,可将音频延迟显著降低至10毫秒以下,适用于音乐制作、游戏音效等实时音频处理场景。

weixin_29230901的博客 335

5G LDPC编码实战:从校验矩阵到Matlab代码实现(附完整源码)

本文深入解析5G NR标准中的LDPC编码工程实现,聚焦于从3GPP协议中的QC-LDPC校验矩阵到高效Matlab代码的转换。文章详细阐述了基础矩阵(BG1/BG2)选择、提升因子确定以及利用双对角结构的快速编码算法,并提供了完整的、可优化的Matlab源码,旨在帮助通信算法工程师和开发者快速构建5G LDPC编码仿真原型,为硬件实现奠定基础。

table的专栏 377

DFT离散傅里叶变换【针对工科生,加入Zero padding,FFT,Windowing,STFT】

这篇博客主要讲解STFT,需要引入Zero padding,FFT,Windowing(加窗)概念,所以先引入这三个概念再讲STFT(短时傅里叶变换) 参考资料 离散傅里叶变换零基础入门-中文2(针对工科生,无需连续傅立叶变换知识)_哔哩哔哩_bilibili ...

To be a better man 609

SpringBoot 中 @RequestMapping 及衍生注解的全面解析与实践

本文全面解析Spring Boot中@RequestMapping及其衍生注解的使用,涵盖核心功能、HTTP方法特定注解(@GetMapping/@PostMapping等)、属性详解(路径/参数/头信息等)以及路径变量处理。文章详细介绍了注解的组合使用、继承特性、版本控制策略等高级应用,并针对405/404等常见错误提供解决方案。通过学习这些注解的规范用法,开发者能够构建符合RESTful风格的API接口,提升代码可读性和可维护性。建议优先使用HTTP方法特定注解,合理规划URL结构,并注意避免路径冲突。

Java&AI小吕布的博客 2037

准零基础搞懂FFT快速傅里叶变换及其实现程序(一)

//---------------------前言唠叨废话------------------------------------------- 本文的目标:让不是很了解DSP的小伙伴会用FFT(快速傅里叶变换),并知道怎么用代码实现FFT,不求甚解,但求works。 最近做项目用到FFT, 之前学的一直就不是很明白,现在用到了决定好好的把它搞懂。在中文网站上找了一些资料,发现讲的都不

birthmarkqiqi的专栏 1万+

Python与CAD系列基础篇(二)创建点和直线并修改样式

①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件。创建和编辑点和直线的方法,并演示如何修改它们的样式、颜色和线型。

weixin_43894929的博客 3036

fasterlio原理及代码框架梳理

Faster-LIO 的优势是在保持同等高精度的前提下,显著提升计算效率,以支持更极端的应用场景(如高速无人机)和更廉价的硬件平台。可以把 Faster-LIO 理解为用一把更快的“空间哈希筛子”(iVox)替换了原来精细的“动态平衡树”(ikd-Tree),从而在精度损失极小的情况下,实现了效率的显著提升。:只在实际有地图点的空间区域动态创建和保留体素单元,形成一个稀疏的体素地图。是关键:将去畸变点云中的每个点,在 iVox 维护的局部地图中搜索近邻(如5个最近点),构建点到面的距离残差。

Studying…… 246

傅里叶变换的资料(自mark)

最近想学小波分析,得先学下傅里叶变换,mark一下资料。 之前看的是MIT的一个课程,但太久了就忘掉了,这次在B站上找到一个精华版的公式推导,感觉很不错。 该系列是up主DR_CAN制作的,从三角函数的正交性,讲到周期分别为2pi,2T到无穷的函数展开,讲到傅里叶级数,再讲到傅里叶变换。都是公式推导。虽然一些定理上直接给出而没有证明,但对于工科要初步理解掌握傅里叶变换已经够用。 纯干货数学推导_傅里叶级数与傅里叶变换_Part1_三角函数的正交性 纯干货数学推导_傅里叶级数与傅里叶变换_Part2_周期为2

yingfeiye的博客 244

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(4)

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(4)

phmatthaus的专栏 1532

信号处理入门:如何用C语言实现音频频谱分析(DFT/FFT实战)

本文提供了使用C语言实现音频频谱分析的完整实战指南。通过对比讲解离散傅里叶变换(DFT)及其快速算法(FFT)的核心原理,并附上可直接编译运行的源码,详细展示了从复数运算、窗函数处理到FFT算法实现、结果验证及频谱可视化的全流程,帮助开发者掌握信号处理的关键技术。

f9g0h的博客 261

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

傅里叶变换的科学应用

前言最近一周一直在处理与傅里叶变换有关的事情,花了不少时间,稍微有些收获,以博文的形式记录下来希望能够自己及他人提供少许帮助。简介傅里叶变换可以将一个时间域信号变换到频率域。有些信号在时间域上很难看出特征,但是当转换到频率域一些特征就会变的明显。想必当学习傅里叶变换时大家都已经知道一个例子:无限正弦波叠加就会产生一个标准的矩形波(方波或脉冲波)。如果这很难理解,就努力回忆一下大学本科高数教材中(高等

wokaowokaowokao12345的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

网络近端串扰测试软件,干货 如何使用DSP技术进行网线近端串扰测试

运用DSP技术进行网线近端串扰测试,不仅可以有效的保障网络稳定性,还可以减少故障发生几率,提升网络可靠性。那么,使用数字信号处理技术进行网线的近端串扰测试,其原理是什么?DSP技术又是如何能够完成串扰测试的呢?本文将会通过实际案例的介绍,为大家进行简要分析。要了解使用DSP技术进行网线近端串扰测试的原理,首先我们需要了解的这种测试的要求是什么。所谓的近端串扰测试,指的是非屏蔽双绞线布线系统传输性能...

weixin_30139729的博客 1196

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[Java]高能-绝对专业-快速傅立叶变换(FFT/DFT)算法实现

高能⚠️ (如果您没有听过或不是要寻找快速傅立叶变换Fast Fourier transform(FTT)/离散傅里叶变换Discrete Fourier Transform(DFT)相关的问题,请直接无视这篇文章) 遇到一个通讯专业-波形频谱信号????分析的项目,需要把一组数据做快速傅立叶变换(FTT)后,画出图形(如下图) 我也不是通信专业的,不懂什么FFT变换,在专业老师的指导下,网上找了相关的算法的代码(如果没有方向,而且专业性特强,很难找),故分享到这里,供有需要的朋友参考。 我一共

yaoxinghuo的专栏 620

python傅里叶变换 信号处理 序列_信号处理之频谱原理与python实现

点击上面"脑机接口社区"关注我们更多技术干货第一时间送达EEG信号是大脑神经元电活动的直接反应,包含着丰富的信息,但EEG信号幅值小,其中又混杂有噪声干扰,如何从EEG信号中抽取我们所感兴趣的信号是一个极为重要的问题。自1932年Dietch首先提出用傅里叶变换方法来分析EEG信号,该领域相继引入了频域分析、时域分析等脑电分析的经典方法。频谱分析下面是一组用于描述和解释信号属性的常用量(...

weixin_39813009的博客 1590

优快云 付费专栏|傅里叶变换与卷积的深层关系、公式推导、完整演算实例 + Python 代码实战

本文深度剖析信号与系统中的卷积定理,揭示傅里叶变换与卷积的本质关系。文章从基础定义出发,详细推导连续时间卷积定理的数学证明过程,并通过时域卷积与频域相乘的对比例题进行验证。针对工程应用最广的离散傅里叶变换(DFT)版本,提供完整的Python代码实现(含补零处理),演示如何利用FFT快速卷积。文章还总结了卷积定理在信号处理、图像滤波和深度学习中的核心应用价值,并列出常见误区。内容融合奥本海姆、郑君里等经典教材理论,配合可运行的代码实例,适合电子通信、AI信号处理等领域的学习者参考。

weixin_44520581的博客 157
上一篇: 数字图像频谱的中心化
下一篇: 傅里叶变换DFT频谱中为什么白色的、亮的是低频,黑色的、暗的是高频?
forfuture3513
博客等级 码龄15年 76粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值