级联FFT(超采样FFT架构)的MATLAB代码及原理

server/2025/3/30 5:52:16/

一、原理

  该算法首先对输入时间序列的数据进行抽样,然后对抽样后数组内的数据进行 FFT 运算处理,然后进行交叉项的补偿,再对 FFT 之后不同数组间相同位置上的数据进行第 2 次 FFT 处理,从而达到一次 FFT 运算能够得到的效果。
  例如下图,做N点FFT,可以先将输入折叠成N=L*M矩阵形式,然后先对每行进行FFT(长度为M),得到的结果乘以补偿因子后,再对每列进行FFT(长度为L)。这样,便通过两级短FFT实现了一级长FFT同样的效果。

二、适用场景

  此方法适用于FFT长度较长而使得硬件的DSP资源无法满足的场景,其他情况下使用此方法并不能明显节约硬件资源。

三、MATLAB代码

  SuperSamplingFFT.m

matlab">function XN1N2 = SuperSamplingFFT(Xin,SubLength)if(~isvector(Xin))error('Xin should be a vector');
endrow = isrow(Xin);N = length(Xin);
N1 = SubLength;
N2 = ceil(N/N1); % Length of each sub-seriesif(N1*N2~=N)error('SubLength should be a divider of the length of Xin');
endi = sqrt(-1);
WN1 = exp(-2*i*pi/N1);
WN2 = exp(-2*i*pi/N2);
WN1N2 = exp(-2*i*pi/(N1*N2));xN1N2 = reshape(Xin,N1,N2);% FFT by row
YN1N2 = zeros(N1,N2);
for n1=1:N1YN1N2(n1,:) = fft(xN1N2(n1,:));
end% Weighting 
YYN1N2 = zeros(N1,N2);
for n2=1:N2Y = YN1N2(:,n2);  % vector extractionWeight = WN1N2.^([0:N1-1]'*(n2-1));YN1N2(:,n2) = Y.*Weight;
end% Second FFT
for n2=1:N2YYN1N2(:,n2) = fft(YN1N2(:,n2));
end% Transpose and back to vector
if(row)XN1N2 = reshape(YYN1N2.',1,N);
elseXN1N2 = reshape(YYN1N2.',N,1);
endend

  Test_SuperSamplingFFT.m

matlab">N = 2048;
N1 = 512; % Number of sub-series to extract from original time-seriesxN = rand(N,1)+i*rand(N,1);
XN = fft(xN);
XN1N2 = SuperSamplingFFT(xN,N1);figure(1);
clf;
subplot(2,2,1);
plot([1:N],real(XN),'b',[1:N],real(XN1N2),'r');
title(['Real Part:  max error ' num2str(max(abs(real(XN-XN1N2))))]);subplot(2,2,2);
plot([1:N],imag(XN),'b',[1:N],imag(XN1N2),'r');
title(['Imag Part:  max error ' num2str(max(abs(imag(XN-XN1N2))))]);disp(['Maximum Modulus Error: ' num2str(max(abs(XN-XN1N2)))]);xN = rand(1,N)+i*rand(1,N);
XN = fft(xN);
XN1N2 = SuperSamplingFFT(xN,N1);subplot(2,2,3);
plot([1:N],real(XN),'b',[1:N],real(XN1N2),'r');
title(['Real Part:  max error ' num2str(max(abs(real(XN-XN1N2))))]);subplot(2,2,4);
plot([1:N],imag(XN),'b',[1:N],imag(XN1N2),'r');
title(['Imag Part:  max error ' num2str(max(abs(imag(XN-XN1N2))))]);disp(['Maximum Modulus Error: ' num2str(max(abs(XN-XN1N2)))]);

四、参考来源

  参考一:一种新的级联 FFT 算法, 张大炜, (中国电子进出口总公司,北京 100037)
  参考二:https://www.dsprelated.com/thread/3440/cascaded-ffts(这是Xilinx写的实现方法)
  下载链接:参考二中可以下载Xilinx写的实现文档,就是一个pdf文件,下载不了的话可以在我CSDN中下载,https://download.csdn.net/download/qq_35809085/90533630


http://www.ppmy.cn/server/179492.html

相关文章

gitee第三方登录获取openid | python+Django |已跑通

注:此项目根据美多改编,qq第三方需要备案gitee不用 一、获取appid和appsecret 点击右侧账号设置 左侧菜单栏数据管理里有第三方应用 点击创建应用,根据你的具体情况设置 二、以下是事例代码,根据需要修改即可 setting.py #QQ登…

针对stm32F103C8t6芯片调节USB串口的经验

1、首先这是自己手搓的板子,对于之前一直没有了解过USB这方面,则这个针对USB部分没有设计上拉电阻,造成不管怎么调节PC端都没有反应。 图一 这个没有添加1.5K电阻 这个D+位置应该再接一个1.5KR的电阻如图2所示 图2 这样调节的话PC端就可以识别到USB串口,但是这是串口还是会…

计算机二级:函数基础题

函数基础题 第一题 rinput("请输入半径:") c3.1415926*r*2 print("{:.0f}".format(c))输出: Type Error第二题 a7 b2 print(a%2)输出 1第三题 ab4 def my_ab(ab,xy):abpow(ab,xy)print(ab,end"\n") my_ab(ab,2)prin…

数据库基础知识点(系列七)

视图和索引相关的语句 1.引入视图的主要目的是什么? 答:数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合用户的需求。SQL Server 2008可以根据用户需求重新定义表的数据结构,这种数据结构就是视图。视图是关系数据…

微信小程序登录和获取手机号

目录 准备工作 实现流程 实现代码 公共部分 通过code获取openid等信息 解密手机号 扩展 不借助工具类实现解密 借助工具类获取access_token 准备工作 需要小程序账号(可以去微信公众平台创建一个测试号或者正式号) appid:小程序id …

使用selenium来获取数据集

使用selenium来获取数据集 1、下载最新的chrome浏览器与chromedriver.exe 查看chrome的版本,打开谷歌浏览器,点击右上角的三个点,然后点击【帮助】, 点击【关于Google Chrome】 然后去下载同样为134版本号的chromedriver.exe, 网址:https://googlechromelabs.github.…

云原生进化:架构现代化的核心引擎

摘要 云原生技术通过容器化、动态编排、微服务等核心能力,正在重构企业IT架构的DNA。本文系统性剖析云原生的技术演进路径、关键架构要素及实施方法论,结合行业典型案例与量化数据,揭示其如何驱动企业实现资源利用率提升60%、故障恢复速度加…

洛谷 P10516 数据结构 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​) 和 b ( b 1 , b 2 , ⋯ , b n ) b(b_1,b_2,\cdots,b_n) b(b1​,b2​,⋯,bn​),有 m m m 个操作分三种: add ⁡ ( l , r , k , t ) \operatorname{ad…