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

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

一、原理

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

二、适用场景

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

三、MATLAB代码

  SuperSamplingFFT.m

function XN1N2 = SuperSamplingFFT(Xin,SubLength)

if(~isvector(Xin))
    error('Xin should be a vector');
end

row = isrow(Xin);

N = length(Xin);
N1 = SubLength;
N2 = ceil(N/N1); % Length of each sub-series

if(N1*N2~=N)
    error('SubLength should be a divider of the length of Xin');
end

i = 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:N1
    YN1N2(n1,:) = fft(xN1N2(n1,:));
end

% Weighting 
YYN1N2 = zeros(N1,N2);
for n2=1:N2
    Y = YN1N2(:,n2);  % vector extraction
    Weight = WN1N2.^([0:N1-1]'*(n2-1));
    YN1N2(:,n2) = Y.*Weight;
end

% Second FFT
for n2=1:N2
    YYN1N2(:,n2) = fft(YN1N2(:,n2));
end

% Transpose and back to vector
if(row)
    XN1N2 = reshape(YYN1N2.',1,N);
else
    XN1N2 = reshape(YYN1N2.',N,1);
end

end

  Test_SuperSamplingFFT.m

N = 2048;
N1 = 512; % Number of sub-series to extract from original time-series

xN = 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

相关文章:

  • 前端技巧第十期JavaScript作用域链
  • 【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)
  • matlab打开两个工程
  • Redis 基础篇笔记
  • Android系统Launcher启动流程学习(三)Launcher启动流程
  • Windows 10 ARM64平台MFC串口程序开发
  • 前端知识点---事件委托和机制-阻止冒泡机制-阻止默认行为机制(javascript)
  • JavaScript描述Object.create()方法的原理及作用,如何利用它创建一个具有指定原型的对象?
  • java: 无法访问org.springframework.web.bind.annotation.GetMapping
  • 正则表达式-笔记
  • Transformer的理解
  • 7.2 分治-快排:LeetCode 912. 排序数组
  • Debezium日常分享系列之:Debezium 3.1.0.CR1发布
  • 01STM32时钟树
  • 【redis】哨兵节点作用演示和重选主节点详细流程
  • Vue $bus被多次触发
  • Android 删除aar中的一个类 aar包冲突 aar类冲突 删除aar中的一个包
  • 【JavaScript】筑基期功法
  • Spring Boot 自定义 Starter 组件的技术指南
  • Vue简单的store模式
  • 网站建设自学教程/google seo实战教程
  • 免费网址申请注册/优化设计高中
  • 聊城做网站推广地方/网址大全实用网址
  • 石家庄移动端网站建设/怎么在百度免费推广
  • 用.net做网站好_还是用php/百度网盘云资源搜索引擎
  • 外贸做零售的网站/百度邮箱注册入口