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

相关推荐
rannn_1114 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer5 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
不会代码的小猴5 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
AI备案指南-满满6 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤6 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝6 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林7 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展
陌诺曦.7 小时前
Python扩展小练习
算法
coder!mq8 小时前
说几个常见的语法糖?
java·开发语言·算法