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

【3.2】FFT/IFFT变换的数学原理概述与MATLAB仿真

目录

1.FFT的基本原理

1.1 DFT

1.2 FFT

2.通过matlab编程方式实现FFT/IFFT(不用matlab自带的fft函数)


1.FFT的基本原理

离散傅里叶变换(DFT)是时域离散信号→频域离散信号的核心变换,快速傅里叶变换(FFT)是DFT的快速算法(基于分治思想,将复杂度从O(N2)降至 O(Nlog2​N));逆快速傅里叶变换(IFFT)是频域→时域的逆变换,与FFT数学原理高度相似,仅存在系数和共轭符号的差异。

1.1 DFT

给定长度为N的时域序列x[n](n=0,1,...,N−1),其DFT变换X[k]为:

逆变换IDFT公式:

其中旋转因子(核心复指数):

1.2 FFT

基2-FFT前提:序列长度N=2^M(M为正整数,不足时补0)。其核心思想:奇偶分解,将长序列DFT分解为两个短序列DFT,递归分解直到长度为1。

IFFT与FFT仅两个区别:

因此实现FFT后,仅需微小修改即可实现IFFT。

2.通过matlab编程方式实现FFT/IFFT(不用matlab自带的fft函数)

FFT函数编写程序如下:

%基2-FFT(递归实现,无内置FFT函数)

function X = my_fft(x)

% 输入:x - 时域序列(长度必须为2^M,自动补0)

% 输出:X - 频域序列(DFT结果)

x = x(:); % 转为列向量

N = length(x); % 序列长度

% 补0到最近的2的整数次幂(基2FFT要求)

M = ceil(log2(N));

N_fft = 2^M;

x = [x; zeros(N_fft - N, 1)];

% 递归终止条件:长度为1时,DFT等于自身

if N_fft == 1

X = x;

return;

end

% 1. 奇偶分解

x_even = x(1:2:end); % 偶数项

x_odd = x(2:2:end); % 奇数项

% 2. 递归计算子序列FFT

X_even = my_fft(x_even);

X_odd = my_fft(x_odd);

% 3. 蝶形运算(核心公式)

X = zeros(N_fft, 1);

for k = 1 : N_fft/2

% 旋转因子 W_N^k = e^(-j*2pi*(k-1)/N_fft) (公式直接实现)

W = exp(-1j * 2 * pi * (k-1) / N_fft);

% 蝶形公式

X(k) = X_even(k) + W * X_odd(k);

X(k + N_fft/2) = X_even(k) - W * X_odd(k);

end

end

IFFT过程编写程序如下:

%实现 IFFT(基于FFT,仅修改共轭和系数)

function x = my_ifft(X)

% 输入:X - 频域序列

% 输出:x - 时域序列

N = length(X);

% IFFT核心:1. 对共轭做FFT 2. 除以N

x = (1/N) * my_fft(conj(X));

x = real(x); % 消除浮点误差,取实部

end

主函数程序如下:

clear; clc; close all; % 生成测试时域信号 N = 8; % 序列长度(2^3,满足基2FFT) n = 0:N-1; x = sin(2*pi*1*n/N) + 0.5*cos(2*pi*2*n/N); % 复合正弦信号 % 调用自定义FFT/IFFT X_my = my_fft(x) x_my = my_ifft(X_my) % 调用MATLAB内置函数(对比验证) X_mat = fft(x) x_mat = ifft(X_mat)

运行结果如下:

可以看到,通过编程实现的FFT/IFFT输出结果和matlab自带的FFT函数输出结果完全一致。

http://www.jsqmd.com/news/624498/

相关文章:

  • sed 命令完整使用手册
  • 【实战】海康摄像头RTSP流媒体连接中的特殊字符陷阱:从401错误到URL编码的终极解决
  • 泛微Ecology异构集成避坑指南:许可证(AppID)管理与安全配置的那些事儿
  • 5分钟快速上手!跨平台资源下载神器res-downloader完整指南
  • windows安装mysql8.0.33
  • 多账号矩阵运营的技术难点与工程化落地实践
  • PostgreSQL权限体系深度解析:从表空间到角色的实战指南
  • MATLAB图像分割实战:从基础阈值到分水岭算法的进阶指南
  • 双缓冲技术在操作系统开发中的应用
  • Вот перевод предоставленного текста на русский язык -pay
  • 自动螺丝供料技术:自动送钉系统的核心功能解析
  • 长春黄金回收鉴定哪家好
  • CentOS 7 等保测评踩坑记:手把手教你用脚本升级OpenSSH到9.6p1(附完整回滚方案)
  • hot 100 73. 矩阵置零
  • 认证技术中的考试大纲认证流程与续证要求
  • Cursor与Figma的MCP桥梁:从零搭建智能设计协作环境
  • Python资源合集
  • 2026年上海家装行业优质品牌评定报告 - 速递信息
  • 英语阅读_Art is a part of human culture
  • MediaCodec 编解码基础:Buffer 队列、状态机与零拷贝的艺术
  • Cosmos-Reason1-7B实际效果:对机器人抓取动作进行接触力与稳定性预判
  • 如何高效使用智能激活工具:KMS_VL_ALL_AIO完整实践指南
  • YOLOv10新手必看:镜像内Markdown文档,帮你秒懂所有操作
  • 惠普暗影精灵硬件控制新选择:OmenSuperHub技术解析与实践指南
  • Open GApps包怎么选?从Platform到Variant,一次讲清安卓11/12 GMS安装包下载门道
  • Windows 10/11 鼠标指针美化终极指南:免费获取macOS风格指针
  • 如何用Python脚本实现京东茅台自动化抢购:jd_maotai实战指南
  • mPLUG-Owl3-2B图文交互工具入门必看:上传→提问→解析三步闭环
  • Tableau 中实现优雅曲线:平滑折线图的进阶技巧
  • 千问3.5-2B图文理解实战:从原始图输入到结构化JSON输出的完整数据管道设计