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

目录

1.FFT的基本原理

[1.1 DFT](#1.1 DFT)

[1.2 FFT](#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的时域序列xn(n=0,1,...,N−1),其DFT变换Xk为:

逆变换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函数输出结果完全一致。

相关推荐
ZhengEnCi2 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是3 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考3 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt5 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
w_zero_one6 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼7 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
小超人诞生日记8 小时前
C++ 智能指针的使用及其原理详解
c++·算法
分享资料9 小时前
MATLAB 中分号 (;)的作用
matlab
FPGA小迷弟9 小时前
FPGA 与千兆以太网:各类物理接口的形式、区别、使用方法与应用场景详解
tcp/ip·macos·fpga开发·udp·fpga