Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析

2023-11-16

1. 定义

信号在频域能够呈现出时域不易发现的性质和规律,傅里叶变换是将信号从时域变换到频域,便于在频域对信号的特性进行分析。离散傅里叶变换 (DFT),是傅里叶变换在时域和频域上的离散呈现形式,通俗的说就是将经过采样的有限长度时域离散采样序列变换为等长度的频域离散采样序列,通过对变换得到的频域采样序列进行适当的换算和处理,可以得到信号的频谱(频率-幅值曲线和频率-相位曲线)。
离散傅里叶变换 (DFT)的定义为:

X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) e − j 2 π N n k X(k) = {\rm{DFT}}[x(n)] = \sum\limits_{n = 0}^{N - 1} {x(n){e^{ - j\frac{{2\pi }}{N}nk}}} X(k)=DFT[x(n)]=n=0N1x(n)ejN2πnk, 0 ≤ k ≤ N − 1 0 \le k \le N-1 0kN1

式中, x ( n ) x(n) x(n)为时域离散采样序列(通常为实数序列), N N N为时域离散采样序列 x ( n ) x(n) x(n)的长度, X ( k ) X(k) X(k)为频域离散采样序列(通常为复数序列)。

快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的一种快速算法,FFT的计算结果与DFT完全相同,但FFT相对于DFT减小了计算量、节约计算资源消耗,能够适应在线计算,因此实际DFT都是通过FFT算法来求得结果。

2. 变换和处理

Matlab软件自带fft函数实现快速傅里变换算法,但是光使用fft并不能直接得到信号的频谱,还需要解决以下问题,下图为DFT变换后的X(k)复数序列幅值、相位图。

DFT变换后的X(k)复数序列幅值、相位图

a) 幅值变换 X ( k ) X(k) X(k)序列的幅值大小与参与变换的时域序列x(n)长度N有关,变换后的幅值 ∣ X ( k ) ∣ |X(k)| X(k)需要乘以 2 / N 2/N 2/N得到真实幅值;
b) 有效频率区域 X ( k ) X(k) X(k)序列由两部分共轭复数序列组成(复数共轭表示幅值相等、相位相反),相当于只有一半的复数序列是独立有效的,这部分复数序列对应 0 − f s / 2 0 - f_s/2 0fs/2的频率区域( f s f_s fs为时域离散采样序列 x ( n ) x(n) x(n)的采样频率)。
c) 直流信号的处理:直流信号幅值(对应频率0Hz)为两部分共轭复数序列在频率0Hz处的加和,其真实幅值再乘以 2 / N 2/N 2/N后还需要再除以2得到真实的直流信号幅值。

3. 函数

初学的朋友若不理解上述变换和处理技巧,很难得到正确的频谱图。为此作者在fft函数的基础上,使用Matlab开发了函数DFT.m,通过函数来实现上述幅值变换、有效频率区域和直流信号的处理,能够直接分析出给定离散信号x(n)的幅值谱和相位谱,函数简单、易用、通用性好。

function [f,X_m,X_phi] = DFT(xn,ts,N,drawflag)
% [f,X_m,X_phi] = DFT(xn,ts,N,drawflag) 离散序列的快速傅里叶变换,时域转换为频域
% 输入  xn为离散序列 为向量  
%       ts为序列的采样时间/s
%       N为FFT变换的点数,默认为xn的长度  
%       drawflag为绘图标识位,取0时不绘图,其余非0值时绘图,默认为绘图
% 输出 f为频率向量
%      X_m为幅值向量
%      X_phi为相位向量,单位为°
% 注意计算出来的0频分量(直流分量应该除以2)  直流分量的符号应结合相位图来确定
% By ZFS@wust  2020
% 获取更多Matlab/Simulink原创资料和程序,清关注微信公众号:Matlab Fans

4. 实例演示

下面结合实例进行演示和分析。

例1:单频正弦信号(整数周期采样)

%% Eg 1 单频正弦信号
ts = 0.01;
t = 0:ts:1;
A = 1.5;       % 幅值  
f = 2;         % 频率
w = 2*pi*f;    % 角频率
phi = pi/3;    % 初始相位 
x = A*cos(w*t+phi);   % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

结果
在这里插入图片描述
在这里插入图片描述

正弦信号频率为2Hz,频谱分析频率为1.98Hz
正弦信号幅值为1.5,频谱分析幅值为1.495
正弦信号相位为60°,频谱分析相位为63.32°

例2:单频正弦信号(非整数周期采样)

%% Eg 2 单频正弦信号(非整数周期采样)
ts = 0.01;
t = 0:ts:1;
A = 1.5;       % 幅值  
f = 1.5;         % 频率
w = 2*pi*f;    % 角频率
phi = pi/3;    % 初始相位 
x = A*cos(w*t+phi);   % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

结果
在这里插入图片描述
在这里插入图片描述

正弦信号频率为1.5Hz,频谱分析频率为0.99Hz、1.98Hz
正弦信号幅值为1.5,频谱分析幅值为1.034、0.923
正弦信号相位为60°,频谱分析相位为160.93°、-33.76°

总结:DFT变换后频率序列的最小单位刻度为 f s / N f_s/N fs/N(此例为1Hz),非整数周期采样时关心信号的频率(此例为1.5Hz)不是频率分辨率 f s / N f_s/N fs/N的正整数倍,那这个频率成分信号会由前后两个正整数倍的频率成分信号(此例为1Hz和2Hz)的线性组合来替代,这就是频谱泄漏现象,非周期采样时某频率成分信号向两侧频率分辨率正整数倍的频点泄漏。实际频谱分析时并不清楚所关心的频率点精确值,避免此问题的一个解决方法是,取更多的点参加DFT,即时域序列 x ( n ) x(n) x(n)长度 N N N值取长一些,让频率分辨率 f s / N f_s/N fs/N很小,以减小频谱泄漏现象。

%% Eg 2 单频正弦信号(非整数周期采样)
ts = 0.01;
t = 0:ts:1;
A = 1.5;       % 幅值  
f = 1.5;         % 频率
w = 2*pi*f;    % 角频率
phi = pi/3;    % 初始相位 
x = A*cos(w*t+phi);   % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

结果:频谱泄漏情况大为改善,采样点继续增多时,频谱泄漏会进一步减小。
在这里插入图片描述
在这里插入图片描述

正弦信号频率为1.5Hz,频谱分析频率主要成分为1.46Hz、
正弦信号幅值为1.5,频谱分析频率主要成分对应幅值为1.41
正弦信号相位为60°,频谱分析频率主要成分对应相位为89.5°

例3:含有直流分量的单频正弦信号

%% Eg 3 含有直流分量的单频正弦信号
ts = 0.01;
t = 0:ts:1;
A = 1.5;       % 幅值  
f = 5;         % 频率
w = 2*pi*f;    % 角频率
phi = pi/6;    % 初始相位 
x = 0.5 + A*cos(w*t+phi);   % 时域信号,带有直流偏移0.5
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

结果
在这里插入图片描述
在这里插入图片描述

正弦信号频率为5Hz,频谱分析频率为4.95Hz
正弦信号幅值为1.5,频谱分析幅值为1.498
正弦信号相位为30°,频谱分析相位为38.66°
正弦信号直流分量0.5,频谱分析直流分量为0.51

例4:正弦复合信号

%% Eg 4 正弦复合信号
ts = 0.01;
t = 0:ts:2;
A = [1.5 1 0.5 0.2];    % 幅值  
f = [3 6 9 15];         % 频率
w = 2*pi*f;             % 角频率
phi = (1:4)*pi/4;       % 初始相位 
x = -0.5 + A(1)*cos(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + A(3)*cos(w(3)*t+phi(3)) + A(4)*cos(w(4)*t+phi(4));     % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

结果:
在这里插入图片描述
在这里插入图片描述

正弦信号频率为3、6、9、15Hz,频谱分析频率为2.985、5.97、8.96、14.93Hz
正弦信号幅值为1.5、1、0.5、0.2,频谱分析幅值为1.499、0.989、0.485、0.192
正弦信号相位为45°、90°、135°、180°,频谱分析相位为50.6°、101.5°、152.9°、210°
正弦信号直流分量-0.5,频谱分析直流分量为-0.497

注意:频率为0Hz时对应的直流信号的幅值的正负号,是通过零频相位来确定的,相位为0°表示幅值为正,相位为180°表示幅值为负。

例5:含有随机干扰的正弦信号

%% Eg 5 含有随机干扰的正弦信号
ts = 0.01;
t = 0:ts:2;
A = [1 0.5];    % 幅值  
f = [3 10];         % 频率
w = 2*pi*f;             % 角频率
phi = (1:2)*pi/3;       % 初始相位 
x =  A(1)*cos(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + 0.8*(rand(size(t))-0.5);     % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

结果:
在这里插入图片描述
在这里插入图片描述

正弦信号频率为3、10Hz,频谱分析频率为2.985、9.95Hz
正弦信号幅值为1、0.5,频谱分析幅值为0.978、0.456
正弦信号相位为60°、135°,频谱分析相位为65.1°、139.8°

例6:实际案例

load data
ts = 0.001;
x = Jsd;
t = [0:length(x)-1]*ts;
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

结果:
在这里插入图片描述
在这里插入图片描述

频谱分析主要频率成分为18.996、37.992Hz
频谱分析主要频率成分对应幅值为1.741、1.117

该项目为作者在强振环境下测得加速度信号,加速度是机械结构周期运动激励产生,需要通过频谱分析获取机械结构周期运动的频率。由于噪声幅度远大于有效信号幅度,信号的信噪比很低,从时域上很难辨别机械结构周期运动的频率。但经过DFT后,从频域上可以看出信号的主要频率成分为19Hz和其倍频38Hz,可以判断机械结构周期运动的频率为19Hz,38Hz为结构响应的非线性特性所产生的倍频。

5. 拓展

工程上我们还会遇到这样的问题:获取了信号的频谱,希望从信号的频谱来恢复时域信号。这就涉及离散傅里叶逆变换问题,下一篇详谈。

6. 联系作者

有Matlab/Simulink方面的技术问题,欢迎发送邮件至944077462@qq.com讨论。
更多Matlab/Simulink原创资料,欢迎关注微信公众号:Matlab Fans

源程序下载:
1. csdn资源: Matlab如何进行离散傅里叶变换DFT(快速傅里叶变换FFT)进行频谱分析
2. 扫码关注微信公众号Matlab Fans,回复BK07获取百度网盘下载链接。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析 的相关文章

  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • Enthought Python 中的线程 FFT

    Numpy SciPy 中的快速傅立叶变换 FFT 不是线程化的 Enthought Python 附带 Intel MKL 数值库 该库能够进行线程 FFT 如何获得这些例程 以下代码适用于 Windows 7 Ultimate 64 位
  • 如何检测图像中对象的实例?

    我有一张包含几个特定对象的图像 我想检测这些物体在该图像中的位置 为此 我有一些模型图像 其中包含我想要检测的对象 这些图像在我想要检测的对象实例周围得到了很好的裁剪 这是一个例子 在这张大图里 我想检测此模型图像中表示的对象 自从你最初发
  • MATLAB 在 MATLAB 7.10.0 学生版中似乎找不到 csaps()

    我有一些代码使用csaps Matlab的三次平滑样条拟合函数 http www mathworks com help toolbox curvefit csaps html我想将其提供给使用 MATLAB 7 10 0 R2010a 的学
  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • 在 MATLAB 中将数据拟合到 B 样条

    我正在尝试估计矩阵形式的时间序列数据中的缺失值 列代表时间点 即现在 我想将矩阵的每一行拟合到 B 样条曲线 并用它来估计缺失值 我可以使用 MATLAB 将数据拟合到普通样条曲线 但我完全陷入尝试找出如何拟合数据以创建 B 样条曲线的困境
  • 白色像素簇提取

    我正在研究指纹毛孔提取项目 并陷入毛孔 白色像素簇 提取的最后阶段 我有两个输出图像 我们可以从中获取毛孔 但不知道该怎么做 这两个图像的尺寸不同 image1 的尺寸为 240 320 image2 的尺寸为 230 310 这是我的图像
  • 如何以编程方式指定 MATLAB 编辑器键绑定

    我想将键盘键绑定设置为Windows 默认设置我想在启动时使用startup m因为我希望在大量系统上设置此设置 首选项对话框中的等效设置是 MATLAB gt Keyboard gt Shortcuts gt Active Setting
  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • 傅里叶变换定理 matlab

    我目前正在尝试理解二维傅里叶位移定理 根据我到目前为止所了解到的情况 图像空间中的平移会导致相位差异 但不会导致频率空间中的幅度差异 我试图用一个小例子来演示这一点 但它只适用于行的移位 而不适用于列的移位 这是一个小演示 我只在这里显示幅
  • MATLAB 图中轴标签与轴之间的距离

    我正在使用 MATLAB 绘制一些数据 我想调整轴标签与轴本身之间的距离 但是 只需向标签的 位置 属性添加一点即可使标签移出图窗窗口 是否有 保证金 属性或类似的东西 在上图中 我想增加数字和标签 Time s 之间的距离 同时自动扩展数
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 定义自定义 Mupad 程序的一般相对搜索路径

    假设我有一个 mupad 笔记本myMupadNotebook mn在路径上 C projectFolder ABC abc 它调用程序MyMupadProcedure mu它位于 C DEF GHI 现在我有一个 Matlab 脚本mai
  • 如何加载具有可变文件名的 .mat 文件?

    select all mat files oar dir oar mat n oar name loop through files for l 1 length oar load pat oar l lt this is the mat
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help

随机推荐

  • 基于Raft协议的两节点主备系统调度算法

    摘要 以城市轨道交通列车指挥调度系统为代表的工业系统受限于工程成本 在运营现场往往仅部署两个服务节点 指挥调度中心因故障离线后 若采用主流的分布式一致性协议保证运营现场节点间数据一致性 将因为降低了可用性而无法容忍节点发生故障 为解决此问题
  • 计算机网络笔记(二)

    计算机网络体系结构 OSI参考模型 数据封装 增加控制信息 构造协议数据单元 PDU 控制信息主要包括 地址 Address 标识发送端 接收端 差错检测编码 Error detecting code 用于差错检测或纠正 协议控制 Prot
  • jsp、servlet、javabean中如何分别设置session的过期时间

    session的概念与基本用法 概念 当用户与服务器连接时 服务器给每个用户一个session 并设定其中内容 这些session相互独立 服务器可以借此来辨别用户信息 进而提供个别服务 session有存在期限 类 javax servl
  • 前端新人进入公司工作流程 超详细!!! 不被当小白

    出来上班除了些人情世故 基本的工作流程还是需要了解的 会避免很多的小麻烦 也不会被别人说是小白 进入公司之后首先熟悉的就是位置 通常产品开发部标配都是组长 前端前辈 后端 测试 UI 产品经理 等其他人员 如果有前辈带你那会更好 很多任务前
  • JWT渗透与攻防(二)

    目录 前言 JWT漏洞演示之CTFhub 一 JWT漏洞演示之CTFhub 二 前言 我们在之前的文章中已经讲解过了JWT漏洞相关的原理和利用 今天我们就通过这篇文章再来了解一下JWT的漏洞 JWT漏洞演示之CTFhub 一 我们进入CTF
  • 用gitmoji在git commit message 添加有意思的表情

    文章目录 用gitmoji在git commit message 添加有意思的表情 用gitmoji在git commit message 添加有意思的表情 用gitmoji 在commit message 添加有意思的表情 让提交代码更有
  • l2tp软件_反向L2TP拨号,接入公司网络

    2019肺炎还没有结束 今天第一天远程复工 前几天介绍了一个全局连回公司网络的方案 但有人私信我 公司没有为了临时办公搭建VPN的准备 大多公司的临时解决方案是用TeamViewer类软件来实现远程连接方案 这类方案基本都不是直连状态 都是
  • RS485通信以及modbus通信协议

    硬件层 rs485解决的是数据传输的问题 如何将0 1 传输到另一端 主机或从机将TTL电平通过485芯片转换成差分信号 抗干扰能力强 传输距离远 485芯片中集成了发送器和接收器 连接单片机io引脚通过高低电平来决定是发送方 还是 接收方
  • “QT 快速上手指南“ 之 计算器(三)信号与槽,connect 函数,QString

    文章目录 前言 一 什么是信号与槽 二 QObject connect 函数 三 QT 中的字符串类 QString 1 创建和初始化字符串 2 字符串的拼接和添加 3 字符串的查找和替换 4 字符串的分割和处理 总结 前言 QT 中 信号
  • 十五个AI图像放大工具

    1 VanceAI Image Enlarger VanceAI Image Enlarger 最大 8x VanceAI Anime Upscaler 动漫图片 最大 16x 2 icons8 Upscaler icons8 Upscal
  • 以太坊创世区块源码分析

    genesis 是创世区块的意思 一个区块链就是从同一个创世区块开始 通过规则形成的 不同的网络有不同的创世区块 主网络和测试网路的创世区块是不同的 这个模块根据传入的genesis的初始值和database 来设置genesis的状态 如
  • mysql callablestatement_mysql jdbc性能优化之mybatis/callablestatement调用存储过程mysql jdbc产生不必要的元数据查询(已解决,cpu负...

    INFO jvm 1 2016 08 25 15 17 01 16 08 25 15 17 01 DEBUG pool 1 thread 371dao ITaskDao callProcedure gt Preparing call sp
  • 开源汇智创未来

    7月27日 2022开放原子全球开源峰会OpenAtom openEuler分论坛在北京成功举办 论坛以 openEuler志高远 开源汇智创未来 为主题 为业界充分展示 openEuler 开源项目的运作成果 传递开源开放的 openEu
  • 微软 Github AI 编程工具 Copilot 正式上线,学生免费使用

    2022年6月22日 微软 GitHub AI 编程工具 Copilot 在经过了近一年测试后 已正式上线 定价每月 10 美元 约 66 9 元人民币 或每年 100 美元 约 669 元人民币 对学生用户和流行开源项目的维护者免费提供
  • ActiveMQ学习总结

    最近用到ActiveMQ 网上找资料学习了一下 收录比较好的博文 cpp代码客户端案例 高级原理 基础原理 完整客户端例子
  • jupyter notebook 打开指定路径文件

    输入 jupyter notebook 目标文件夹路径 如 jupyter notebook D IT python JupyterNotebook
  • 平均月薪超2万,全球短缺的网络安全人才究竟有多抢手?

    平均月薪超2万 全球短缺的网络安全人才究竟有多抢手 没有网络安全就没有国家安全 随着互联网科技 经济社会 政治时局等多领域不断发展与变革 网络安全问题日趋严峻 信息作为无形的战场 扫码支付涉及到财产安全 自动驾驶涉及到国家地理信息以及每个人
  • 在失去焦点的时候ajax,文本框失去焦点的时候进行ajax 验证

    var Email mail val ajax开始 ajax type Post 请求形式 url Ajax LoginRegister ashx 处理文件路径 data op 2 判断调用处理文件中的那个方法 Email Email 需要
  • pandas相似度计算

    import pandas as pd 加载数据 detail pd read excel meal order detail xlsx 展示detail print detail 求取相似度 res detail amounts coun
  • Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析

    文章目录 1 定义 2 变换和处理 3 函数 4 实例演示 例1 单频正弦信号 整数周期采样 例2 单频正弦信号 非整数周期采样 例3 含有直流分量的单频正弦信号 例4 正弦复合信号 例5 含有随机干扰的正弦信号 例6 实际案例 5 拓展