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.mzph.cn/news/199764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通信标准化协会,信通院及量子信息网络产业联盟调研玻色量子,共绘实用化量子未来!

8月14日&#xff0c;中国通信标准化协会&#xff0c;信通院标准所及量子信息网络产业联盟等单位领导走访调研北京玻色量子科技有限公司&#xff08;以下简称“玻色量子”&#xff09;&#xff0c;参观了玻色量子公司及自建的十万颗粒洁净度的光量子信息技术实验室&#x1f517;…

STM32下载程序的五种方法

刚开始学习 STM32 的时候&#xff0c;很多小伙伴满怀热情买好了各种设备&#xff0c;但很快就遇到了第一个拦路虎——如何将写好的代码烧进去这个黑乎乎的芯片&#xff5e; STM32 的烧录方式多样且灵活&#xff0c;可以根据实际需求选择适合的方式来将程序烧录到芯片中。本文将…

10年前,我就用 SQL注入方式发现了学校网站的漏洞

大家好&#xff0c;我是风筝。 事情是这样子的&#xff0c;在10年以前&#xff0c;某个月黑风高夜的夜里&#xff0c;虽然这么说有点暴露年龄了&#xff0c;但无所谓&#xff0c;毕竟我也才18而已。我打开电脑&#xff0c;在浏览器中输入我们高中学校的网址&#xff0c;页面很…

TCP首部格式_基本知识

TCP首部格式 表格索引: 源端口目的端口 序号 确认号 数据偏移保留 ACK等 窗口检验和紧急指针 TCP报文段首部格式图 源端口与目的端口: 各占16位 序号:占32比特&#xff0c;取值范围0~232-1。当序号增加到最后一个时&#xff0c;下一个序号又回到0。用来指出本TCP报文段数据载…

ctfhub技能树_web_信息泄露

目录 二、信息泄露 2.1、目录遍历 2.2、Phpinfo 2.3、备份文件下载 2.3.1、网站源码 2.3.2、bak文件 2.3.3、vim缓存 2.3.4、.DS_Store 2.4、Git泄露 2.4.1、log 2.4.2、stash 2.4.3、index 2.5、SVN泄露 2.6、HG泄露 二、信息泄露 2.1、目录遍历 注&#xff1…

【ArcGIS Pro微课1000例】0050:如何清除坐标系信息

文章目录 一、目的二、方法1. 使用【定义投影】工具2. 清除数据的投影信息3. 删除坐标文件 一、目的 地理信息数据的坐标系是将地理信息数据进行融合、叠加、分析的重要数学框架&#xff0c;而其描述信息是非常重要的元数据&#xff0c;涉及整个国家的测绘坐标系统&#xff0c…

DSSS技术和OFDM技术

本内容为学习笔记&#xff0c;内容不一定正确&#xff0c;请多处参考进行理解 https://zhuanlan.zhihu.com/p/636853588 https://baike.baidu.com/item/OFDM/5790826?frge_ala https://zhuanlan.zhihu.com/p/515701960?utm_id0 一、 DSSS技术 信号替代&#xff1a;DSSS技术为…

C++ 操作MinIO做文件数据的上传和下载(踩坑与经验)包含编译包

前言 最近在做项目流程优化&#xff0c;准备将之前的java对文件的操作转换到c端&#xff0c;因此做了基于c的minio操作的测试demo。期间的各种踩坑与问题&#xff0c;花了一天时间总算是成功了&#xff0c;当然还有一些小问题&#xff0c;等待后续其他大拿解决。 项目环境 v…

Jmeter调用本地Exe程序

背景&#xff1a; 候使用C#编译的小工具制作压测的请求的入参&#xff0c;因Jmeter无法调用C#的方法&#xff0c;可以把C#编译个exe程序&#xff0c;在启动压测前&#xff0c;让JMeter调用本地的exe批量生成压测数据。 使用步骤&#xff1a; 打开Jmeter&#xff0c;右击选择…

【Vue】使用cmd命令创建vue项目

上一篇&#xff1a; node的安装与配置 https://blog.csdn.net/m0_67930426/article/details/134562278?spm1001.2014.3001.5502 目录 一.创建空文件夹专门存放vue项目 二. 查看node , npm 和vue脚手架的版本 三.安装vue脚手架 四.创建vue项目 五.运行项目 一.创建空文件…

第五期丨酷雷曼无人机技能培训圆满举办

第5期无人机技能提升培训 2023年11月28日-29日&#xff0c;为期2天的酷雷曼第五期无人机技能提升培训会圆满举办。本届培训会盛况依旧&#xff0c;数十位合作商不远千里相约&#xff0c;共同提升专业水准&#xff0c;考取执照证书。 入场签到 初冬已至&#xff0c;尽管天气渐…

properties出现中文乱码解决方法(万能)

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在使用Properties类的时候,中文出现乱码 如图所示: 正常思维来讲,估计是中文编码有问题,于是我将其改为UTF-8的编码方式 通过下方的改动: 可到了这一步,中文还是乱码(这一步改成功的网友可自动立场,没改成功的网…

PVE系列-LVM安装MacOS的各个版本及VNC加密隧道访问

PVE系列-LVM安装MacOS的各个版本 环境配置大概过程&#xff1a;详细步骤&#xff1a;1.建立安装环境和下载安装工具2. 重启后&#xff0c;执行osx-setup配置虚拟机3. 安装到硬盘&#xff0c;4.设定引导盘&#xff0c;以方便自动开机启动5.打开屏幕共享和系统VNC6.VNC加密的ssh隧…

synchronized底层原理(二)

书接上文 文章目录 1. 锁升级原理2. Synchronized锁优化1. 偏向锁批量重偏向&批量撤销2. 自旋优化3. 锁粗化4. 锁消除 1. 锁升级原理 前面介绍了对象的几种加锁状态&#xff0c;分别是无锁、偏向锁、轻量级锁和重量级锁。有下面几个关键点&#xff1a; 当开启JVM偏向延迟…

什么是美颜sdk?美颜sdk对比评测、技术评估

为了满足用户对于更美好画面的需求&#xff0c;各种美颜sdk应运而生。本文将深入探讨美颜sdk的概念&#xff0c;进行对比评测&#xff0c;并对其技术进行综合评估。 一、什么是美颜sdk&#xff1f; 美颜sdk使开发者们可以方便地在自己的应用中集成美颜功能&#xff0c;从而提…

【5】PyQt按钮

QPushButton 常见的按钮实现类包括:QPushButton、QRadioButton和QCheckBox QPushButton是最普通的按钮控件&#xff0c;可以响应一些用户的事件 from PyQt5.QtWidgets import QApplication, QWidget, QPushButton import sysdef func():print("按下按钮啦&#xff0c;火…

C语言每日一题(46)整数转罗马数字

力扣网12 整数转罗马数字 题目描述 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D …

Isaac Sim教程06 OmniGraph图编程

Isaac Sim OmniGraph图编程 版权信息 Copyright 2023 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. The autho…

Spring容器启动过程中的自定义操作插口汇总

目录标题 PostConstruct注解EventListener方式InitializingBean的afterPropertiesSet方法实现ApplicationRunner接口重写run方法实现AplicationContextAware接口重写setApplicationContext实现ServletContextListener接口contextInitialized方法实现ServletContextAware接口set…

7个简单技巧,让你从容应对压力面试!

01-什么是压力面试&#xff1f; 压力面试是指有意制造紧张&#xff0c;以了解求职者将如何面对工作压力的一种面试形式。 事实上&#xff0c;压力面试不是单独存在的一类面试&#xff0c;往往是穿插在面试过程中。 面试人通过提出不礼貌、冒犯的问题&#xff0c;或者用怀疑、…