2023年全国研究生数学建模竞赛华为杯B题DFT类矩阵的整数分解逼近求解全过程文档及程序

2023年全国研究生数学建模竞赛华为杯

B题 DFT类矩阵的整数分解逼近

原题再现:

  一、问题背景
  离散傅里叶变换(Discrete Fourier Transform,DFT)作为一种基本工具广泛应用于工程、科学以及数学领域。例如,通信信号处理中,常用DFT实现信号的正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)系统的时频域变换(见图1)。另外在信道估计中,也需要用到逆DFT(IDFT)和DFT以便对信道估计结果进行时域降噪(见图2)。
在这里插入图片描述
  在芯片设计中,DFT计算的硬件复杂度与其算法复杂度和数据元素取值范围相关。算法复杂度越高、数据取值范围越大,其硬件复杂度就越大。目前在实际产品中,一般采用快速傅里叶变换(Fast Fourier Transform,FFT)算法来快速实现DFT,其利用DFT变换的各种性质,可以大幅降低DFT的计算复杂度(参见[1][2])。然而,随着无线通信技术的演进,天线阵面越来越大,通道数越来越多,通信带宽越来越大,对FFT的需求也越来越大,从而导致专用芯片上实现FFT的硬件开销也越大。为进一步降低芯片资源开销,一种可行的思路是将DFT矩阵分解成整数矩阵连乘的形式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  可以看到在该方案中,分解后的矩阵元素均为整数,从而降低了每个乘法器的复杂度;另外A_1~A_4的稀疏特性可以减少乘法运算数量。可以看出,这其实是一种精度与硬件复杂度的折中方案,即损失了一定的计算精度,但是大幅降低了硬件复杂度。在对输出信噪比要求不高的情况下可以优先考虑此类方案。
在这里插入图片描述
  目前使用FFT进行DFT计算的方案硬件复杂度较高,因为我们希望研究一种替代方案来降低DFT计算的硬件复杂度,但同时我们对精度也有一定要求。请针对以下问题分别设计分解方法,既能最小化RMSE,同时又使得乘法器的数量尽量少。
  A中矩阵的个数K的取值并没有限制,也是优化的变量之一。但需要注意,一般情况下,K越小,硬件复杂度越低,但是如果增加矩阵的个数可以使得矩阵中包含更多的简单元素(0、±1、±j或(±1±j)),硬件复杂度也可能会降低,因此,需要根据硬件复杂度C的定义合理的设计K。

  问题1:首先通过减少乘法器个数来降低硬件复杂度。由于仅在非零元素相乘时需要使用乘法器,若A_k矩阵中大部分元素均为0,则可减少乘法器的个数,因此希望A_k为稀疏矩阵。对于N=2^t,t=1,2,3,…的DFT矩阵F_N,请在满足约束1的条件下,对最优化问题(6)中的变量A和β进行优化,并计算最小误差( 即(6)的目标函数,下同)和方案的硬件复杂度C(由于本题中没有限定A_k元素的取值范围,因此在计算硬件复杂度时可默认q=16)。

  问题2:讨论通过限制A_k中元素实部和虚部取值范围的方式来减少硬件复杂度的方案。对于N=2^t,t=1,2,3,4,5的DFT矩阵F_N,请在满足约束2的条件下,对A和β进行优化,并计算最小误差和方案的硬件复杂度C。

  问题3:同时限制A_k的稀疏性和取值范围。对于N=2^t,t=1,2,3,4,5的DFT矩阵F_N,请在同时满足约束1和2的条件下,对A和β进行优化,并计算最小误差和方案的硬件复杂度C。

  问题4:进一步研究对其它矩阵的分解方案。考虑矩阵F_N=F_N1⊗F_N2,其中F_N1 和F_N2分别是N_1和N_2维的DFT矩阵,⊗表示Kronecker积(注意F_N非DFT矩阵)。当N_1=4, N_2=8时,请在同时满足约束1和2的条件下,对A和β进行优化,并计算最小误差和方案的硬件复杂度C。

  问题5:在问题3的基础上加上精度的限制来研究矩阵分解方案。要求将精度限制在0.1以内,即RMSE≤0.1。对于N=2^t,t=1,2,3…的DFT矩阵F_N,请在同时满足约束1和2的条件下,对A和β,P进行优化,并计算方案的硬件复杂度C。

  附录一:名词解释
  复数乘法次数/复乘次数:进行复数乘法的次数,例如(1+2j)×(2+2j)为一次复乘。
  硬件复杂度:本题中,仅考虑乘法器带来的硬件复杂度,硬件复杂度仅与乘法器个数和每个乘法器的复杂度相关
  乘法器个数:本题中,乘法器个数即为复乘次数
  单个乘法器的复杂度:单个乘法器的复杂度与乘法器的设计方法和输入数据的位宽等因素相关。在本题中,将乘法器的复杂度简化为仅与输入数据的取值范围相关。对于复数g∈{x+jy│x,y∈P},P={0,±1,±2,…,±2^(q-1) },其与任意复数z相乘的复杂度为q。

整体求解过程概述(摘要)

  离散傅里叶变换(Discrete Fourier Transform,DFT)傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信号从时间域变换到频率域,进而研究信号的频谱结构和变化规律。在芯片设计中,DFT计算的硬件复杂度与其算法复杂度和数据元素取值范围相关。算法复杂度越高、数据取值范围越大,其硬件复杂度就越大。常规的降低硬件复杂度的方法如快速傅里叶变换已经渐渐无法满足芯片日益增长的需求。因此,急需设计新的算法,此算法不仅能是误差控制在一定范围内,又能有效降低 DFT 过程带来的硬件复杂度过大的问题。
  针对第一问,本问不用考虑分解后矩阵A的取值范围的问题,只需要满足分解后的矩阵每行至多只有2个非零元素,以及最小误差尽可能低的约束条件下,计算出近似矩阵的硬件复杂度。本问选择了三种模型来计算 DFT 矩阵的最小误差和硬件复杂度。奇异值分解法通过特征向量将DFT矩阵进行分解,同时还达到了降维的目的,通过将DFT矩阵分解成三个矩阵来使误差达到最小;分块矩阵分解法通过将 DFT 矩阵分解成一个个小的分块矩阵,因为维数越小分块子矩阵形式越简单,误差显著降低;矩阵乘法拟合则利用 DFT 矩阵的对称性和穷举法将矩阵分解成多个矩阵连乘的形式。
  针对第二问,本问不用考虑每行非零元素个数的问题,只需要满足分解后的矩阵每个元素的取值范围,以及在N=2,4,8,16,32的情况以及最小误差尽可能低的约束条件下,计算出近似矩阵的硬件复杂度。本问选择了三种模型来计算 DFT 矩阵的最小误差和硬件复杂度。蝶形运算分解法运用了快速傅里叶变换的思想,在此基础上利用蝶形变换将DFT矩阵进行分解;分块矩阵分解法和矩阵乘法拟合在解决问题二是仍然适用。
  针对第三问,本问需要同时考虑每行非零元素个数的以及分解后的矩阵每个元素的取值范围的约束条件,在此基础上,在最小误差尽可能低的约束条件下,计算出近似矩阵的硬件复杂度。本问选择了两种模型来计算 DFT 矩阵的最小误差和硬件复杂度,即分块矩阵分解法和矩阵乘法拟合。这两种方法在多种约束条件下仍能够很好的解决问题。
  针对第四问,本问需要考虑如何对4点DFT矩阵与8点DFT矩阵的Kronecker积的矩阵FN进行矩阵分解,在最小误差尽可能低的约束条件下,计算出近似矩阵的硬件复杂度。本问选择通过SVD+穷举法的模型来计算DFT矩阵的最小误差和硬件复杂度。首先对4点DFT矩阵与8点DFT矩阵进行SVD分解,之后利用Kronecker积的性质将FN矩阵转化为多个矩阵相乘的形式。
  针对第五问,本问需要同时考虑每行非零元素个数的以及分解后的矩阵每个元素的取值范围的约束条件,在此基础上增加将精度限制在0.1以内,即RMSE≤0.1的要求,计算出近似矩阵的硬件复杂度。本问选择分块矩阵分解模型对第三问结果矩阵进行进一步优化,在满足题目要求下,计算出分解后矩阵的最小误差和硬件复杂度。

模型假设:

  1. 硬件复杂度仅考虑乘法器的复杂度,硬件复杂度与乘法器个数和每个乘法器的复杂度成正比。
  2. 单个乘法器的复杂度简化为仅与复数中实部和虚部的取值范围相关。
  3. 乘法器个数定义为复数乘法的次数,且与0,±1,±j±1±j相乘时不计入乘法次数。

问题分析:

  DFT 是对信号向量进行线性正交变换的一个过程,对一个 N 维的信号直接进行 N 点 DFT 需要进行N2次复数乘法和 N(N − 1)次加法,对于硬件复杂度和算力要求较高。所以需 要设计快速算法将 DFT 计算成本降低,通常使用的方式为使用快速傅里叶变换算法(FFT) 来实现 DFT 过程但 FFT 的硬件开销不满足现有需求需要设计方案降低 FFT 的硬件开销。 一种合理的方式为使用矩阵连乘来拟合 DFT 矩阵,通过设计合理的矩阵可以降低 FFT 中 的硬件开销并满足精度要求。 FFT 中的硬件复杂度主要由矩阵连乘中复数乘法的次数和乘法器的复杂度决定,减少 复数乘法的次数并降低每个乘法器的复杂度可以有效的使得 FFT 中的硬件开销变小。连乘 中矩阵尽可能稀疏会使得乘法的次数有效减少,而乘法器的复杂度可以通过减少乘法元素 的有效位数有效的降低乘法器的复杂度。因此为降低 FFT 中的硬件开销,需要对连乘中矩 阵的稀疏性和元素有效位数进行合理设计,在精度尽可能大的条件下硬件复杂度降低。
  在设计好的矩阵稀疏性和元素有效位数约束下,根据不同维度的 DFT 矩阵来优化需要 连乘的矩阵个数、每个矩阵元素的值和矩阵缩放因子来得到最优的矩阵连乘形式。但在规定矩阵元素虚部和实部均为整数的条件下,直接对每个矩阵元素中的值进行优化为一个庞 大的多元整数优化问题,不是一个明智的思路。因此需要分析 DFT 矩阵的性质和旋转因子Wn的性质并利用这些性质设计合理的优化方案,从而在可能的范围内求解出最合适的矩阵连乘形式。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

部分程序代码如下:
NNN=8;
 O_FN=zeros(1,NNN);
 O_FN_decom= zeros(1,NNN);
 for i=3:NNN+2
 N=2^i;
 FN=produce_DFT(N);
 [FN_decom,N_length]=my_CT(N);
 O_FN(i−2)= calculate_On(FN,N);
 for j=1:N_length
 O_FN_decom(i−2)=O_FN_decom(i−2)+calculate_On(FN_decom{j},
 N);
 end
 end
 semilogy(2.^(3:NNN+2),O_FN,'−*')
 gridon
 holdon
 semilogy(2.^(3:NNN+2),O_FN_decom,'−*')
 for i=1:NNN
 line([2^(i+2),2^(i+2)],[O_FN(i),O_FN_decom(i)],'LineStyle','−−'
 ,'Color','g');
 end
 xlabel('N:矩阵维数')
 ylabel('C:硬件复杂度')
 legend('C(F_N)','C(F_N的精确分解)')
function result= produce_DFT(N)
 result=zeros(N,N);
 w=exp(((−2*pi)/N)*1i);
 result(:,1)=ones(N,1);
 temp=ones(N,1);
 for i=2:N
 temp(i)=w*temp(i−1);
 end
 result(:,2)=temp;
 for i=3:N
 result(:,i)=result(:,i−1).*temp;
 end
function [result,t]=my_CT(N)
 w=exp(((2*pi)/N)*1i);
 t=log2(N);
 result=cell(1,t+1);
 P_eye= eye(N);
 for i=1:t
 temp= zeros(N,N);
 P_temp= zeros(N,N);
 Ni=N/(2^(i−1));
 Ni_2= Ni/2;
 re_temp=zeros(Ni,Ni);
 P=zeros(Ni,Ni);
 for j=1:Ni/2
 re_temp(j,j)=1;
 re_temp(j,j+Ni_2)= w^(2^(i−1)*(j−1));
 P(j,2*j−1)=1;
 end
 for j=Ni_2+1:Ni
 re_temp(j,j−Ni_2)= 1;
 re_temp(j,j)=−w^(2^(i−1)*(j−1−Ni_2));
 P(j,2*(j−Ni_2))=1;
 end
 for j=1:2^(i−1)
 temp(1+Ni*(j−1):Ni*j,1+Ni*(j−1):Ni*j)=re_temp;
 P_temp(1+Ni*(j−1):Ni*j,1+Ni*(j−1):Ni*j)=P;
 end
 result{i}= temp;
 P_eye= P_temp*P_eye;
 end
 result{t+1}=P_eye;
 t=t+1;
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/879769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react 基础语法

前置知识 类的回顾 通过class关键字定义一个类 类名首字母大写 class类有constructor构造器 new 一个类得到一个实例 类还有方法,该方法也会在其原型上 static静态数据,访问静态属性通过 类名.id getter和setter getter:定义一个属性&…

kubernetes存储之GlusterFS(GlusterFS for Kubernetes Storage)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Agent Zero

文章目录 一、关于 Agent Zero现在有了UI:关键概念1、General-purpose 助理2、计算机作为工具3、多智能体合作4、完全可定制和可扩展5、沟通是关键 不错的功能记住已知问题理想的环境 二、Setup - 如何在Windows和MacOS上安装Agent Zero提醒:1、安装Cond…

Tiny-universe学习笔记1:Qwen-blog

本文是参与Datawhale Tiny-universe组队学习的第一篇学习笔记,参考链接:https://github.com/datawhalechina/tiny-universe Tiny-universe学习笔记1:Qwen-blog Qwen整体架构与Llama2类似,具体如下图所示: 其中&#…

深度学习笔记(8)预训练模型

深度学习笔记(8)预训练模型 文章目录 深度学习笔记(8)预训练模型一、预训练模型构建一、微调模型,训练自己的数据1.导入数据集2.数据集处理方法3.完形填空训练 使用分词器将文本转换为模型的输入格式参数 return_tenso…

Java | Leetcode Java题解之第417题太平洋大西洋水流问题

题目&#xff1a; 题解&#xff1a; class Solution {static int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int[][] heights;int m, n;public List<List<Integer>> pacificAtlantic(int[][] heights) {this.heights heights;this.m heights.length;this.n…

【JSrpc破解前端加密问题】

目录 一、背景 二、项目介绍 三、JSrpc 处理前端加密步骤 一、背景 解决日常渗透测试、红蓝对抗中的前端密码加密问题&#xff0c;让你的爆破更加丝滑&#xff1b;降低js逆向加密的难度&#xff0c;降低前端加密逻辑分析工作量和难度。 二、项目介绍 运行服务器程序和js脚本…

springCloud(一)注册中心

1.Eureka 要是user-service服务有多个&#xff0c;order-service该怎么调用&#xff1f; 这就需要用到 注册中心 了 。 1.1 搭建Eureka服务 1. pom引入依赖 <dependencies><!--eureka服务端--><dependency><groupId>org.springframework.cloud</gr…

线程局部变量

开发线程的步骤 为什么要学 ThreadLocal 就是为了防止开发随意选库&#xff0c;设置线程局部变量 因为初始化随着项目启动-创建了连接池&#xff0c;但目前getinfo和login都是走从库&#xff0c;没有分开 所以在service层方法运行时&#xff0c;用ReqAop代码提前算出此方法走…

将有序数组——>二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确答案…

Modbus_RTU和Modbus库

目录 一.Modbus_RTU 1. 与Modbus TCP的区别 2. Modbus RTU特点 3. Modbus RTU协议格式 4. 报文详解 5. 代码实现RTU通信 1. 打开模拟的RTU从机 2. linux端使用代码实现和串口连接 2.1. 框架搭建 2.2 代码 二.Modbus库 1.库函数 一.Modbus_RTU 1. 与Modbus T…

C++初阶学习第六弹------标准库中的string类

目录 一.标准库中的string类 二.string的常用接口函数 2.1string类对象的构造 2.2 string的容量操作 2.3 string类的访问与遍历 2.4 string类对象的修改 2.5 string类常用的非成员函数 三、总结 一.标准库中的string类 可以简单理解成把string类理解为变长的字符数组&#x…

c++234继承

#include<iostream> using namespace std;//public 修饰的成员便俩个和方法都能使用 //protected&#xff1a;类的内部 在继承的子类中可使用 class Parents { public:int a;//名字 protected:int b;//密码 private:int c;//情人public:void printT(){cout << &quo…

C:字符串函数(完)-学习笔记

目录 前言&#xff1a; 1、strstr 1.1 strstr的使用 4.2 strstr的模拟实现 5、strtok 5.1 strtok函数的介绍 5.2 strtok函数的使用 6、strerror 前言&#xff1a; 这篇文章将介绍strstr函数&#xff0c;strtok函数&#xff0c;strerror函数 1、strstr 1.1 strstr的使用…

RabbitMQ 高级特性——持久化

文章目录 前言持久化交换机持久化队列持久化消息持久化 前言 前面我们学习了 RabbitMQ 的高级特性——消息确认&#xff0c;消息确认可以保证消息传输过程的稳定性&#xff0c;但是在保证了消息传输过程的稳定性之后&#xff0c;还存在着其他的问题&#xff0c;我们都知道消息…

Linux内核结构

Linux内核结构 文章目录 Linux内核结构一、Linux内核结构介绍1.1 总体结构&#xff1a;1.2 Linux内核结构框图&#xff1a; 二、图解Linux系统架构三、shell3.1 shell的含义&#xff1a;3.2 shell的作用&#xff1a;3.3 shell的类型&#xff1a;3.4 shell的使用&#xff1a;3.5…

安泰电压放大器设计方法是什么样的

电压放大器是电子领域中常用的设备&#xff0c;用于将低电压信号放大成高电压信号。电压放大器在信号处理、通信系统、仪器测量、控制系统、医疗设备和研究和实验室等领域都有着广泛的应用。 电压放大器的设计方法主要包括选择合适的放大器拓扑结构、选择适当的放大器参数以及进…

72v-80V降5V1.5A恒压降压WT6035

72v-80V降5V1.5A恒压降压WT6035 WT6035 是一款高压降压开关稳压器&#xff0c;可用于将 72V - 80V 的电压降为 5V、1.5A 的恒压输出&#xff0c;以下是一些关于它的特点及应用注意事项&#xff1a; 芯片特点&#xff1a; 宽电压输入范围&#xff1a;输入电压范围为 5V 至 100V…

设计模式之命令模式:从原理到实战,深入解析及源码应用

&#x1f3af; 设计模式专栏&#xff0c;持续更新中 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 命令模式 什么是命令模式&#xff1f; 命令模式&#xff08;Command Pattern…

sensitive-word 敏感词 v0.20.0 数字全部匹配,而不是部分匹配

敏感词系列 sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word-admin v1.3.0 发布 如何支持分布式部署&#xff1f; 01-开源敏感词工具入门使用 02-如何实现一个敏感词工具&#xff1f;违禁词实现思路梳理 03-敏感词之 StopWord 停止词优化与特殊符号 04-…