数字信号处理——频谱分析
数字信号处理——频谱分析
频谱分析
频谱分析是一种将复杂信号分解为较简单信号的技术。许多物理信号均可以表示为许多不同频率简单信号的和。找出一个信号在不同频率下的信息(如振幅、功率、强度或相位等)的做法即为频谱分析。
频谱
频谱是指一个时域的信号在频域下的表示方式,可以针对信号进行傅里叶变换而得,所得的结果会是以分别以幅度及相位为纵轴,频率为横轴的两张图,不过有时也会省略相位的信息,只有不同频率下对应幅度的资料。有时也以“幅度频谱”表示幅度随频率变化的情形,“相位频谱”表示相位随频率变化的情形。
简单来说,频谱可以表示一个信号是由哪些频率的弦波所组成,也可以看出各频率弦波的大小及相位等信息。
信号若随着时间变化,且可以用幅度来表示,都有其对应的频谱。包括可见光(颜色)、音乐、无线电波、振动等都有这様的性质。当这些物理现象用频谱表示时,可以提供一些此信号产生原因的相关信息。例如针对一个仪器的振动,可以借由其振动信号频谱的频率成分,推测振动是由哪些元件所造成。
频谱分析
频谱分析是一种将复杂信号分解为较简单信号的技术。许多物理信号均可以表示为许多不同频率简单信号的和。找出一个信号在不同频率下的信息(可能是幅度、功率、强度或相位等)的作法就是频谱分析。
频谱分析可以对整个信号进行。不过有时也会将信号分割成几段,再针对各段的信号进行频谱分析。周期函数(例如:sin(t))最适合只考虑一个周期的信号来进行频谱分析。傅里叶分析中有许多分析非周期函数时需要的数学工具。
一个函数的傅里叶变换包括了原始信号中的所有信息,只是表示的型式不同。因此可以用反傅里叶变换重组原始的信号。若要完整的重组原始信号,需要有每个频率下的幅度及其相位,这些信息可以用二维向量、复数、或是极座标下的大小及角度来表示。在信号处理中常常考虑幅度的平方,也就是功率,所得的就是功率谱密度。
实际上,大部分的仪器及软件都用快速傅里叶变换来产生频谱的信号。快速傅里叶变换是一种针对采样信号计算离散傅里叶变换的数学工具,可以近似傅里叶变换的结果。
随机性信号(或噪声)的傅里叶变换也是随机性的。需要利用一些取平均值的方式来得到其频率分布(frequency distribution)。一般来说会将资料依一定的时间分段,将各段资料进行傅里叶变换,再将变换后的幅度或幅度平方(幅度平方较常用)平均,以得到傅里叶变换的平均值。在处理取様的时域资料时,常用上述的作法,配合离散傅里叶变换来处理,这种处理方式称为Welch法(Welch's method)。若所得的频谱是平的,此信号会视为“白噪声”,不过许多信号在时域下看似噪声,却可以借由这样的处理方式得到一些频域的信息。
离散傅里叶变换
离散傅里叶变换(DFT)是傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在频域的采样。在实际应用中通常采用快速傅里叶变换(FFT)以高效计算DFT。
DFT的定义为:

其中,N为DFT的点数,点数越大频率分辨率越高,k=0,1,2,…,N-1。
离散傅里叶变换可以看做是离散时域信号与不同频率的离散正弦信号进行相关运算得到相应的频率对应的幅值(复数)。
Matlab 代码:
clc
clear
close allN = 2048;% ADC采样点数
Fs = 1e6;% ADC采样率
t = (0:N-1)/Fs;% 采样时间序列F1 = 60e3;% 信号频率1
F2 = 80e3;% 信号频率2
signal = cos(2*pi*F1 * t) + cos(2*pi*F2 * t);figure;
plot(t,signal);
axis([0 inf -2.2 2.2]);
xlabel('时间/s');
title('时域信号');% FFT
NN = 2048;% NN点DFT
XN = fft(signal,NN)/NN;% 计算signal的NN点快速傅里叶变换
f0 = Fs/NN; % 频率分辨率
f = (0:NN-1)*f0; % 频率序列(模拟频率)
fk = (0:NN-1); % 谱线序列
A = abs(XN); % 幅值序列
Phase = atan(-real(XN)./imag(XN))/pi*180; % 相位序列figure;
subplot(2,1,1);
plot(f(1:NN/2),A(1:NN/2));
xlabel('频率/Hz');ylabel('幅度');
% axis([50e3 90e3 0 inf]);
title('FFT幅频谱');
subplot(2,1,2);
plot(f(1:NN/2),Phase(1:NN/2));
xlabel('频率/Hz');ylabel('相位/°');
title('FFT相频谱');figure;
subplot(2,1,1);
plot(f(1:NN/2),real(XN(1:NN/2)));
xlabel('频率/Hz');
title('频谱实部');
subplot(2,1,2);
plot(f(1:NN/2),imag(XN(1:NN/2)));
xlabel('频率/Hz');
title('频谱虚部');



结论:
结论:对实信号做N点DFT,我们只需要看前N/2根谱线就行了,不用关注N/2~N-1之间的。
离散傅里叶变换的应用之一:用FFT分析信号频谱
题目如下:
例:对模拟信号xa(t)=cos(2*pi*t)进行抽样,抽样频率为 fs=5Hz,加矩形窗截取10点长,做N点DFT得到X(k)的图形。
(1)N=10
(2)N=20
(3)N=128
解题关键:
1、分清"截取数据长度"(即窗函数长度)与"DFT点数"二者的不同;
2、能够根据模拟频率推断出DFT谱峰处对应的序号k的数值,方法如下:
- 首先,由模拟频率转换为数字域频率:模拟频率f(单位Hz)与数字域w的对应关系为:w=2*pi*f/fs,其中,fs(单位Hz)为采样频率。
- 然后,数字域频率对应到DFT的序号k,数字域频率w 与DFT中的序号k的对应关系为:w=2*pi*k/N,其中,N为DFT点数。
- 所以,模拟频率f(单位Hz)与DFT中的序号k的对应关系为:k=N*f/fs,其中,fs(单位Hz)为采样频率,N为DFT点数。
- 模拟频率:f = k*fs/N,单位Hz。
clc; clear; close all;
f0 = 1;
fs = 5;% 取样频率 fs=5Hzn = 0:1000;
L = 10;
xn = cos(2*pi*f0*n/fs);% 时域离散时间信号
xk1 = fft(xn(1:L), 10);% 返回 n 点 DFT。如果未指定任何值,则 Y 的大小与 X 相同。
xk2 = fft(xn(1:L), 20);
xk3 = fft(xn(1:L), 128);
xk4 = fft(xn(1:128), 128);subplot(311);
stem((0:length(xk1)-1), abs(xk1));
title('10点DFT');
subplot(312);
stem((0:length(xk2)-1), abs(xk2));
title('20点DFT');
subplot(313);
stem((0:length(xk3)-1), abs(xk3));
title('128点DFT');figure
subplot(211);
stem((0:length(xk4)-1), abs(xk4));
title('截取128点长,做128点DFT');
subplot(212);
plot((0:length(xk4)/2-1)*fs/128, abs(xk4(1:length(xk4)/2)));
title('截取128点长,做128点DFT');
xlabel('Hz'); ylabel('幅度');


下面分析一下:
首先看N=10时,此时的结果看似最为干净清爽,只有干干净净两根线。但有的同学要问了,单频信号,只有一个频率成分,应该只有一根谱线呀?为什么会有两根?
我们先看第一根,k=2 那个谱线,对应频率为 f = 2*fs/10 = 2*5/10 = 1Hz,与题设 cos(2*pi*t) 完全吻合。k=8 那根谱线是怎么一回事呢?是负频率周期延拓过去的,本来在-2,-2+10就等于8了。所以,(敲黑板,以下结论很重要)
对实信号做N点DFT,我们只需要看前N/2根谱线就行了,不用关注N/2~N-1之间的。
再看 N=20 和 N=128 的DFT结果,怎么出来那么多根谱线呢?
回过头去看一看,做DFT之前的截取L点长的序列 cos(2*pi*n/5) 的频谱到底是什么样子呢?如下图中的虚线所示。

而 N 点DFT,是对V(e^jw)在 [0,2*pi] 区间抽取N个点。相当于把连续的频谱图(V(e^jw),用一张不透明的纸盖住,纸上以 2*pi/N 为间隔开了一些缝,露出来的点才是我们得到的DFT的结果。这就是频域抽样产生的“栅栏效应”。
所以,不管是10点DFT干干净净的两根线,还是128点DFT密密麻麻的那么多根线,背后隐藏的,都是连续的频谱函数。之所以10点DFT的结果看起来更顺眼,无非是因为 2*pi/N 也恰好是旁瓣的宽度(因为信号的周期和截取长度也是10)
在DFT谱分析中,当DFT 点数 N 大于数据本身的实际点数 L 时,相当于在数据后面补上了L-N个0再做DFT,称为"补零DFT"。补零经常是必要的,补零相当于对信号频谱以更小的间隔采样,得到更多的频谱的信息。而且有时数据长度不是2的整数次幂,如果我们想采用基2FFT算法,就必须进行补零。
是不是这样呢?当然了,如果你知道这个周期信号的周期是多少,毫无疑问,就截取一个周期的数据,做同样点数的DFT,结果最好看。但在分析实际问题时,要么信号根本没有周期性;要么虽然有周期性,但你不知道;而且实际信号也不会是简单的单频信号,会包含多个频率分量。这个时候,在系统性能、实时性、存储量等等容许的范围内,截取尽量长的数据(即获取更多的信息,得到更高的频率分辨率),做尽量多点数的DFT(即对频谱进行更为精细的采样)。
而且,实际应用中,由于DFT的点数一般都比较大,我们一般不会以离散的形式画频谱图,而是直接将频谱图化成连续的曲线。例如,上例中,我们截取128点长的数据,做128点DFT,用连续曲线形式画图(matlab中为plot函数),并且只画出前一半(即0~N/2-1)的点,并且把横轴直接转换为Hz,如下图所示:

上图中,横轴单位为:Hz。采用如下公式,将序号k转换为模拟频率Hz:

DFT分析信号频谱,是实际中应用最广泛的数字信号处理算法,还有很多种题目可以出。还是那句话,题目无穷无尽,而原理就那么多,大家只有掌握了其真正含义,才能以不变应万变。
相关文章:
数字信号处理——频谱分析
数字信号处理——频谱分析 频谱分析 频谱分析是一种将复杂信号分解为较简单信号的技术。许多物理信号均可以表示为许多不同频率简单信号的和。找出一个信号在不同频率下的信息(如振幅、功率、强度或相位等)的做法即为频谱分析。 频谱 频谱是指一个时域…...
[软件工程] 架构映射战略设计方案模板
3 系统上下文 结合全局分析阶段获得的价值需求(利益相关者、系统愿景、系统范围)确定系统上下文,体现用户、目标系统与伴生系统之间的关系。 3.1 概述 绘制系统上下文图,明确解空间的系统边界。 3.2 系统协作业务流程1…n 根据全局…...
Springboot MongoDB 事务
目录 1. 事务和TransactionTemplate 2. 事务和MongoTransactionManager 3. 响应式事务 4. 事务和TransactionalOperator 5. 事务和ReactiveMongoTransactionManager 6. 事务内部的特殊行为 从版本4开始,MongoDB支持 事务。事务是建立在 会话之上的,…...
SAP自建表日志
文章目录 1.在表里加上日志记录字段1.1 加入日志结构1.2 在代码中调用记录日志通用函数1.3 在SM30里面记录日志1.4 缺点1.5 优点 2.表技术设置-日志数据更改2.1 RZ10或者RZ11修改系统参数2.2 设置表的属性2.3 查询日志2.4 缺点2.5 优点 3 SCDO文档对象3.1 勾选相应字段-数据元素…...
ansible-kubeadm在线安装单masterk8s v1.19-v1.20版本
ansible可以安装的KS8版本如下: [rootk8s-master01 ~]# yum list kubectl --showduplicates | sort -r kubectl.x86_64 1.20.0-0 kubernetes kubectl.x86_64 1.20.0-0 …...
mongodb docker 及常用命令
MongoDB属于非关系型数据库,它是由C编写的分布式文档数据库。内部使用类似于Json的bson二进制格式。 中文手册 https://www.w3cschool.cn/mongodb/ 安装 https://www.mongodb.com/try/download/community 二进制安装可见另一篇: centos7 mongodb 4.0.28…...
最新版本mac版Idea 激活Jerbel实现热部署
1.环境准备 1.安装docker desktop 客户端创建本地服务 2.创建guid 3.随便准备一个正确格式的邮箱 2.具体操作 1.通过提供的镜像直接搭建本地服务 docker pull qierkang/golang-reverseproxy docker run -d -p 8888:8888 qierkang/golang-reverseproxy2.guid 通过如下网址直…...
基于Ubuntu22.04部署bcache模式ceph
作者:吴业亮 博客:wuyeliang.blog.csdn.net 将Bcache集成到Ceph OSD后端可以带来一些优点和潜在的缺点。以下是它们的一些方面: 优点: 提高性能:BCache作为SSD缓存设备,可以提供更快的数据读取和写入速度…...
根据URL批量下载文件并压缩成zip文件
根据url批量下载图片或者视频,只需要将图片的url和名称放到数组对象即可,例如: let fileArr [{fvUrl:https://image.xuboren.com/image/2023/07/26/1410829074764cdbaa4314a084eb749e.jpg,fvName: 图片名称},{fvUrl:https://image.xuboren.…...
机器学习笔记之优化算法(六)线搜索方法(步长角度;非精确搜索;Glodstein Condition)
机器学习笔记之优化算法——线搜索方法[步长角度,非精确搜索,Glodstein Condition] 引言回顾: Armijo Condition \text{Armijo Condition} Armijo Condition关于 Armijo Condition \text{Armijo Condition} Armijo Condition的弊端 Glodstein…...
Ant Design Pro 封装网络请求
可以直接在antdPro项目的app.tsx文件中对request进行运行时配置,并且该配置会直接透传到umi-request的全局配置。后续直接从umi中引入request或者useRequest直接使用,可以说是非常方便。文档可查看:umi.js 具体配置代码: import…...
命令模式——请求发送者与接收者解耦
1、简介 1.1、概述 在软件开发中,经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个。此时,特别希望能够以一种松耦合的方式来设计软件&a…...
css 利用模糊属性 制作水滴
<style>.box {background-color: #111;height: 100vh;display: flex;justify-content: center;align-items: center;/* 对比度*/filter: contrast(20);}.drop {width: 150px;height: 159px;border-radius: 50%;background-color: #fff;position: absolute;/* 模糊 */filt…...
怎么才能提升自己工作能力?
表现最好的员工通常是获得加薪和工作晋升的人。您可以采取某些措施来提高您的工作绩效,并帮助您的主管将您视为他们最好的员工之一。在本文中,我们列出了 12 个技巧,可以立即提高您的工作绩效。 什么是工作绩效? 工作绩效是指您…...
Android Framework 之 Zygote
Android Zygote Android Zygote 是 Android 操作系统中一个关键的系统服务,它在系统启动时加载,为应用程序的运行提供了一种快速且资源高效的方式。 Zygote 的主要作用如下: 预加载共享库和类:Zygote 启动时,会预先加…...
二叉树的中序遍历 LeetCode热题100
题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 思路 递归,按左中右的顺序添加节点。 利用栈先进后出的特性模拟递归。 代码 /**递归写法* Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left…...
IOS + Appium自动化教程
前言 项目闲置下来了,终于抽空有时间搞自动化了,看了下网上的教程基本通篇都是android自动化的介绍 ,ios自动化方面的内容网上简介的少之可怜。由于本人对ios自动化也是第一次做,甚至对苹果电脑的使用都不太熟悉,花了大…...
100个精选Python实战项目案例,在线无偿分享
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中。 为什么这么多人学 Python ? 我要喊出那句话了:“人生苦短,我用 Python!”, 正是…...
JSON语法
目录 一、JSON 语法规则 二、JSON 的两种结构: 三、JSON 名称/值对 JSON 值 JSON 数字 JSON 对象 JSON 数组 JSON 布尔值 JSON null 四、JSON 使用 JavaScript 语法 JSON 语法是 JavaScript 语法的子集。 一、JSON 语法规则 JSON 语法是 JavaScript 对象…...
PostMan+Jmeter+QTP工具介绍及安装
目录 一、PostMan介绍编辑 二、下载安装 三、Postman与Jmeter的区别 一、开发语言区别: 二、使用范围区别: 三、使用区别: 四、Jmeter安装 附一个详细的Jmeter按照新手使用教程,感谢作者,亲测有效。 五、Jme…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
