当前位置: 首页 > article >正文

DSP题目:FFT算法的Matlab实现及其应用研究

DSP 题目FFT算法的Matlab实现及应用研究最近帮室友调毕设的信号处理部分他拿了个麦克风录的杂音想把背景的50Hz工频噪音去掉上来就问我“为啥我fft出来的峰不对”——害这问题我刚学DSP的时候也踩过无数坑今天就来唠唠FFT的Matlab实现和那些容易踩的坑。先从最直观的例子开始分析正弦信号频谱先搞个最简单的场景生成一个100Hz的纯净正弦波用Matlab快速算它的频谱% 基础参数设置 Fs 1000; % 采样频率要至少是信号最高频率的2倍这里留了余量 T 1/Fs; % 单次采样间隔 L 1000; % 总采样点数对应1秒时长 t (0:L-1)*T; % 生成时间轴 % 生成100Hz正弦信号 x sin(2*pi*100*t); % 计算FFT并处理频谱 Y fft(x); % 先算双侧频谱再转成我们常用的单侧频谱 P2 abs(Y/L); P1 P2(1:L/21); % 除了直流和奈奎斯特频率点其他点都要翻倍因为能量被分到正负频率两侧了 P1(2:end-1) 2*P1(2:end-1); % 生成对应的频率轴 f Fs*(0:(L/2))/L; % 画图看结果 figure(Name,纯净正弦信号频谱) plot(f,P1) title(100Hz正弦波单侧频谱) xlabel(频率(Hz)) ylabel(幅值) grid on这里很多新手会卡壳为啥算出来的峰值是0.5而不是1就是没做那个归一化和单侧转换——Matlab内置的fft输出的是包含正负频率的完整频谱直接取绝对值的话幅值会翻倍而且我们只需要看0到Fs/2的部分就够了。实战场景带噪信号滤波就说室友遇到的问题他录的信号里混了50Hz工频噪和高斯白噪我们来模拟一下% 生成带噪信号100Hz信号 50Hz工频噪 随机白噪 x_noisy sin(2*pi*100*t) 0.3*sin(2*pi*50*t) 0.2*randn(size(t)); % 同样做频谱分析 Y_noisy fft(x_noisy); P2_noisy abs(Y_noisy/L); P1_noisy P2_noisy(1:L/21); P1_noisy(2:end-1) 2*P1_noisy(2:end-1); figure(Name,带噪信号频谱) plot(f,P1_noisy) title(带噪信号单侧频谱) xlabel(频率(Hz)) ylabel(幅值) grid on这时候能清晰看到50Hz和100Hz的两个峰还有一堆杂乱的小尖峰——就是高斯白噪的频谱。接下来我们把50Hz的峰删掉% 滤除50Hz噪音 Y_filtered Y_noisy; % 找到50Hz对应的索引区间留一点余量防止频偏 idx 48:52; % 实信号的FFT是共轭对称的正负频率位置都要置0 Y_filtered(idx) 0; Y_filtered(L - idx 2) 0; % 逆FFT恢复干净信号 x_filtered ifft(Y_filtered); % 画图对比效果 figure(Name滤波前后信号对比) subplot(2,1,1) plot(t, real(x_noisy)) title(原始带噪信号) xlabel(时间(s)) subplot(2,1,2) plot(t, real(x_filtered)) title(滤除50Hz噪后的信号) xlabel(时间(s))这里要注意ifft输出的是复数结果因为我们的原始信号都是实信号所以只需要取real部分就行虚部都是浮点运算的微小误差可以直接忽略。自己写一个极简版FFT搞懂原理光用内置函数总觉得隔着一层我们来写个最基础的基2FFT也就是课本里的Cooley-Tukey算法原理就是把N点DFT拆成两个N/2点的DFT再用蝶形运算拼起来复杂度从O(N²)降到O(NlogN)function y my_fft(x) N length(x); % 递归终止条件单点DFT就是它本身 if N 1 y x; return; end % 奇偶项拆分 x_even x(1:2:end); x_odd x(2:2:end); % 递归计算两个子DFT y_even my_fft(x_even); y_odd my_fft(x_odd); % 蝶形运算组合结果 y zeros(1, N); for k 1:N/2 % 旋转因子 twiddle exp(-2*pi*1j*(k-1)/N); y(k) y_even(k) twiddle * y_odd(k); y(k N/2) y_even(k) - twiddle * y_odd(k); end end我们来测试一下和内置fft的差距% 测试自定义FFT x_test sin(2*pi*100*t(1:64)); % 取64个点刚好是2的整数次幂 Y_mine my_fft(x_test); Y_builtin fft(x_test); % 计算最大误差基本在1e-10级别都是浮点精度问题 err max(abs(Y_mine - Y_builtin)); disp([自定义FFT和内置FFT的最大误差, num2str(err)]);跑出来的误差极小说明我们自己写的函数是对的就是递归版本效率不高实际工程里还是用内置的fft更快。避坑指南几个新手最容易踩的点补零≠提升分辨率很多人以为补零能让频谱更精细但其实真实的频谱分辨率是Fs/LL是原始采样点数补零只是在频域做插值让图像看起来更平滑而已。比如我们只采了100个点分辨率就是10Hz两个间隔小于10Hz的信号峰是没法分辨的补零到1024点也没用。matlab% 补零效果演示xshort sin(2pi100t(1:100)); % 仅100个采样点Lshort length(xshort);% 不补零的频谱Y1 fft(xshort);P11 2abs(Y1(1:Lshort/21))/Lshort;f1 Fs(0:(Lshort/2))/Lshort;% 补零到1024点的频谱Y2 fft(xshort, 1024);P12 2abs(Y2(1:1024/21))/Lshort;f2 Fs*(0:(1024/2))/1024;figure(Name,补零对比)subplot(2,1,1)plot(f1,P1_1)title(未补零频谱)xlim([90 110])DSP 题目FFT算法的Matlab实现及应用研究subplot(2,1,2)plot(f2,P1_2)title(补零到1024点频谱)xlim([90 110])别忘了去直流分量如果你的信号有直流偏移频谱在0Hz的地方会出现一个很高的尖峰不需要的话可以先把信号减去均值x x - mean(x);频率轴别算错别写成f (0:L-1)*Fs/L;然后直接用单侧频谱只需要取前半部分而且要对应好索引。最后说一句FFT的应用远不止滤波图像处理里的二维FFT、音频压缩、雷达信号分析都离不开它先把基础的坑踩完后面玩起来就顺多了。

相关文章:

DSP题目:FFT算法的Matlab实现及其应用研究

DSP 题目:FFT算法的Matlab实现及应用研究最近帮室友调毕设的信号处理部分,他拿了个麦克风录的杂音,想把背景的50Hz工频噪音去掉,上来就问我“为啥我fft出来的峰不对”——害,这问题我刚学DSP的时候也踩过无数坑&#x…...

彩灯广告屏PLC控制S7-200程序:包含梯形图、接线图、原理图及IO分配与组态画面详解

彩灯广告屏的PLC控制S7-200程序 程序 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面上周刚帮客户搞定了一套户外彩灯广告屏的PLC控制项目,用的还是经典的S7-200,本来以为老架构玩不出花…...

【FMCW雷达】频率调制连续波FMCW雷达系统(从波形生成到利用小胞平均常误报率CA-CFAR进行目标检测)【含Matlab源码 15242期】含报告

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…...

构建企业级AI智能体:LangGraph多智能体框架实战指南

构建企业级AI智能体:LangGraph多智能体框架实战指南 【免费下载链接】langgraph Build resilient language agents as graphs. 项目地址: https://gitcode.com/GitHub_Trending/la/langgraph 在当今AI应用开发中,开发者面临着一个核心挑战&#x…...

嵌入式系统电源时序控制原理与实现

1. 电源时序控制基础概念在现代电子系统中,多电压域设计已成为常态。一个典型的嵌入式系统可能同时需要1.2V(核心逻辑)、3.3V(外设接口)和1.5V(特殊功能模块)等多种电压。这些电源的上电顺序对系…...

【应答器】基于matlab应答器特殊区段信息包报文编码仿真【含Matlab源码 15258期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…...

别再只用SUM了!用Excel分析Kaggle数据集,我发现了这些销售秘密

别再只用SUM了!用Excel分析Kaggle数据集,我发现了这些销售秘密 作为一名常年与Excel打交道的业务分析师,我习惯了用SUM和VLOOKUP解决80%的问题。直到上个月,当我偶然下载了Kaggle上的牛油果销售数据集,才发现这个"…...

Java多线程实战:ReentrantLock与信号量Semaphore的5个高频使用场景解析

Java多线程实战:ReentrantLock与信号量Semaphore的5个高频使用场景解析 在Java并发编程领域,ReentrantLock和Semaphore是两个至关重要的同步工具。它们虽然都属于JUC(java.util.concurrent)包中的并发控制机制,但设计理…...

工业机器人嵌入式系统建模与自动化工具项目三基于RAPID指令的故障排查与项目实施

目录 一、 项目背景与研发目标 1.1 项目研发背景 1.2 项目核心目标 二、 项目全周期进展 2.1 需求分析与环境搭建阶段(完成度100%) 2.2 核心模块编码开发阶段(完成度100%) 2.3 功能调试阶段(核心故障爆发…...

1220亿美元!OpenAI创下史上最大融资纪录;DeepSeek连续三天发生服务异常;Claude Code 51万行源码泄露 | 极客头条

「极客头条」—— 技术人员的新闻圈!CSDN 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:zhanghycsdn.net)整理 | 苏宓出品 | CSDN(ID&…...

OpCore-Simplify:一键自动化黑苹果配置,让复杂技术变得简单

OpCore-Simplify:一键自动化黑苹果配置,让复杂技术变得简单 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是…...

新手入门:零基础借助快马生成你的第一个openmaic网页版调用程序

今天想和大家分享一个特别适合新手入门的实践项目——如何借助InsCode(快马)平台快速生成你的第一个openmaic网页版调用程序。作为一个刚接触AI开发的新手,我最初看到各种API文档和代码示例时也是一头雾水,但通过这个可视化工具,居然半小时就…...

一个月突变!Linux内核大佬懵了:上个月还是“AI垃圾”,这个月AI Bug报告却突然靠谱?

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)最近在做开源项目维护的开发者,可能会有一种奇怪的错觉:Bug 似乎报告变多了,而且变准了——更准确地说,是 AI 报的 Bug,突然开始“靠谱了”。…...

芯片缺货潮下的应对策略与国产替代方案

1. 芯片缺货潮下的行业现状最近我的一个产品项目中,原本采购价仅5元的ST品牌MCU(微控制器)价格飙升至70元,涨幅高达14倍。这个案例并非个例,而是当前全球半导体行业供应链危机的缩影。作为从业十余年的硬件工程师&…...

MCP3208 12位SPI ADC嵌入式驱动与硬件设计实战

1. MCP3208芯片深度解析:面向嵌入式系统的12位8通道SPI模数转换器工程实践1.1 芯片定位与核心价值MCP3208是Microchip公司推出的逐次逼近型(SAR)模数转换器,专为资源受限的嵌入式系统设计。其核心价值在于以极简硬件接口&#xff…...

AI命理工具实测:主流大模型八字紫微能力对比及避坑指南

1. AI命理新风向:当大模型碰撞传统术数 最近身边刮起了一阵“AI命理”的热潮:做开发的朋友电脑里存着排盘工具包,运营岗的同事午休时在研究紫微斗数星曜含义,就连开策划会的间隙,都有人拿着AI输出的六爻结果讨论项目走…...

GLM-4.1V-9B-Base实战教程:跨境电商A+页面图像卖点自动提炼

GLM-4.1V-9B-Base实战教程:跨境电商A页面图像卖点自动提炼 1. 为什么需要自动提炼图像卖点 跨境电商卖家每天需要处理大量商品图片,传统人工标注方式存在三个痛点: 效率低下:一个运营人员每天最多处理50-100张图片成本高昂&…...

Vivado Design Suite中BUFG优化策略与实战技巧

1. 理解BUFG的核心作用与设计痛点 在FPGA设计中,时钟信号就像人体神经系统中的电脉冲,需要快速、准确地传递到每个功能单元。BUFG(全局时钟缓冲器)就是Xilinx器件中专用的"信号放大器",它能将时钟信号分配到…...

seo sem公司如何制定营销策略

SEO SEM公司如何制定有效的营销策略 在当今数字化时代,SEO(搜索引擎优化)和SEM(搜索引擎营销)已经成为企业推广和品牌建立的关键组成部分。无论是中小企业还是大型跨国公司,它们都需要高效、精准的营销策略…...

League-Toolkit:颠覆式英雄联盟客户端增强工具的全攻略

League-Toolkit:颠覆式英雄联盟客户端增强工具的全攻略 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是一款基于官…...

高效医学知识图谱构建方案:CMeKG工具自动化处理中文医学文本技术深度解析

高效医学知识图谱构建方案:CMeKG工具自动化处理中文医学文本技术深度解析 【免费下载链接】CMeKG_tools 项目地址: https://gitcode.com/gh_mirrors/cm/CMeKG_tools 在医疗信息化与人工智能深度融合的今天,中文医学知识图谱构建面临严峻的技术挑…...

C#编写CIP通讯源码——欧姆龙NX1P通讯DEMO

C#编写CIP通讯源码,欧姆龙NX1P通讯DEMO一、概述 本代码是基于C#语言开发的CIP(Common Industrial Protocol)通讯Demo程序,专门用于与欧姆龙NX1P2系列PLC进行工业通讯交互。程序采用.NET Framework 4.8框架开发,通过TCP…...

NVIDIA Profile Inspector完全掌握:从问题诊断到性能优化的效率提升指南

NVIDIA Profile Inspector完全掌握:从问题诊断到性能优化的效率提升指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 许多玩家和创作者拥有高性能NVIDIA显卡,却因配置不当无法…...

XML 指南

XML 指南 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。自从1998年发布以来,XML因其灵活性和广泛的应用场景而成为数据交换的标准格式。本文旨在为您提供一个全面的XML指南,帮助您了解XML的基本概念、语法规则、应用场景以及相关的最佳实践。 XML的基本…...

LCC-HVDC系统中交流滤波器的选型实战:从理论到工程落地

LCC-HVDC系统中交流滤波器的选型实战:从理论到工程落地 在特高压直流输电工程中,交流滤波器如同电力系统的"净化器",其选型直接关系到电网谐波抑制效果与系统运行经济性。某800kV换流站曾因滤波器选型不当导致年度损耗增加1200万元…...

合肥艺星12周年超级盛典 以“独1无2”之名,立品质医美新坐标

2026年4月1日,合肥艺星12周年超级盛典正式启幕。十二年,不只是时间的沉淀,更是品牌在品质、技术、服务、标准、态度、团队、城市责任与星品矩阵八大维度上,构建完整“坐标系”的高光时刻。合肥艺星以“独1无2”之姿,向安徽乃至全国医美行业定义出一份关于“独一”的答卷。独1无…...

零基础新手指南:借助快马AI无需代码构建你的第一篇论文官网

作为一个完全没有编程基础的研究生,我曾经为了搭建个人论文展示网站头疼不已。直到发现了InsCode(快马)平台,整个过程变得异常简单。下面分享我的完整实践过程,希望能帮助到同样需要展示学术成果的朋友们。 明确网站需求结构 在开始前&#x…...

附链小程序测评:支持Word/PDF/PPT/EXCEL/压缩包上传,解决公众号文件嵌入难题

公众号运营中,文件分发存在明确痛点:推文无法直接嵌入附件,第三方链接常出现跳转繁琐、广告弹窗、文件过期等问题,增加运营成本且影响用户体验。附链小程序为微信生态原生工具,核心解决上述痛点,支持公众号…...

OpenClaw多模态聊天机器人:Qwen2.5-VL-7B实现图片问答与表情包生成

OpenClaw多模态聊天机器人:Qwen2.5-VL-7B实现图片问答与表情包生成 1. 为什么选择OpenClaw构建多模态聊天机器人 去年我在运营一个技术社群时,经常遇到群成员发截图提问的场景。传统聊天机器人要么只能处理文字,要么需要将图片上传到第三方…...

STM32智能剪枝机:嵌入式系统与传感器集成实践

1. 项目背景与需求分析作为一名从事嵌入式开发多年的工程师,我最近完成了一个基于STM32的智能绿化带剪枝机项目。这个项目的初衷源于我在城市公园散步时的观察:园艺工人手持笨重的剪枝工具,在烈日下长时间弯腰作业,不仅效率低下&a…...