【3.2】FFT/IFFT变换的数学原理概述与MATLAB仿真
目录1.FFT的基本原理1.1 DFT1.2 FFT2.通过matlab编程方式实现FFT/IFFT(不用matlab自带的fft函数)1.FFT的基本原理离散傅里叶变换(DFT)是时域离散信号→频域离散信号的核心变换快速傅里叶变换(FFT)是DFT的快速算法(基于分治思想将复杂度从O(N2)降至 O(Nlog2N))逆快速傅里叶变换(IFFT)是频域→时域的逆变换与FFT数学原理高度相似仅存在系数和共轭符号的差异。1.1 DFT给定长度为N的时域序列x[n]n0,1,...,N−1其DFT变换X[k]为逆变换IDFT公式其中旋转因子核心复指数1.2 FFT基2-FFT前提序列长度N2^MM为正整数不足时补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 1X x;return;end% 1. 奇偶分解x_even x(1:2:end); % 偶数项x_odd x(2:2:end); % 奇数项% 2. 递归计算子序列FFTX_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);endendIFFT过程编写程序如下%实现 IFFT基于FFT仅修改共轭和系数function x my_ifft(X)% 输入X - 频域序列% 输出x - 时域序列N length(X);% IFFT核心1. 对共轭做FFT 2. 除以Nx (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.coloradmin.cn/o/2506809.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!