FFT算法是信号处理领域最基本、最经典的算法,在工程实践中用处十分广泛,但是在一些对FFT点数要求较大或者计算FFT实时性要求较高的场合,按常规方式直接计算FFT难以满足工程实际的要求。本文针对长点数FFT计算开发了一种基于二维矩阵的FFT算法,此算法将需要计算的复数点序列抽象为一个二维矩阵进行处理,将大点数计算分割为多次小点数FFT计算,并且小点数之间的处理互不影响,进而可在多核处理器(如多核DSP)或FPGA上并行执行,实时性将得到提高。

1.1理论推导

下面对基于二维矩阵的FFT计算过程进行推导:

1.2算法步骤

通过1.1小节的推导我们可以总结出二维矩阵FFT算法的步骤:
1.将待计算序列划分为N1xN2二维矩阵;
2.进行N2次N1点的FFT;
3.将N2次N1点FFT结果乘铰链因子;
4.进行N1次N2点FFT;
5.译序。

1.3Matlab仿真实现

(1)将算法封装成一个函数,方便在其他程序中直接调用,编写程序时按照1.2中说明的步骤来进行,具体代码如下:

function X=FFT_2DMatrix(x,N,L,M)
%Function descirption:N points FFT based on two-dimention matrix(N=M*L)
%Input parameter: x,input time domain data
%                 N,points
%                 L,row of 2D matrix
%                 M,collum of  2D matrix
%Output parameter:X,output frequency domain data
%Created by Baokuo Liu,2020-4-3.All rights reserved.
x2=zeros(M,L);
for n1=1:Lfor n0=1:Mx2(n1,n0)=x(1,(n1-1)*M+n0);  %划分为L*M二维矩阵end
endX1=zeros(M,L);
X2=zeros(M,L);
rot_factor=zeros(M,L);
for i=1:MX1(:,i)=fft(x2(:,i),L);  %M列L点FFTrot_factor(:,i)=exp(1j*2*pi*(i-1).*(0:L-1)/N)';  %旋转(铰链)因子X2(:,i)=X1(:,i).*rot_factor(:,i);  %FFT结果乘以旋转(铰链)因子
endX3=zeros(M,L);
for i=1:LX3(i,:)=fft(X2(i,:),M);  %L列M点FFT
endX=zeros(1,N);
for k0=1:Lfor k1=1:MX(1,(k1-1)*L+k0)=X3(k0,k1);  %译序end
end

(2)为了验证算法函数编写的正确性,仿真采样率为1.6kHz条件下,对频率100Hz的单频信号做256点FFT,调用上面的算法函数来完成FFT的计算,程序代码如下:

%parameter
N=256;  %points
M=16;  %collum of 2DMatrix
L=16;  %row of 2DMatrix
fs=1600; %sample frequency
f0=100;  %signal frequency
Vmax=1.8;  %Max input voltage
Vamp=1;    %amplitude
AD_bit=14;  %AD bits%generate single sine wave
t=0:1/fs:(N-1)/fs;
x=Vamp*sin(2*pi*f0.*t);%quantify
x=round((2^(AD_bit)-1).*x/Vmax);% output as a txt file(hex)
% x1=x';
% q=quantizer([AD_bit+1 0]);
% x2=num2bin(q,x1);
% fid1=fopen('C:\Users\radar\Desktop\Science\DSP\FFT_2DMatrix.txt','wt');
% for i=1:length(x)
%     fwrite(fid1,x2(i,:));
%     fprintf(fid1,'\n');
% end
% fclose(fid1);%FFT based on two dimention matrix
f=(-N/2:1:N/2-1)*fs/N;
X=FFT_2DMatrix(x,N,L,M);figure;
subplot(2,1,1);plot(t,x);xlabel('时间(s)');xlim([0 inf]);
ylabel('幅度');title('时域波形');
subplot(2,1,2);plot(f,abs(fftshift(X))*2/N*Vmax/(2^(AD_bit)-1));xlabel('频率(Hz)');
ylabel('幅度');ylim([0 1.8]);title('幅度谱');

1.4结果分析

仿真结果如上图所示,可见二维矩阵方法所得的FFT结果和常规一维点列FFT的结果完全一致,由此验证了算法程序编写的正确性。

1.5硬件实现

由于此2D-FFT算法在硬件实现上较复杂,不同处理器实现方法也不相同,这是暂时不做详细介绍,总的来说还是基于常规的一维FFT,读者可根据算法步骤自己尝试实现。对于在FPGA中的实现,可以参考我的另一篇博客:https://blog.csdn.net/qq_43622265/article/details/105905927,这篇博客是关于FFT IP核的使用方法,大家可以以此为基础来自行实现2D-FFT。

说明:理论推导部分参考了文献《基于TMS320C6678的多核DSP并行处理应用技术研究》,感兴趣的同学可到知网自行下载阅读。

基于二维矩阵的FFT计算原理相关推荐

  1. 【CV】图像卷积计算即二维矩阵卷积(Python)

    卷积与数字图像 什么是卷积 一维线性卷积 参数'full' 参数'same' 参数'valid' 二维线性卷积 什么是卷积 一维线性卷积 线性卷积(linear convolution) 在时域描述线 ...

  2. Linux下采用lapack科学计算包来实现二维矩阵

    1.调用lapack包的方式,写一个头文件 my_lapack.h (Linux如何安装lapack包?) #ifndef MY_LAPACK_H #define MY_LAPACK_Hextern ...

  3. 基于二维码的室内定位技术(一)——原理

    作者介绍:周语馨 from 南京大学 to 英特尔亚太研发有限公司 504849766@qq.com 原文地址: https://zhou-yuxin.github.io 哎,不知道怎么说呢.自从朱富 ...

  4. 雅可比旋转求解对称二维矩阵的特征值和特征向量

    问题描述: 给定一个矩阵,如下: A=[a11a21a12a22] A=\begin{bmatrix} a_{11}&a_{12}\\ a_{21}& a_{22} \end{bmat ...

  5. 基于二维切片图序列的三维立体建模MATLAB仿真

    目录 1.算法概述 2.仿真效果预览 3.核心MATLAB程序 4.完整MATLAB程序 1.算法概述 isosurface 等值面函数 调用格式: fv = isosurface(X,Y,Z,V,i ...

  6. AAAI 2020 | 时间可以是二维的吗?基于二维时间图的视频内容片段检测

    作者 | 彭厚文.傅建龙 来源 | 微软研究院AI头条 编者按:当时间从一维走向二维,时序信息处理问题中一种全新的建模思路由此产生.根据这种新思路及其产生的二维时间图概念,微软亚洲研究院提出一种新的解 ...

  7. 时间可以是二维的?基于二维时间图的视频内容片段检测 | AAAI 2020

    作者 | 彭厚文.傅建龙 来源 | 微软研究院AI头条(ID: MSRAsia) 编者按:当时间从一维走向二维,时序信息处理问题中一种全新的建模思路由此产生.根据这种新思路及其产生的二维时间图概念,微 ...

  8. 【Matlab】如何对二维矩阵进行线性/非线性插值?

    1.Introduction 最近又遇到了矩阵插值(重采样)的问题,在最开始写博客的时候就写了篇关于 Excel 重采样的文章,不过在逐渐熟悉 Matlab 的过程中,还是决定看看能不能编程自动实现, ...

  9. 【Matlab】一种超简单的二维矩阵降维方法

    1.Introduction Matlab里图像处理时,经常会把一维数组转二维数组,二维数组转一维,如下图所示: 一般经常使用的函数是 reshape ,可以在不同维度之间进行转换,不过需要事先计算数 ...

最新文章

  1. 小逗比机器人聊天接口api
  2. 【Web安全】Payload的探索与Kali渗透测试框架-msf
  3. 实现同步请求_Redis的复制是如何实现的?
  4. 全球及中国N95级医用防护口罩市场销售规模与产量需求预测报告2022版
  5. adf4351使用_ADF:将UI类别与动态表单一起使用
  6. 初学Struts遇到的坑爹问题
  7. php 织梦模板 防盗,dedecms 软件下载频道防盗链php代码
  8. opencv 4计算机视觉项目实战_资源|计算机视觉实战操作(PDF下载)
  9. 罗永浩关联直播交易案遭“问停”;中国量子计算原型机“九章”问世;pip 20.3 发布 | 极客头条...
  10. MySQL使用内置函数来进行模糊搜索locate()与like的不同
  11. springboot relativepath 不存在_MyBatis初级实战之一:Spring Boot集成
  12. vbyone接口引脚定义_USB3.1 Type-C 高速接口设计指南
  13. 2015计算机软考试题及答案,2015年计算机软考网络工程师练习试题及答案
  14. java实训任务_java实训任务
  15. java前后端分离跨域解决方案
  16. flash cs3下停止movieClip的播放
  17. 施密特正交化过程编程c语言,利用C程序编写格拉姆-施密特正交化的过程.docx
  18. 女生找工作,非常有用,好好 收藏,以后肯定能用得上 (转)
  19. 日均5亿查询量,京东到家订单中心的ES架构演进
  20. Unity加载进度条

热门文章

  1. 声音经济@2023: 「夹缝」求生,「希望」不远
  2. Mimicking Very Efficient Network for Object Detection
  3. 计算思维-程序设计方法论-Python笔记
  4. D3D9 创建多屏的全屏程序
  5. 关于并口控制实验中用到的接口板及驱动板
  6. 惠普光影精灵7Victus 评测
  7. 好用的国产无线蓝牙耳机有哪些?盘点好口碑国产蓝牙耳机
  8. 中国古代数学在几何学领域的独特贡献
  9. 轨迹预处理(轨迹清洗)
  10. 案例▍大数据可视化 “灵鲲”态势感知系统中的理论与实践