个人简历
个人基本信息
获奖记录
2023年全国大学生电子设计竞赛省级一等奖
2022年美国大学生数学竞赛H奖
2023年全国大学生数学竞赛二等奖
项目经历
信号分离装置——–(2023电赛项目)
通过STM32的ADC采集输入信号,并通过fft识别输入信号的频谱和类型,并把输入结果送入dds进行信号分离,在本次的项目中作为队长负责软件部分与协调成员开发流程。
基于元胞自动机的预测植生长模型——-(2022年美国数学建模大赛项目)
在本次项目中负责前期的数学模型建立以及公式推导,通过查询不同的论文并将论文中的数学模型进行综合,得到精确度与计算复杂度适中的模型,并进行代码编写。
基于FPGA的简单cpu
通过游玩 图灵完备 游戏时学习了如何从一个个简单的门电路搭建一个完整的CPU,之后通过verilog语法完成编写了一个个cpu基础模块以及其的sumulink测试代码,最后在vivado平台整合代码完成了一个简单cpu的制作。
基于matlab的DNN数字识别
在学习了吴恩达的机器学习课程后,查询了关于神经网络的模块数学原理,用matlab手搓了一个简单的D ...
信号与系统--伯德图与零极点
前言今天在做数字信号处理的期末报告时,用到了一个matlab中的一个函数 buttord这个函数通过给出的滤波器通带与阻带的频率响应得到滤波器的阶数与截止频率,顿时想起来了在电赛打校赛的时候设计滤波器时也是需要计算滤波器的阶数,当时只知道滤波器阶数与阻带下降速率是10db倍数的关系,在最近复习专业课时想起来了伯德图与其的联系,于是有了这篇文章
伯德图的背景在计算机没有出现的年代中,对于一个多阶的系统,想要通过单纯的计算描述出它的频率响应与相位是非常困难的,因为我要余姚一种近似的方法来描述他们,这时一位伟大的工程师出现了,他就是伯德,他发明了一种新的方法来描述系统的频率响应,这种方法就是伯德图
伯德图的坐标系首先我们先来看看系统的传递函数频响的零极点表示公式
信号与系统这本书中我们可以知道可以把这样的方程转化为多个一次函数相乘的形式例如
转化为
这时候log函数有着把函数转为加法的性质,这样我们就成功将多极点零点系统能变为单极点单零点系统的线性叠加。而我们要将底数设置为多少呢 ,在工程中我们一般设置底数为10且系数也为10,但是伯德图经常应用于能量分析中于是其系数就变为20
伯德图的性 ...
turbo码---编码(二)---卷积码
前言卷积码是一种重要的纠错编码方式,广泛应用于数字通信系统中,以提高数据传输的可靠性。它通过在发送信息中添加冗余数据来实现错误检测和修正。不同于块码直接处理整个数据块,卷积码对数据流进行连续的处理,以一种滑动窗口的方式逐步编码输入数据流。卷积码的核心在于使用一组线性反馈移位寄存器(LFSR)来生成冗余数据。这些寄存器根据设定的生成多项式对输入数据进行处理,生成额外的校验位。通过这种方式,即使在传输过程中一部分数据受到干扰或丢失,接收端也能够利用剩余接收到的数据和冗余校验位,通过解码算法(如维特比算法)恢复原始信息。卷积码的性能由其约束长度(寄存器的大小)、码率(原始数据位与添加的冗余位的比例)和多项式确定。码率越低,冗余度越高,纠错能力越强,但同时也意味着传输效率的降低。因此,在设计通信系统时,需要根据具体的应用需求和信道条件,权衡卷积码的码率和约束长度,以达到最佳的错误纠正性能和数据传输效率的平衡。
个人理解本章中使用的卷积码不是普通的卷积码,是一种类似IIR的卷积码,这种卷积码的反馈是无穷反馈,这样的结构打破了线性,从而有了更有效的码字距离,更好的纠错能力,更小的误码平台。这一部分 ...
turbo码---编码(一)---交织器
前言交织器的设计对于Turbo码的性能至关重要。一个好的交织器可以有效地打散序列中的错误,使得在解码过程中,通过迭代算法,可以更有效地消除错误,提高解码的准确率。在实践中,交织器的设计需要考虑到编解码的复杂度和性能要求,以达到最佳的编码效果。Turbo码因其出色的近似香农极限性能和高效的迭代解码算法,广泛应用于深空通信、移动通信以及数据传输等多个领域。
个人理解在信道编码中,一般来说更容易纠正突发错误而不是连续错误,但是在现实生活中大多数错误都是一段的连续错误,这时候信道编码就显得无能为力,所以我们需要找到一种方法使得连续错误转成突然错误,这就是交织器的功能。
步骤交织器的种类有很多,他们有自身适应的环境,在本章中将介绍一种简单的交织器,如图所示:我们将数据从左往右写入之后从上到下读出,这种简答的方法能有效的将连续错误转成突然错误,并且计算量很小。
编码后的顺序数学公式如下:其中K为信息迾,S为输入索引,f1,f2为特定信息长度(K)下的特点数字 (本章中K为40,f1为3,f2为10) $h(s) = (f_1s + f_2s^ ...
turbo码---(导言)
前言学完通信原理后,老师留下了通信原理课设的作业,原本打算是组队手搓一个通信系统,但是之后老师改为单人作业,于是选择的信道编码这个课题,先是实现了卷积码的复现,采用了维特比译码,在了解了turbo后看到了译码的涡轮结构大为震撼,于是便有复现的打算,接下来便展示复现过程,turbo的编译码涉及到了高等代数以及概率论的知识,本次复现过程会展示数学原理的推导参考资料但不会过多提及数学原理.
介绍Turbo码,作为一种前向纠错码(FEC),在1993年由Claude Berrou等人提出,标志着通信领域的一次重大突破。它的核心优势在于提供接近香农极限的纠错能力,大幅提高了数据传输的可靠性和效率,尤其是在信噪比较低的通信环境中。Turbo码利用了一种称为“软输入软输出”(SISO)的迭代解码技术,通过两个或多个并行的卷积编码器和一个交织器来增强编码的随机性,从而提高纠错性能。在每次迭代过程中,解码器会互相交换信息,逐步提高解码的准确性。这种独特的迭代解码过程是Turbo码区别于其他类型纠错码的关键特点。由于其出色的性能,Turbo码被广泛应用于无线通信、深空通信、数据存储等多个领域,包括3G、4 ...
基于图灵完备的cpu设计(终)
断罪之眼的最终乐章[请为一切不真实之物感到骄傲,因为我们高于这个世界!因为,吾等金碧辉煌的王国,是狭小又禁忌的乐土]
介绍经过了这么多章的学习,我们终于把所有cpu的功能模块全部做完了,那么就让我们拼接在一起吧
拼接顺序首先 ram与pc计数器是整个cpu的发动者,有了他们,cpu才能发动。接着pc寄存器的擦写模式由功能解码器控制并且擦写数值由reg3给出。接着将立即数模块的输出连接到reg0上,reg0的save开启条件也接受功能解码器控制,接着将判决器的输入与reg3的输出相连,判决器的输出与pc计数器相连最后再将alu的输入与reg1与reg2的输出相连,alu的输出与总线相连
代码实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210 ...
基于图灵完备的cpu设计(八)--ram储存器
规则之树———ram储存器介绍在前面的章节中,我们知道了ram存放着编译完后的cpu指令,就是这些指令让我们完成了一系列工作操作。所以在本章中我们将搭建一个简单的8位ram。
引脚介绍
clk 时钟引脚
rst 复位引脚
we 读写使能引脚 为1时写,0时读
data_in 数据输入引脚
addr 地址输入引脚
data_out 数据输出引脚
功能介绍这个简单的ram储存器,我们只实现了读和写功能,读功能是读取地址addr所对应的内存中的数据,写功能是向地址addr所对应的内存中写入数据data_in。we控制模式选择,为1时写,为0时读。
代码实现123456789101112131415161718192021222324252627282930313233343536module ram_8bit( input reg clk, // 时钟信号 input reg rst, // 复位信号 input reg we, // 写使能信号,高电平有效 input reg [7:0] data_in, // 数据输入 input reg [7:0] a ...
基于图灵完备的cpu设计(七)--PC计数器
前进律动者———PC计数器介绍我们要写的程序在编译器便后成为了一串串cpu指令集存在ram中,我们需要一个计数器产生地址数据给ram寄存器从而取出指令,这个计数器就是PC(program counter)寄存器,简称程序计数器。
引脚介绍
clk 时钟信号线,决定了cpu的频率
reset 复位信号,高脉冲后计数器归零
model_sel 0为步进模式1为擦写模式
load_alue 擦写模式时载入的值
pc 向ram输出地址
功能介绍PC计数器有两个模式,步进模式和擦写模式,步进模式下,PC计数器在时钟上升沿时加一,擦写模式下,PC计数器在时钟上升沿时被载入load_value。向ram输出地址值
代码实现1234567891011121314151617181920module pc_counter( input reg clk, // 时钟信号线,决定了CPU的频率 input reg reset, // 复位信号,高脉冲后计数器归零 input reg model_sel, // 模式选择,0为步进模式,1为擦写模式 ...
基于图灵完备的cpu设计(六)--判决器
跳转的称量者———判决器介绍在我们编写程序的时候我们会用到if语句判断一个条件是否成立然后执行不同的代码块 ,或者用while循环执行特定的代码块。这种让pc指针跳转的模块即为判决器(arbiter)
本章的判决器的功能为通过判决器指令判断reg3内的值是否符合我们的判断条件,如果符合会向pc指针写入reg0内的值,如果不符合pc指针自加。
引脚介绍
reg_0 连接reg_0的always端口
reg_3 连接reg_3的laways端口
arbiter_order 判决器的指令输入端口
arbiter_sel 的使能端口
pc_sel pc寄存器的写入使能端口
arbiter_out的输出端口
判决器的指令表如下: 注:预设值(anchoring_number)为判决器的标准值,在图灵完备中判决器为有符号判决器,本判决器为无符号判决器,故本章设定值为 8’b 11110000
功能介绍我们来看看如何使用判决器来进行判断操作,例如我们判断是否reg3的值是否等于预设值,如果等于跳转到特定位置,那么我们便需要先将要跳转位置的地址写入reg0,然后将reg3 ...
基于图灵完备的cpu设计(五)--立即数
自我的认定———立即数介绍在前面的介绍中,我们只能重cpu的外界引脚读取非0数据,在现实使用中我们经常要使用常数来进行运算,如果还是从外界读取娜美就会变得非常麻烦,所以我们需要一个功能帮我们从rom中直接读取数据,这个功能就是立即数模块。
因为当指令集中使用立即数功能时需要用第七位与第六位,所以只有第五位到第零位来表示立即数,所以立即数的范围只有6位
引脚介绍.count_in 立即数数据输入 六位.count_sel 立即数功能使能位.count_out 立即数输出 (输出到总线) 八位 第七位与第六位总为0
功能介绍从引脚定义中我们能发现,其实立即数功能模块就是简单的把前两位置为0后输出到总线上。
代码实现12345678910111213141516171819module immediate( input reg [5:0] count_in, input reg count_sel, output [7:0] count_out);reg [7:0] count_out_r=8'b 00000000;assign count_out = cou ...