DFT(离散傅里叶变换)的通俗理解

本文包含了博主对离散傅里叶变换,负频率,实信号与复信号频谱的理解,如有不妥,欢迎各位批评指正与讨论。

文章目录

  • DFT的理解
  • 信号的频谱
    • 实信号的频谱
    • 复信号的频谱


DFT的理解

傅里叶变换是一种将信号从时域转换到频域的数学工具。它可以将一个号分解成不同频率的正弦和余弦波的叠加,从而更好地理解信号
的特性。

傅里叶变换公式:
在这里插入图片描述
DFT计算公式:
在这里插入图片描述
DFT的计算的理解:
离散傅里叶变换DFT的可视化讲解

DFT求出来的实部,虚部如何理解啦?

先说结论,实部代表cos序列的幅度,虚部代表sin序列的幅度。一个信号,按照傅里叶的说法,可以拆解成很多正弦波,或者说是由很多正弦波叠加到一起的。这些正弦波的幅度和频率之间的对应关系,就是信号的频域。

但是这里有个相位的问题,某个频率下有信号幅度,但是相位有可能是任意值,不同相位正弦波序列拼成的信号,完全不一样。

那样还需要一个相位和频率的关系图,不太好表示,如果这个频率没有信号,他的频率多少,没法弄。

后来想了个办法,我不去表示这个信号的相位了,我把这个信号在这个频率下的有相位的正弦信号拆解成两个正交的信号,不论信号是什么相位,都认为是一个零相位正弦信号和一个零相位余弦信号的叠加,我获得这个信号的正弦分量和余弦分量的幅度,就能反应这个信号。

这样就需要两个序列,一个正弦序列,一个余弦序列,他们两个正交,我们发现复数符合这个特点,正交,另外有那个宇宙最美公式欧拉公式加成,复数可以用指数表示,这个在数学上就变得很美很简单了,于是虚数就出现了,他表现的是信号的正弦分量。

参看:信号中的虚部的物理意义是什么?

可以理解为:傅里叶变换将信号在不同频率下进行cos和sin两个正交方向上的映射,得到两个分量,此两个分量的模构成了幅值,分量的角度构成了相位,由此包含了连续的不同频率成分下的幅值和相位信息,而DFT则是频率离散的看不同频率下的信息。得到的不同频率的实部虚部,可表示为信号是以该初始相位(以余弦为基准)开始的,该频率下以该幅值的圆进行旋转的信号的叠加。

信号的频谱

由傅里叶变换知道:实信号(实数信号,没有虚部)x(t)的傅里叶变换X(w)同时存在正负频率分量,且互为共轭;而复信号则只有单边频率分量。常用函数的傅里叶变换及其频谱。所以我们在MATLAB中使用fft函数进行傅里叶变换求得的频谱取模之后是具有对称性的。在进行fft求出的频谱后可以看的频谱从0-fs,可能会认为:根据Nyquist–Shannon(奈奎斯特-香农)采样定理,只能采集到fs/2的频率分量,所以高于fs/2的分量是没有意义的。实质上高于fs/2的频率分量是-fs/2到0的部分,这也是为什么我们一般会使用fftshift函数对求得的频谱做一个转换的原因MATLAB中fft与fftshift的区别。如前所述实信号的频率是共轭的,所以双边谱的幅值在非0处是单边谱的一半。这使得我们在查看信号的频谱时一般只关心正频率的部分,将双边谱的幅值大体乘2即转换为单边谱(注意我说的大体哦,做DFT的点数不同转换时有一点区别MATLAB中FFT频谱分析使用详解)。那是不是意味着频谱的负频率部分没有意义啦,又该如何理解负频率啦,接下来我们将在实信号和复信号的频谱小节中体现。

img

实信号的频谱

试想一下,信号的在圆上以相同的频率逆时针或顺时针旋转,得到的均为该频率分量的信号,在频谱上均需要表现出来。

逆时针旋转时:

在这里插入图片描述

顺时针旋转时:
在这里插入图片描述

比较逆时针和顺时针,可以看到对余弦函数形态没有影响,因为余弦负角度等于它自身,正弦波形反相。

此时便出现了正频率和负频率的思想:逆时针旋转为正,顺时针旋转为负。

我们用数学公式来理解频谱:
在这里插入图片描述

对于余弦 c o s ( w t ) = 0.5 ∗ c o s ( w t ) + 0.5 ∗ c o s ( ( − w ) ∗ t ) cos(wt)=0.5*cos(wt)+0.5*cos((-w)*t) cos(wt)=0.5cos(wt)+0.5cos((w)t)

对于正弦 s i n ( w t ) = 0.5 ∗ c o s ( w t − π / 2 ) + 0.5 ∗ c o s ( ( − w ) ∗ t + π / 2 ) sin(wt)=0.5*cos(wt-\pi/2)+0.5*cos((-w)*t+\pi/2) sin(wt)=0.5cos(wtπ/2)+0.5cos((w)t+π/2)
华中科大数字信号处理课程


接下来对实信号频谱分析进行举例说明:

因为FFT/DFT是用余弦定义实部,正弦定义虚部。因此,FFT的0度,用作余弦波在正峰开始时的参考。

创建一个由频率为 15 Hz 和 40 Hz 的两个正弦波组成的信号。第一个波是相位为 −π/4 的正弦波,第二个波是相位为 π/2 的余弦波。以 100 Hz 的频率对信号进行 1 秒钟的采样。

标黄处说了,FFT/DFT以余弦为参考,则
s i n ( 2 ∗ π ∗ 15 ∗ t − π / 4 ) = s i n ( 2 ∗ π ∗ 15 ∗ t − π / 4 − π / 2 + π / 2 ) = c o s ( 2 ∗ π ∗ 15 ∗ t − π / 4 − π / 2 ) = c o s ( 2 ∗ π ∗ 15 ∗ t − 3 ∗ π / 4 ) sin(2*\pi*15*t-\pi/4)=sin(2*\pi*15*t-\pi/4-\pi/2+\pi/2)=cos(2*\pi*15*t-\pi/4-\pi/2)=cos(2*\pi*15*t-3*\pi/4) sin(2π15tπ/4)=sin(2π15tπ/4π/2+π/2)=cos(2π15tπ/4π/2)=cos(2π15t3π/4)
即第一个波是相位为 −3π/4 的余弦波,第二个波是相位为 π/2 的余弦波。

clear all;close all;clc; %清理工作区,关闭所有窗口,清空文本
Fs = 100;
t = 0:1/Fs:1-1/Fs;
x = sin(2*pi*15*t - pi/4) + cos(2*pi*40*t + pi/2);
N = 100;
%计算信号的傅里叶变换。将变换幅值绘制为频率函数。
y = fft(x,N);
z = fftshift(y)/N;
figure(1);
ly = length(y);
f = (-ly/2:ly/2-1)*Fs/ly;
stem(f,abs(z))
title("Double-Sided Amplitude Spectrum of x(t)")
xlabel("Frequency (Hz)")
ylabel("|y|")
grid
%计算变换的相位,删除小幅值变换值。将相位绘制为频率函数。
tol = 1e-6;
z(abs(z) < tol) = 0;%删除小幅值变换值
theta = angle(z);
figure(2);
stem(f,theta/pi)
title("Phase Spectrum of x(t)")
xlabel("Frequency (Hz)")
ylabel("Phase/\pi")
grid

得到幅频和相频:
在这里插入图片描述

我们在工作区中查看经过fftshift并删除了小幅值的z的值,可以看到11、36、66和91位中有值。对应的是信号频率为-40Hz、-15Hz、15Hz和40Hz处的复数值。
在这里插入图片描述
对应欧拉公式的几何意义:
在这里插入图片描述

即(-0.3536,0.3536)即表示幅值为0.5,相位为 −3π/4的信号,依次类推。

我们用幅值和相位合成对于频率的信号:
15Hz:
0.5 ∗ c o s ( 2 ∗ p i ∗ 15 ∗ t − 3 ∗ π / 4 ) + 0.5 c o s ∗ ( 2 ∗ π ∗ ( − 15 ) ∗ t + 3 ∗ π / 4 ) = c o s ( 2 ∗ π ∗ 15 ∗ t − 3 ∗ π / 4 ) 0.5*cos(2*pi*15*t-3*\pi/4)+0.5cos*(2*\pi*(-15)*t+3*\pi/4)=cos(2*\pi*15*t-3*\pi/4) 0.5cos(2pi15t3π/4)+0.5cos(2π(15)t+3π/4)=cos(2π15t3π/4)

40Hz:
0.5 ∗ c o s ( 2 ∗ p i ∗ 40 ∗ t + π / 2 ) + 0.5 ∗ c o s ( 2 ∗ p i ∗ ( − 40 ) ∗ t − π / 2 ) = c o s ( 2 ∗ π ∗ 40 ∗ t + π / 2 ) 0.5*cos(2*pi*40*t+\pi/2)+0.5*cos(2*pi*(-40)*t-\pi/2)=cos(2*\pi*40*t + \pi/2) 0.5cos(2pi40t+π/2)+0.5cos(2pi(40)tπ/2)=cos(2π40t+π/2)

由此得到信号1是一个幅值为1,相位为 − 3 π / 4 -3\pi/4 3π/4的信号;信号2是一个幅值为1,相位为 π / 2 \pi/2 π/2的信号。


参考:

FFT分析的负频率是什么?

如何正确理解信号处理中的负频率

一文读懂“为什么FFT有负频率”

复信号的频谱

而复信号则只有单边频率分量。

举例:频率为128或-128,相位为 π / 4 \pi/4 π/4的复数信号频谱

clear all;close all;clc; %清理工作区,关闭所有窗口,清空文本
N=1024;
fs=1024;                    %采样间隔为1/1000
t=(0:1023)/fs;              %时间轴,注意要从0开始;若从1开始会以第一个点开始的位置计算,即pi/4+f0/fs*1*2pi=pi/2
f0=128;                     %复数频率
y=exp(i*(2*pi*f0*t+pi/4));   
f_shift = (-N/2:N/2-1)*fs/N;
fft_y=fft(y,N)/N;             %FFT
fft_shift = fftshift(fft_y);
plot(f_shift,abs(fft_shift));
title("复数信号频谱");
xlabel('f');
ylabel('y');
grid on;

频谱图:
在这里插入图片描述

将f改为-128时频谱:
在这里插入图片描述
可以看出,当频率为正时,得到的频谱出现在正频率处;当频率为负时,得到的频谱出现在负频率处,且幅值为原信号的幅值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/220140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过pipeline配置sonar自动化实现过程解析

这篇文章主要介绍了通过pipeline配置sonar自动化实现过程解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.sonar配置webhooks&#xff0c; 2.url填写jenkins的地址&#xff1a;http://jenkinsurl/sonarqu…

CRC(循环冗余校验)直接计算和查表法

文章目录 CRC概述CRC名词解释宽度 (WIDTH)多项式 &#xff08;POLY&#xff09;初始值 &#xff08;INIT&#xff09;结果异或值 &#xff08;XOROUT&#xff09;输入数据反转&#xff08;REFIN&#xff09;输出数据反转&#xff08;REFOUT&#xff09; CRC手算过程模二加减&am…

1_控制系统总体结构

1、总体结构 控制系统结构图&#xff1a; 黑色块为参数、黄色块为计算模块 1.1 其中参数含义 车辆属性参数&#xff1a; 参数含义 C α f C_{\alpha f} Cαf​自行车模型总轮胎侧偏刚度&#xff08;前轮&#xff09; C α r C_{\alpha r} Cαr​自行车模型总轮胎侧偏刚度&a…

Android wifi disable分析

总体流程 老套路基本不变&#xff1a; WifiSettings 通过 WifiManager 下cmd 给 WifiServiceWifiService 收到cmd后&#xff0c;先完成一部分列行检查&#xff08;如UID的权限、是否airPlayMode等等&#xff09;&#xff0c;之后将cmd下发给到WifiControllerWifiController 收…

云原生的 CI/CD 框架tekton - Trigger(二)

上一篇为大家详细介绍了tekton - pipeline&#xff0c;由于里面涉及到的概念比较多&#xff0c;因此需要好好消化下。同样&#xff0c;今天在特别为大家分享下tekton - Trigger以及案例演示&#xff0c;希望可以给大家提供一种思路哈。 文章目录 1. Tekton Trigger2. 工作流程3…

Learning Memory-guided Normality for Anomaly Detection 论文阅读

Learning Memory-guided Normality for Anomaly Detection 摘要1.介绍2.相关工作3.方法3.1网络架构3.1.1 Encoder and decoder3.1.2 Memory 3.2. Training loss3.3. Abnormality score 4.实验5.总结总结&代码复现&#xff1a; 文章信息&#xff1a; 发表于&#xff1a;cvpr…

忽略python运行出现的大量警告

添加以下代码即可 import warnings warnings.filterwarnings(ignore)

python-ATM机

编写程序&#xff0c;实现一个具有开户、查询、取款、存款、转账、锁定、解锁、退出功能的银行管理系统。 结果展示 1.Main主方法 from zzjmxy.class7.atm import ATM from zzjmxy.class7.manager import Manager # 主面板&#xff0c;实现主要逻辑if __name__"__main__…

【Maven】更新依赖索引

有时候给idea配置完maven仓库信息后&#xff0c;在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了&#xff0c;具体做法如下&#xff1a; 打开设置----搜索maven----Repositories----选中本地仓库-…

如何搭建eureka-server

在Spring Cloud项目的pom文件中添加eureka-server的starter依赖坐标 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…

指针(3)

如图&#xff0c;这是比较常见的冒泡排序&#xff0c;不过只能对整形数据进行排序。本篇博文主要介绍如何模拟qsort函数实现冒泡排序对任何数据的排序。 如果我们想对任何数据进行排序&#xff0c;我们可以发现&#xff0c;排序的趟数是固定的&#xff0c;我们只需要对比较大…

CFS三层靶机内网渗透

CFS三层靶机内网渗透 一、靶场搭建1.基础参数信息2.靶场搭建2.1网卡配置2.2Target1配置2.2.1 网卡配置2.2.2 Target1 BT配置 2.3Target2配置2.3.1 网卡配置2.3.2 Target2 BT配置 2.4Target3配置 二、内网渗透Target11.1信息收集1.1.1IP收集1.1.2端口收集1.1.3目录收集 1.2 webs…

用 taichi 写个软渲染器

用 taichi 写个软渲染器 What 起点是&#xff1a;可以 setup 一个画布&#xff0c;drawPixel(x, y, color)&#xff0c;然后渲染到 GUI 或者 .png目标是&#xff1a;加载 obj 模型文件和 .tga 贴图文件&#xff0c;并渲染出来使用 taichi 作为 SIMD 加速 backend复现一些 RTR…

【4】PyQt输入框

1. 单行文本输入框 QLineEdit控件可以输入单行文本 from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout from PyQt5.QtCore import * from PyQt5.QtGui import QIcon import sysdef init_widget(w: QWidget):# 修改窗口标题w.setWindowTitle(单行输…

Python (一) 操作Mysql

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

Google视频广告的格式和注意事项

随着互联网和移动设备的普及&#xff0c;视频广告成为了数字营销中重要的一环&#xff0c;Google作为全球最大的搜索引擎和广告平台之一&#xff0c;Google提供了广泛的视频广告服务&#xff0c;帮助企业推广产品以及品牌。那么Google视频广告的格式和注意事项是什么呢&#xf…

离线环境下使用百度地图(vue版)(展示自己的地图瓦片)3.0版本api

1.下载自己想要的地图网片 (1)瓦片图下载 提取百度网盘中文件&#xff0c;然后运行exe文件&#xff0c;选择要下载的层级及地区即可 百度网盘链接&#xff1a;https://pan.baidu.com/s/16sOJ9ws7HCgNH3EMf7Ejyg?pwd0q0e 提取码&#xff1a;0q0e (2)将瓦片图映射到网上 推荐使…

数电笔记之寄存器

数电 1 数字电路基础 1.2 二进制数据表达 1.2.1 二进制简介 1.2.2 用二进制表达文字 常用的中文字符集&#xff1a;GBK&#xff0c;UTF8 1.2.3 用二进制表达图片 图片像素化&#xff0c;像素数字化 1.2.4 用二进制表达声音 1.2.5 用二进制表达视频 1.3 数字电路 1.3…

mysql中year函数有什么用

YEAR()函数用于提取日期或日期时间值中的年份。可以用于提取DATE、DATETIME或TIMESTAMP列中的年份。 SELECT YEAR(date_column) FROM table;# 提取字符串中的数据SELECT YEAR(2023-07-19) FROM table_name;

day70

今日回顾 session 中间件 auth session Cookie虽然在一定程度上解决了“保持状态”的需求&#xff0c;但是由于Cookie本身最大支持4096字节&#xff0c;以及Cookie本身保存在客户端&#xff0c;可能被拦截或窃取&#xff0c;因此就需要有一种新的东西&#xff0c;它能支持更…