Matlab实现FFT变换
Matlab实现FFT变换
文章目录
- Matlab实现FFT变换
- 原理
- 实现
- 手算验证
- 简单fft变换和频谱
- 求取功率谱
- 结论
在信号处理中,快速傅里叶变换(FFT)是一种非常常见的频域分析方法。本文将介绍如何使用Matlab实现FFT变换,并通过Matlab代码演示实际输出结果。
原理
FFT是一种计算离散傅里叶变换(DFT)的快速算法。DFT将时域上的信号转换为频域上的信号,可以用以下公式表示:
Xk=∑n=0N−1xne−i2πkn/NX_k=\sum_{n=0}^{N-1}x_n e^{-i2\pi kn/N}Xk=n=0∑N−1xne−i2πkn/N
其中,xnx_nxn是时域上的信号序列,XkX_kXk是频域上的信号序列,kkk为频率编号(0≤k<N0\leq k < N0≤k<N),NNN为信号长度。
FFT算法通过分治策略将DFT算法的计算复杂度从O(N2)O(N^2)O(N2)降低到O(Nlog2N)O(Nlog_2N)O(Nlog2N),从而实现了在计算机上快速计算DFT的目的。
实现
手算验证
在这里,我们将给出一个简单的例子来说明如何使用Matlab进行FFT变换。我们首先生成一个简单的数组:
x = [1, 2, 3, 4, 5, 6, 7, 8];
接下来,我们使用Matlab内置的fft函数对这个数组进行FFT变换:
X = fft(x);
这个操作会返回一个和输入数组长度相同的复数数组。我们可以使用Matlab的disp函数打印出这个数组:
disp(X);
这个例子的输出结果如下:
36.0000 + 0.0000i-4.0000 + 9.6569i-4.0000 + 4.0000i-4.0000 + 1.6569i-4.0000 + 0.0000i-4.0000 - 1.6569i-4.0000 - 4.0000i-4.0000 - 9.6569i
可以看到,输出结果是一个长度为8的复数数组。
为了验证FFT的正确性,我们可以手动计算这个输入数组的FFT结果,然后将结果与Matlab计算的结果进行比较。FFT算法的计算过程可以用以下公式表示:
Xk=∑n=0N−1xne−i2πkn/NX_k=\sum_{n=0}^{N-1}x_n e^{-i2\pi kn/N}Xk=n=0∑N−1xne−i2πkn/N
其中,xnx_nxn是时域上的信号序列,XkX_kXk是频域上的信号序列,kkk为频率编号(0≤k<N0\leq k < N0≤k<N),NNN为信号长度。
对于输入数组x=[1,2,3,4,5,6,7,8]x=[1,2,3,4,5,6,7,8]x=[1,2,3,4,5,6,7,8],我们有N=8N=8N=8。因此,X0X_0X0的计算公式为:
X0=∑n=07xne−i2π0n/8=36X_0 = \sum_{n=0}^{7}x_n e^{-i2\pi 0n/8}=36X0=n=0∑7xne−i2π0n/8=36
接下来,我们可以计算X1X_1X1:
X1=∑n=07xne−i2π1n/8=−4+9.6569iX_1 = \sum_{n=0}^{7}x_n e^{-i2\pi 1n/8}=-4+9.6569iX1=n=0∑7xne−i2π1n/8=−4+9.6569i
以此类推,我们可以计算出所有的XkX_kXk。最终结果应该与Matlab计算的结果一致。
简单fft变换和频谱
以下是一个简单的Matlab代码实现FFT变换:
% 生成测试信号
Fs = 1000; % 采样频率
t = 0:1/Fs:1-1/Fs; % 时间向量
x = 1*sin(2*pi*100*t); % 信号% 绘制信号图
subplot(2,1,1);
plot(t,x);
title('信号');
xlabel('时间 (s)');
ylabel('幅度');% 计算FFT
N = length(x);
X = fft(x);
f = Fs*(0:(N/2))/N;% 绘制FFT图
subplot(2,1,2);
plot(f,abs(X(1:N/2+1)));
title('FFT');
xlabel('频率 (Hz)');
ylabel('幅度');

在这个例子中,我们生成了一个频率为100Hz的正弦信号。我们使用Matlab的fft函数计算FFT,并将结果绘制成幅度谱。注意,在绘制幅度谱时,我们只绘制了频率为正的一半,因为FFT算法输出的结果是对称的。
求取功率谱
通过FFT变换可以得到信号的幅度谱,但是为了更好地了解信号特性,我们通常需要求取信号的功率谱密度。功率谱密度描述了信号在不同频率下的功率分布情况。
求取功率谱的方法是,将信号进行FFT变换后,将每个频率上的幅度平方除以信号长度,并乘以一个系数,即可得到功率谱密度。具体公式如下:
Pk=2∣Xk∣2NP_k=\frac{2|X_k|^2}{N}Pk=N2∣Xk∣2
其中,PkP_kPk是频率为kkk的功率谱密度,XkX_kXk是频率为kkk的信号幅度,NNN是信号长度。
以下是一个简单的Matlab代码实现求取功率谱:
% 生成测试信号
Fs = 1000; % 采样频率
t = 0:1/Fs:1-1/Fs; % 时间向量
x = 1*sin(2*pi*100*t); % 信号% 绘制信号图
subplot(2,1,1);
plot(t,x);
title('信号');
xlabel('时间 (s)');
ylabel('幅度');% 计算FFT
N = length(x);
X = fft(x);
f = Fs*(0:(N/2))/N;% 计算功率谱
P = (2*abs(X(1:N/2+1)).^2)/N;% 绘制功率谱图
subplot(2,1,2);
plot(f,P);
title('功率谱密度');
xlabel('频率 (Hz)');
ylabel('功率');

注意,我们在计算功率谱时,使用了一个系数222,这是因为我们只绘制了频率为正的一半,而实际上信号的功率谱是对称的。
结论
本文介绍了如何使用Matlab实现FFT变换,并求取信号的功率谱密度。通过FFT变换,我们可以将信号从时域转换到频域,进一步了解信号的特性。
相关文章:
Matlab实现FFT变换
Matlab实现FFT变换 文章目录Matlab实现FFT变换原理实现手算验证简单fft变换和频谱求取功率谱结论在信号处理中,快速傅里叶变换(FFT)是一种非常常见的频域分析方法。本文将介绍如何使用Matlab实现FFT变换,并通过Matlab代码演示实际…...
JVM调优面试题——垃圾回收专题
文章目录1、如何确定一个对象是垃圾?1.1、引用计数法1.2、可达性分析2、对象被判定为不可达对象之后就“死”了吗?3、都有哪些垃圾收集算法?3.1、 标记-清除(Mark-Sweep)3.2、标记-复制(Mark-Copying)3.3、标记-整理(Mark-Compact)3.4、分代收…...
java启动命令中-D和--的区别
目录一、java -D 添加参数二、java -- 添加参数在 SpringBoot 项目中,启动时,通过 -D 或 -- 添加参数,都可以直接覆盖 yml 或 properties 配置文件中的同名配置,如果不存在则相当于添加了一个配置。 一、java -D 添加参数 java -D…...
QML Popup详解
1.简介 弹出式用户界面控件,它可以与Window或ApplicationWindow一起使用,默认不可见。 常用属性介绍,一些公用的基础属性就不作介绍,可以查看我前面写的文章。 closePolicy : enumeration :此属性决定弹出窗口关闭的…...
[2.1.6]进程管理——线程的实现方式和多线程模型
文章目录第二章 进程管理线程的实现方式和多线程模型一、线程的实现方式(一)用户级线程(二)内核级线程二、多线程模型(一)一对一模型(二)多对一模型(三)多对多…...
小白做什么兼职项目赚钱?宝妈拍短视频赚钱的方法
很多宝妈在家带孩子之余想做兼职赚点小钱,依靠互联网无疑是比较方便的途径,在刷单、微商等网上兼职成为过去式以后,很多宝妈选择了短视频创业。 宝妈怎么拍短视频? 宝妈因为要照顾宝宝还要兼顾家务,空闲的时间比较琐碎…...
第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解
文章目录 一、填空题 1、1 找最小全字母十六进制数 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 给列命名 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 日期相等 1、3、1 题目描述 1、3、2 题解关键思路与解答 1、4 乘积方案数 1、4、1 题目描述 1、4、2 题解关…...
Linux中断操作
一、thread_irq在内核中, 除了可以通过request_irq() 、 devm_request_irq()申请中断以外, 还可以通过以下二个函数申请( 它们比request_irq和devm_request_irq多了一个参数thread_fn)。 用这两个API申请中断的时候, 内核会为相应的中断号分配…...
看看CabloyJS是如何异步加载并执行go wasm模块的
介绍 CabloyJS提供了一个内置模块a-wasmgo,将go wasm模块的异步加载运行机制进行了封装,使我们可以非常方便的在CabloyJS项目中引入go wasm,从而支持更多的业务场景开发 下面,我们以测试模块test-party为例,演示引入…...
嵌入式C语言九大数据结构操作方式详解
在C语言的开发过程中,灵活使用数据结构,对提高编程效率有极大的帮助。 目录 1 数组 2 链表 3 跳表 4 栈 5 队列 6 树 7 堆 8 散列表 9 图 10 总结 数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据…...
【C++学习】栈 | 队列 | 优先级队列 | 反向迭代器
🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 栈 | 队列 | 优先级队列 | 反向迭代器😼容器适配器🙈什么是适配器ὤ…...
Python—看我分析下已经退市的 可转债 都有什么特点
分析 需求分析 可转债退市原因的种类与占比是多少 强赎与非强赎导致的退市可转债 存续时间 维度占比 强赎与非强赎导致的退市可转债 发行资金 规模占比 强赎与非强赎导致的退市可转债 各个评级 的占比 强赎与非强赎导致的退市可转债 各个行业(一级行业…...
【第八课】空间数据基础与处理——数据结构转化
一、前言 数据结构即指数据组织的形式,是适合于计算机存储、管理和处理的数据逻辑结构。对空间数据则是地理实体的空间排列方式和相互关系的抽象描述。它是对数据的一种理解和解释,不说明数据结构的数据是毫无用处的,不仅用户无法理解,计算机程序也不能正确地处理,对同样一组数…...
MATLAB绘制三Y轴坐标图:补充坐标轴及字体设置
三轴坐标图 1 函数 MATLAB绘制三轴图函数可见MATLAB帮助-multiplotyyy 基础图形绘制是很简单,但坐标轴及字体设置该如何实现呢? 本文以以下几个例子为例,希望可以解决在利用MATLAB绘制三轴坐标图时常见的疑惑。 2 案例 2.1 案例1…...
springboot项目中Quartz
下面内容大家可在自己创建的 springboot项目中 玩1 定时清理垃圾图片定时任务组件Quartz,可以根据我们设定的周期,定时执行目标任务计划1.1 Quartz介绍(了解)Quartz是Job scheduling(作业调度)领域的一个开源项目&…...
Presto本地开发,plugin的设置
1. 新的问题 之前搭建Presto的本地开发环境时,一直使用config.properties中的plugin.bundles配置项定义需要加载的plugin模块,详细可以参考博客《win10基于IDEA,搭建Presto开发环境》presto服务启动时,指定加载哪些组件ÿ…...
2023年3月西安/杭州/深圳/东莞NPDP产品经理认证考试报名
产品经理国际资格认证NPDP是国际公认的唯一的新产品开发专业认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年…...
Vue3笔记01 创建项目,Composition API,新组件,其他
Vue3 创建Vue3项目 vue-cli //查看vue/cli版本,确保在4.5.0以上 vue --version //安装或升级vue/cli npm install -g vue/cli //创建项目 vue create new_project //启动 cd new_project npm run serve 也可以通过vue ui进入图形化界面进行创建 vite 新一代前端…...
pandas数据分析(二)
文章目录DataFrame数据处理与分析读取Excel文件中的数据筛选符合特定条件的数据查看数据特征和统计信息按不同标准对数据排序使用分组与聚合对员工业绩进行汇总DataFrame数据处理与分析 部分数据如下 这个数据百度可以搜到,就是下面这个 读取Excel文件中的数据 …...
Spring实现[拦截器+统一异常处理+统一数据返回]
Spring拦截器 1.实现一个普通拦截器 关键步骤 实现 HandlerInterceptor 接口重写 preHeadler 方法,在方法中编写自己的业务代码 Component public class LoginInterceptor implements HandlerInterceptor {/*** 此方法返回一个 boolean,如果为 true …...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
