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

基于FPGA实现正弦插值算法

1、正弦插值的算法分析

1.1 信号在时域与频域的映射关系

        在进行正弦算法分析之前,我们回顾一下《数字信号处理》课程中,对于信号在时域与频域之间的映射关系,如下图。

 

        对于上图中的原始信号x(t),使用ADC对信号进行采样,即实现了时域信号的离散化,得到x[k]。根据时域与频域之间的映射关系:时域的离散化对应着频域的周期化,即x[k]的频域响应为X(e^{j\Omega })

        那么离散化的x[k]如何还原为原来的x(t)呢?时域上分析较为复杂,我们可以从频域上进行分析,即如何将频域响应X(e^{j\Omega })还原成X(jw)。这样就比较直观了,只需要截取X(e^{j\Omega })一个周期的信号,就可以还原成X(jw),示例如下图。

 1.2 sinc函数

         上面用到的窗函数,实际上是一个理想的低通滤波器,其时域形态是什么样子的呢?如下图。

        其时域形态公式:sinc(t)=\frac{sin(\pi t))}{\pi t} ,sinc函数在频域上是一个矩形的方窗,如下图。

 1.3 使用sinc函数实现正弦插值的算法分析

        综上所述,对于我们可以使用sinc函数实现离散信号还原为连续信号,即使用sinc函数实现离散信号的无限插值。

        而频域的乘积对应着时域的卷积,因此我们可以将离散的采样信号与sinc函数进行卷积运算,从而获得插值后的信号。

        y(n)=\sum x(\imath)h(n-\imath )

        其中,y(n)为插值后信号;x(n)为待插值的离散信号;h(n)为sinc函数,也称为插值核或者插值因子。

        假设有一个离散信号x(n),含有8个离散点,x(n)={-10,0,10,0,-10,0,10,0};如下图:

         我们使用前后共计8个原始采样点,来求插值点x(0.5)的数值。套用上面描述的公式y(n)=\sum x(\imath)h(n-\imath ),即x(0.5)=x(-3)h(0.5-(-3)) +  x(-2)h(0.5-(-2)) + x(-1)h(0.5-(-1)) + x(0)h(0.5-(0)) + x(1)h(0.5-(1)) + x(2)h(0.5-(2)) + x(3)h(0.5-(3)) =-6.3056,即求得插值点的数值。

         根据这种思想,我们可以无限的求得每个插值点的数值。那么如何在工程也能够中使用sinc函数实现信号的插值,是我们接下来要讲述的。

2、使用matlab计算插值核

        在使用FPGA实现插值算法时,由于sinc函数的计算实现起来比较消耗硬件资源,所以一般预先计算好插值核存放在ROM或者寄存器中,直接进行调用。

        假设我们要使用前后8个点计算插值,插值倍数为10,那么使用matlab计算插值核的代码如下:

interp_mul = 10; %插值倍数为10
orig_point_num = 8;%原始点数8个coe_group = zeros(interp_mul,orig_point_num); %定义系数组
for group = 1:1:interp_mul %计算interp_mul组系数for Hn = 1:1:orig_point_num %计算每组系数的orig_point_num个加权值if(group == 1)if(Hn==4)coe_group(group,Hn) = 1; %原始点保持数据不变[0,0,0,1,0,0,0,0]elsecoe_group(group,Hn) = 0; %原始点保持数据不变[0,0,0,1,0,0,0,0]endelsecoe_group(group,Hn) = sinc(4- Hn + 0.1*(group-1));%找规律映射endend
end

        运行结果保存在coe_group数组中,结果如下:

         上述算法计算得到的插值核为小数,而FPGA计算小数运算时,需要现将数值左移相应位数进行放大,方便进行计算,输出结果时,截取高bit即可。由于后续FPGA实现卷积和时使用18bits的插值核进行运算,因此实际工程中的matlab代码如下:

interp_mul = 10; %插值倍数为10
orig_point_num = 8;%原始点数8个coe_group = zeros(interp_mul,orig_point_num); %定义系数组
for group = 1:1:interp_mul %计算interp_mul组系数for Hn = 1:1:orig_point_num %计算每组系数的orig_point_num个加权值if(group == 1)if(Hn==4)coe_group(group,Hn) = 1; %原始点保持数据不变[0,0,0,1,0,0,0,0]elsecoe_group(group,Hn) = 0; %原始点保持数据不变[0,0,0,1,0,0,0,0]endelsecoe_group(group,Hn) = sinc(4- Hn + 0.1*(group-1)) *2^17;%找规律映射,小数放大2^17倍endend
end

结果如下:

 3、使用FPGA实现离散采样点的插值

         本文中仅使用一个测试程序,说明FPGA实现插值的原理,结构相对简单,架构图如下:

         离散采样RAM模块代码如下:

module disc_samp_gen(input clk,input disc_rd,//读待插值数据标志output [7:0] disc_samp  //离散采样点输出 有符号数据);
reg [1:0]addra=0;always@(posedge clk)
beginif(disc_rd)addra <= addra + 1'b1;
endDataSrc_ROM DataSrc_ROM (.clka(clk),    // input wire clka.addra(addra),  // input wire [1 : 0] addra.douta(disc_samp)  // output wire [7 : 0] douta
);endmodule

         插值处理模块,主要通过乘法器实现卷积和,如下:

module sinc_process(input clk,input sinc_en,//插值使能标志input [7:0]disc_samp,//待插值数据,有符号数output disc_rd,//读取插值数据标志output sinc_valid,//插值数据有效标志output [7:0]sinc_data//插值后数据);
//插值倍数10,使用8个离散采样点进行插值处理
第0组插值核  
//localparam [17:0] group0_coe[7:0] = {18'h0,18'h0,18'h0,18'h0,
//                                     18'h1FFFF,18'h0,18'h0,18'h0};//临时粗略将18'h1FFFF视为1
第1组插值核  
//localparam [17:0] group1_coe[7:0] = {18'h3F317,18'h0115D,18'h3E57F,18'h037F5,
//                                     18'h1F79E,18'h3D238,18'h017FB,18'h3EFC2};
第2组插值核  
//localparam [17:0] group2_coe[7:0] = {18'h3E6CB,18'h02236,18'h3CAC8,18'h077BE,
//                                     18'h1DEF8,18'h3B02C,18'h02B8A,18'h3E211};
第3组插值核  
//localparam [17:0] group3_coe[7:0] = {18'h3DC5E,18'h030D5,18'h3B272,18'h0BC5B,
//                                     18'h1B77F,18'h39A94,18'h03953,18'h3D80C};
第4组插值核  
//localparam [17:0] group4_coe[7:0] = {18'h3D4F2,18'h03B9D,18'h39F21,18'h10254,
//                                     18'h1837E,18'h3914A,18'h04095,18'h3D26A};
第5组插值核  
//localparam [17:0] group5_coe[7:0] = {18'h3D170,18'h04130,18'h3935A,18'h145F3,
//                                     18'h145F3,18'h3935A,18'h04130,18'h3D170};
第6组插值核  
//localparam [17:0] group6_coe[7:0] = {18'h3D26A,18'h04095,18'h3914A,18'h1837E,
//                                     18'h10254,18'h39F21,18'h03B9D,18'h3D4F2};
第7组插值核  
//localparam [17:0] group7_coe[7:0] = {18'h3D80C,18'h03953,18'h39A94,18'h1B77F,
//                                     18'h0BC5B,18'h3B272,18'h030D5,18'h3DC5E};
第8组插值核  
//localparam [17:0] group8_coe[7:0] = {18'h3E211,18'h02B8A,18'h3B02C,18'h1DEF8,
//                                     18'h077BE,18'h3CAC8,18'h02236,18'h3E6CB};
第9组插值核  
//localparam [17:0] group9_coe[7:0] = {18'h3EFC2,18'h017FB,18'h3D238,18'h1F79E,
//                                     18'h037F5,18'h3E57F,18'h0115D,18'h3F317};//第0组插值核  
localparam [17:0] group0_coe[7:0] = {18'h0,18'h0,18'h0,18'h1FFFF,18'h0,18'h0,18'h0,18'h0};//临时粗略将18'h1FFFF视为1
//第1组插值核  
localparam [17:0] group1_coe[7:0] = {18'h3EFC2,18'h017FB,18'h3D238,18'h1F79E,18'h037F5,18'h3E57F,18'h0115D,18'h3F317};
//第2组插值核  
localparam [17:0] group2_coe[7:0] = {18'h3E211,18'h02B8A,18'h3B02C,18'h1DEF8,18'h077BE,18'h3CAC8,18'h02236,18'h3E6CB};
//第3组插值核  
localparam [17:0] group3_coe[7:0] = {18'h3D80C,18'h03953,18'h39A94,18'h1B77F,18'h0BC5B,18'h3B272,18'h030D5,18'h3DC5E};
//第4组插值核  
localparam [17:0] group4_coe[7:0] = {18'h3D26A,18'h04095,18'h3914A,18'h1837E,18'h10254,18'h39F21,18'h03B9D,18'h3D4F2};
//第5组插值核  
localparam [17:0] group5_coe[7:0] = {18'h3D170,18'h04130,18'h3935A,18'h145F3,18'h145F3,18'h3935A,18'h04130,18'h3D170};
//第6组插值核  
localparam [17:0] group6_coe[7:0] = {18'h3D4F2,18'h03B9D,18'h39F21,18'h10254,18'h1837E,18'h3914A,18'h04095,18'h3D26A};
//第7组插值核  
localparam [17:0] group7_coe[7:0] = {18'h3DC5E,18'h030D5,18'h3B272,18'h0BC5B,18'h1B77F,18'h39A94,18'h03953,18'h3D80C};
//第8组插值核  
localparam [17:0] group8_coe[7:0] = {18'h3E6CB,18'h02236,18'h3CAC8,18'h077BE,18'h1DEF8,18'h3B02C,18'h02B8A,18'h3E211};
//第9组插值核  
localparam [17:0] group9_coe[7:0] = {18'h3F317,18'h0115D,18'h3E57F,18'h037F5,18'h1F79E,18'h3D238,18'h017FB,18'h3EFC2};reg [17:0] sinc_coe [7:0];//对应插值点使用的插值核
reg [3:0] sinc_cnt = 0;//插值计数,0时为原始点,1~9为插值点,其余数值保留
reg [7:0] samp_data [7:0];//每次从RAM读取数据时进行锁存更新//8个乘法结果
reg [25:0] mult_data[7:0];assign disc_rd = (sinc_cnt == 4'd8) ? 1'b1:1'b0; //插值第8个点时,读取新的数据//插值倍数10,插值点计数
always@(posedge clk)
beginif(sinc_en == 1'b1) beginif(sinc_cnt == 4'd9) sinc_cnt <= 4'd0;elsesinc_cnt <= sinc_cnt + 1;endelsesinc_cnt <= 4'd0;
end
//原始点锁存
always@(posedge clk)
beginif(sinc_en == 1'b1 && sinc_cnt == 4'd0) begin //插值使能samp_data[0] <= disc_samp;//新输入的点samp_data[1] <= samp_data[0];samp_data[2] <= samp_data[1];samp_data[3] <= samp_data[2];samp_data[4] <= samp_data[3];samp_data[5] <= samp_data[4];samp_data[6] <= samp_data[5];samp_data[7] <= samp_data[6];end
end//插值核系数选择
always@(posedge clk)
begincase(sinc_cnt)4'd0:sinc_coe <= group0_coe;//原始点系数4'd1:sinc_coe <= group1_coe;//第1个插值点系数4'd2:sinc_coe <= group2_coe;//第2个插值点系数4'd3:sinc_coe <= group3_coe;//第3个插值点系数4'd4:sinc_coe <= group4_coe;//第4个插值点系数4'd5:sinc_coe <= group5_coe;//第5个插值点系数4'd6:sinc_coe <= group6_coe;//第6个插值点系数4'd7:sinc_coe <= group7_coe;//第7个插值点系数4'd8:sinc_coe <= group8_coe;//第8个插值点系数4'd9:sinc_coe <= group9_coe;//第9个插值点系数default:;endcase
end//乘法器0
mult_gen mult_gen_0 (.CLK(clk),  // input wire CLK.A(samp_data[0]),      // input wire [7 : 0] A.B(sinc_coe[0]),      // input wire [17 : 0] B.P(mult_data[0])      // output wire [25 : 0] P
);//乘法器1
mult_gen mult_gen_1 (.CLK(clk),  // input wire CLK.A(samp_data[1]),      // input wire [7 : 0] A.B(sinc_coe[1]),      // input wire [17 : 0] B.P(mult_data[1])      // output wire [25 : 0] P
);//乘法器2
mult_gen mult_gen_2 (.CLK(clk),  // input wire CLK.A(samp_data[2]),      // input wire [7 : 0] A.B(sinc_coe[2]),      // input wire [17 : 0] B.P(mult_data[2])      // output wire [25 : 0] P
);//乘法器3
mult_gen mult_gen_3 (.CLK(clk),  // input wire CLK.A(samp_data[3]),      // input wire [7 : 0] A.B(sinc_coe[3]),      // input wire [17 : 0] B.P(mult_data[3])      // output wire [25 : 0] P
);//乘法器4
mult_gen mult_gen_4 (.CLK(clk),  // input wire CLK.A(samp_data[4]),      // input wire [7 : 0] A.B(sinc_coe[4]),      // input wire [17 : 0] B.P(mult_data[4])      // output wire [25 : 0] P
);//乘法器5
mult_gen mult_gen_5 (.CLK(clk),  // input wire CLK.A(samp_data[5]),      // input wire [7 : 0] A.B(sinc_coe[5]),      // input wire [17 : 0] B.P(mult_data[5])      // output wire [25 : 0] P
);//乘法器6
mult_gen mult_gen_6 (.CLK(clk),  // input wire CLK.A(samp_data[6]),      // input wire [7 : 0] A.B(sinc_coe[6]),      // input wire [17 : 0] B.P(mult_data[6])      // output wire [25 : 0] P
);//乘法器7
mult_gen mult_gen_7 (.CLK(clk),  // input wire CLK.A(samp_data[7]),      // input wire [7 : 0] A.B(sinc_coe[7]),      // input wire [17 : 0] B.P(mult_data[7])      // output wire [25 : 0] P
);//使用加法器实现有符号数相加//二点相加
wire [25:0] add2_0;
wire [25:0] add2_1;
wire [25:0] add2_2;
wire [25:0] add2_3;
adder2 adder2_inst0 (.A(mult_data[0]),      // input wire [25 : 0] A.B(mult_data[1]),      // input wire [25 : 0] B.CLK(clk),  // input wire CLK.S(add2_0)      // output wire [26 : 0] S
);adder2 adder2_inst1 (.A(mult_data[2]),      // input wire [25 : 0] A.B(mult_data[3]),      // input wire [25 : 0] B.CLK(clk),  // input wire CLK.S(add2_1)      // output wire [26 : 0] S
);adder2 adder2_inst2 (.A(mult_data[4]),      // input wire [25 : 0] A.B(mult_data[5]),      // input wire [25 : 0] B.CLK(clk),  // input wire CLK.S(add2_2)      // output wire [26 : 0] S
);adder2 adder2_inst3 (.A(mult_data[5]),      // input wire [25 : 0] A.B(mult_data[6]),      // input wire [25 : 0] B.CLK(clk),  // input wire CLK.S(add2_3)      // output wire [26 : 0] S
);//四点相加
reg [25:0] add4_0;
reg [25:0] add4_1;
adder4 adder4_inst0 (.A(add2_0),      // input wire [26 : 0] A.B(add2_1),      // input wire [26 : 0] B.CLK(clk),  // input wire CLK.S(add4_0)      // output wire [27 : 0] S
);adder4 adder4_inst1 (.A(add2_2),      // input wire [26 : 0] A.B(add2_3),      // input wire [26 : 0] B.CLK(clk),  // input wire CLK.S(add4_1)      // output wire [27 : 0] S
);//八点相加
wire [25:0] add8;
adder8 adder8 (.A(add4_0),      // input wire [26 : 0] A.B(add4_1),      // input wire [26 : 0] B.CLK(clk),  // input wire CLK.S(add8)      // output wire [27 : 0] S
);assign sinc_valid = 1'b1;
assign sinc_data = add8[25:18];
endmodule

        编写testbench,对插值模块进行仿真验证,testbench代码如下:

module testbench();
reg clk = 0; //100M时钟always 
begin# 5clk <= ~clk;
endwire disc_rd;//采样点有效标志
wire [7:0] disc_samp;  //离散采样点输出
disc_samp_gen disc_samp_gen(.clk(clk),.disc_rd(disc_rd),//采样点有效标志.disc_samp(disc_samp)//离散采样点输出);sinc_process sinc_process(.clk(clk),.sinc_en(1'b1),.disc_rd(disc_rd),//采样点有效标志.disc_samp(disc_samp),//离散采样点输出.sinc_valid(),//插值数据有效标志.sinc_data()//插值后数据);endmodule

仿真验证结果如下:

         可以看到,图中黄色部分为原始采样点的直线连接波形,紫色部分为正弦插值后的波形。正弦插值仿真成功。

vivado工程以及学习sinc插值的过程文件(主要是为了存档,方便后续自己使用):https://download.csdn.net/download/yindq1220/87557975?spm=1001.2014.3001.5501

相关文章:

基于FPGA实现正弦插值算法

1、正弦插值的算法分析 1.1 信号在时域与频域的映射关系 在进行正弦算法分析之前&#xff0c;我们回顾一下《数字信号处理》课程中&#xff0c;对于信号在时域与频域之间的映射关系&#xff0c;如下图。 对于上图中的原始信号x(t)&#xff0c;使用ADC对信号进行采样&#xff0…...

JavaWeb_会话技术

文章目录会话跟踪技术的概述Cookie概念Cookie工作流程Cookie基本使用发送Cookie获取CookieCookie原理分析Cookie的使用细节Cookie的存活时间Cookie存储中文SessionSession的基本使用概念工作流程Session的基本使用Session的原理分析Session的使用细节Session的钝化与活化Sessio…...

Reactor响应式流的核心机制——背压机制

响应式流是什么&#xff1f; 响应式流旨在为无阻塞异步流处理提供一个标准。它旨在解决处理元素流的问题——如何将元素流从发布者传递到订阅者&#xff0c;而不需要发布者阻塞&#xff0c;或订阅者有无限制的缓冲区或丢弃。 响应式流模型存在两种基本的实现机制。一种就是传统…...

[数据结构]栈的深入学习-java实现

CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈&#xff1a;一种…...

网络编程基础

1 互联网的本质硬件设备有了操作系统&#xff0c;然后装上软件之后我们就能够正常使用了&#xff0c;然后也只能自己使用。像这样&#xff0c;每个人都拥有一台自己的机器&#xff0c;然而彼此孤立。如何才能和大家一起愉快的玩耍&#xff1f;什么是网络&#xff1f;简单来说&a…...

华为OD机试题 - 数列还原(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:数列还原题目输入输出示例一输入输出Code代码解析版权说明华为O…...

10-Oracle存储过程(创建,修改,使用及管理)

本章内容 1、我们为什么要用存储过程? 2、存储过程是如何定义和维护的? 3、我们如何调用存储过程? 4、存储过程中常用的复合数据处理方式及CTE 5、存储过程如何进行异常处理? 6、存储过程如何进行事务处理? 7、我们应如何优化存储过程? 1、我们为什么要用存储过程…...

创建线程的三种方法

文章目录1、创建一个类实现Runnable接口&#xff0c;并重写run方法。2、创建一个类继承Thread类&#xff0c;并重写run方法。3、实现Callable接口&#xff0c;重写call()方法&#xff0c;这种方式可以通过FutureTask获取任务执行的返回值。4、run()方法和start()方法有什么区别…...

第一章---Pytorch快速入门---第三节---pytorch中的数据操作和预处理

目录 1.高维数组 1.1 回归数据准备 1.2 分类数据准备 2. 图像数据 1.torchvision.datasets模块导入数据并预处理 2.从文件夹中导入数据并进行预处理 pytorch中torch.utils.data模块包含着一些常用的数据预处理的操作&#xff0c;主要用于数据的读取、切分、准备等。 常用…...

【代码随想录训练营】【Day38】第九章|动态规划|理论基础|509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯

理论基础 动态规划与贪心的区别并不是学习动态规划所必须了解的&#xff0c;所以并不重要。 想要了解动态规划算法题的特点&#xff0c;可以直接做下面三道入门简单题练练手感&#xff0c;找找感觉&#xff0c;很快就能体会到动态规划的解题思想。 总结成一句话就是&#xf…...

华为OD机试题 - 快递货车(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:快递货车题目输入输出示例一输入输出Code解题思路版权说明华为O…...

前端——7.图像标签和路径

这篇文章&#xff0c;我们来讲解一下图像标签 目录 1.图像标签 1.1介绍 1.2实际展示 1.3图像标签的属性 1.3.1 alt属性 1.3.2 title属性 1.3.3 width / height 属性 1.3.4 border属性 1.4注意事项 2.文件夹 2.1目录文件夹和根目录 2.2 VSCode打开目录文件夹 3.路…...

java -- stream流

写在前面: stream流一直在使用&#xff0c;但是感觉还不够精通&#xff0c;现在深入研究一下。 stream这个章节中&#xff0c;会用到 函数式接口–lambda表达式–方法引用的相关知识 介绍 是jdk8引进的新特性。 stream流是类似一条流水线一样的操作&#xff0c;每次对数据进…...

【Spring6】| Bean的四种获取方式(实例化)

目录 一&#xff1a;Bean的实例化方式 1. 通过构造方法实例化 2. 通过简单工厂模式实例化 3. 通过factory-bean实例化 4. 通过FactoryBean接口实例化 5. BeanFactory和FactoryBean的区别&#xff08;面试题&#xff09; 6. 使用FactoryBean注入自定义Date 一&#xff1a…...

01: 新手学SpringCloud前需知道的5点

目录 第一点&#xff1a; 什么是微服务架构 第二点&#xff1a;为什么需要学习Spring Cloud 第三点&#xff1a; Spring Cloud 是什么 第四点&#xff1a; SpringCloud的优缺点 1、SpringCloud优点 2、SpringCloud缺点 第五点&#xff1a; SpringCloud由什么组成 1&…...

ubuntu apt安装arm交叉编译工具

查找查找编译目标为32位的gcc-arm交叉编译器命令apt-cache search arm|awk index($1,"arm")!0 {print}|grep gcc-arm\|g-arm #或者 apt-cache search arm|awk index($1,"arm")!0 {print}|grep -E gcc-arm|g\\-arm输出如下g-arm-linux-gnueabihf - GNU C co…...

阿里云一面经历

文章目录 ES 查询方式都有哪些?1 基于词项的查询term & terms 查询Fuzzy QueryWildcard Query2 基于全文的查询Match QueryQuery String QueryMatch Phrase Query3 复合查询Bool QueryElasticsearch 删除原理ES 大文章怎么存arthas 常用命令arthas 排查问题过程arthas 工作…...

Java Stream中 用List集合统计 求和 最大值 最小值 平均值

对集合数据的统计&#xff0c;是开发中常用的功能&#xff0c;掌握好Java Stream提供的方法&#xff0c;避免自己写代码统计&#xff0c;可以提高工作效率。 先造点数据&#xff1a; pigs.add(new Pig(1, "猪爸爸", 31, "M", false)); pigs.add(new Pig(…...

【Linux】多线程---线程控制

进程在前面已经讲过了&#xff0c;所以这次我们来讨论一下多线程。前言&#xff1a;线程的背景进程是Linux中资源及事物管理的基本单位&#xff0c;是系统进行资源分配和调度的一个独立单位。但是实现进程间通信需要借助操作系统中专门的通信机制&#xff0c;但是只这些机制将占…...

秒杀高并发解决方案

秒杀高并发解决方案 1.秒杀/高并发方案-介绍 秒杀/高并发 其实主要解决两个问题&#xff0c;一个是并发读&#xff0c;一个是并发写并发读的核心优化理念是尽量减少用户到 DB 来"读"数据&#xff0c;或者让他们读更少的数据, 并 发写的处理原则也一样针对秒杀系统需…...

【每日一题】蓝桥杯加练 | Day07

文章目录一、三角回文数1、问题描述2、解题思路3、AC代码一、三角回文数 原题链接&#xff1a;三角回文数 1、问题描述 对于正整数 n, 如果存在正整数 k 使得n123⋯k k(k1)2\frac{k(k1)}{2}2k(k1)​ , 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯363 。 如果一…...

条件语句(分支语句)——“Python”

各位CSDN的uu们你们好呀&#xff0c;最近总是感觉特别特别忙&#xff0c;但是却又不知道到底干了些什么&#xff0c;好像啥也没有做&#xff0c;还忙得莫名其妙&#xff0c;言归正传&#xff0c;今天&#xff0c;小雅兰的内容还是Python呀&#xff0c;介绍一些顺序结构的知识点…...

论文投稿指南——中文核心期刊推荐(国家财政)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

面向数据安全共享的联邦学习研究综述

开放隐私计算 摘 要&#xff1a;跨部门、跨地域、跨系统间的数据共享是充分发挥分布式数据价值的有效途径&#xff0c;但是现阶段日益严峻的数据安全威胁和严格的法律法规对数据共享造成了诸多挑战。联邦学习可以联合多个用户在不传输本地数据的情况下协同训练机器学习模型&am…...

Redis经典五种数据类型底层实现原理解析

目录总纲redis的k,v键值对新的三大类型五种经典数据类型redisObject结构图示结构讲解数据类型与数据结构关系图示string数据类型三大编码格式SDS详解代码结构为什么要重新设计源码解析三大编码格式hash数据类型ziplist和hashtable编码格式ziplist详解结构剖析ziplist的优势(为什…...

Jackson 返回前端的 Response结果字段大小问题

目录 1、问题产生的背景 2、出现的现象 3、解决方案 4、成果展现 5、总结 6、参考文章 1、问题产生的背景 因为本人最近工作相关的对接外部项目&#xff0c;在我们国内有很多程序员都是使用汉语拼音或者部分字母加上英文复合体定义返回实体VO&#xff0c;这样为了能够符合…...

每天五分钟机器学习:你理解贝叶斯公式吗?

本文重点 贝叶斯算法是机器学习算法中非常经典的算法,也是非常古老的一个算法,但是它至今仍然发挥着重大的作用,本节课程及其以后的专栏将会对贝叶斯算法来做一个简单的介绍。 贝叶斯公式 贝叶斯公式是由联合概率推导而来 其中p(Y|X)称为后验概率,P(Y)称为先验概率…...

C++的入门

C的关键字 C总计63个关键字&#xff0c;C语言32个关键字 命名空间 我们C的就是建立在C语言之上&#xff0c;但是是高于C语言的&#xff0c;将C语言的不足都弥补上了&#xff0c;而命名空间就是为了弥补C语言的不足。 看一下这个例子。在C语言中会报错 #include<stdio.h>…...

数据的存储

类型的意义&#xff1a;使用这个类型开辟内存空间的大小&#xff08;大小决定了使用范围&#xff09;如何看待内存空间视角类型的基本归类整型家族浮点数家族构造类型指针类型空类型整型存储解构:整型在计算机中占用四个字节&#xff0c;整型分为无符号整型和有符号整型在计算机…...

Linux查看UTC时间

先了解一下几个时间概念。 GMT时间&#xff1a;Greenwich Mean Time&#xff0c;格林尼治平时&#xff0c;又称格林尼治平均时间或格林尼治标准时间。是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间。 GMT时间存在较大误差&#xff0c;因此不再被作为标准时间使用。现在…...

SpringBoot修改启动图标(详细步骤)

目录 一、介绍 二、操作步骤 三、介绍Java学习&#xff08;题外话&#xff09; 四、关于基础知识 一、介绍 修改图标就是在资源加载目录&#xff08;resources&#xff09;下放一个banner.txt文件。这样运行加载的时候就会扫描到这个文件&#xff0c;然后启动的时候就会显…...

【每日一题Day143】面试题 17.05. 字母与数字 | 前缀和+哈希表

面试题 17.05. 字母与数字 给定一个放有字母和数字的数组&#xff0c;找到最长的子数组&#xff0c;且包含的字母和数字的个数相同。 返回该子数组&#xff0c;若存在多个最长子数组&#xff0c;返回左端点下标值最小的子数组。若不存在这样的数组&#xff0c;返回一个空数组。…...

Go 内置运算符 if for switch

算数运算符fmt.Println("103", 103) //103 13 fmt.Println("10-3", 10-3) //10-3 7 fmt.Println("10*3", 10*3) //10*3 30 //除法注意&#xff1a;如果运算的数都是整数&#xff0c;那么除后&#xff0c;去掉小数部分&#xff0c;保留整数部分 f…...

C语言指针数组实际应用(嵌入式)

C语言指针数组详细学习 指针是C语言中非常重要的概念之一&#xff0c;它可以让我们直接访问内存中的数据。指针数组则是由多个指针组成的数组&#xff0c;每个指针都可以指向内存中的某个位置。以下是一些指针数组的实际代码应用&#xff1a; 字符串数组 char* names[] {&q…...

常用的Java注解详解

Java是一种常用的编程语言&#xff0c;而注解是Java语言中非常重要的一部分。在这篇文章中&#xff0c;我们将介绍一些常用的Java注解&#xff0c;以及它们的作用和使用方法。 Override override注解是用于表示一个方法是被覆盖的。在Java中&#xff0c;如果子类要覆盖父类的方…...

华为OD机试题 - 第 K 个最小码值的字母(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:第 K 个最小码值的字母题目输入输出示例一输入输出说明示例一输…...

vscode环境配置(支持跳转,阅读linux kernel)

目录 1.卸载clangd插件 2.安装C插件 3. 搜索框内输入 “intell”&#xff0c;将 C_Cpp&#xff1a;Intelli Sense Engine 开关设置为 Default。 4.ubuntu安装global工具 5.vscode安装插件 6.验证是否生效 7.建立索引 1.卸载clangd插件 在插件管理中卸载clangd插件 2.安…...

zigbee学习笔记:IO操作

1、IAR新建工程 &#xff08;1&#xff09;Projetc→Create New Projetc→OK→选择位置&#xff0c;确定 &#xff08;2&#xff09;新建一个c文件&#xff0c;保存在路径中 &#xff08;3&#xff09;点击工程&#xff0c;右键→add→加入c文件 &#xff08;4&#xff09;…...

华为OD机试题 - 最少数量线段覆盖(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:最少数量线段覆盖题目输入输出示例一输入输出说明Code解题思路版…...

python趣味编程-2048游戏

在上一期我们用Python实现了一个盒子追逐者的游戏&#xff0c;这一期我们继续使用Python实现一个简单的2048游戏&#xff0c;让我们开始今天的旅程吧~ 在 Python 免费源代码中使用 Tkinter 的简单 2048 游戏 使用 Tkinter 的简单 2048 游戏是一个用Python编程语言编码的桌面游…...

求解完全背包问题

题目描述实现一个算法求解完全背包问题。完全背包问题的介绍如下&#xff1a;已知一个容量为 totalweight 的背包&#xff0c;有不同重量不同价值的物品&#xff0c;问怎样在背包容量限制下达到利益最大化。完全背包问题的每个物品可以无限选用背包问题求解方法的介绍如下&…...

我们为什么使用docker 优点 作用

1. 我们为什么使用Docker? 当我们在工作中&#xff0c;一款产品从开发设计到上线运行&#xff0c;其中需要开发人员和运维工程师&#xff0c;开发人员负责代码编写&#xff0c;开发产品&#xff0c;运维工程师需要测试环境&#xff0c;产品部署。这之间就会有分歧。 就好比我…...

Python每日一练(20230311)

目录 1. 合并两个有序数组 2. 二叉树的右视图 3. 拼接最大数 &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2&#xff0c;请你将 nums2 合并到 nums1 中&#xff0c;使 nums1 成为…...

202109-3 CCF 脉冲神经网络 66分题解 + 解题思路 + 解题过程

解题思路 根据题意&#xff0c;脉冲源的阈值大于随机数时&#xff0c;会向其所有出点发送脉冲 神经元当v>30时&#xff0c;会向其所有出点发送脉冲&#xff0c;unordered_map <int, vector > ne; //存储神经元/脉冲源的所有出点集合vector 所有脉冲会有一定的延迟&am…...

Aurora简介

Amazon Aurora是一种兼容MySQL和PostgreSQL的商用级别关系数据库&#xff0c;它既有商用数据库的性能和可用性&#xff08;比如Oracle数据库&#xff09;&#xff0c;又具有开源数据库的成本效益&#xff08;比如MySQL数据库&#xff09;。 Aurora的速度可以达到MySQL数据库的…...

【python实操】用python写软件弹窗

文章目录前言组件label 与 多行文本复选框组件Radiobutton单选组件Frame框架组件labelframe标签框架列表框Listboxscrollbar滚动条组件scale刻度条组件spinbox组件Toplevel子窗体组件PanedWindow组件Menu下拉菜单弹出菜单总结针对组件前言 python学习之路任重而道远&#xff0…...

Ubuntu 常用操作

版本22.04 1、开启 root # 输入新密码 sudo passwd rootUbuntu以root账号登录桌面 默认情况是不允许用root帐号直接登录图形界面的。 Ubuntu 默认使用 GNOME&#xff0c;GNOME 使用 GDM 显示管理器。 为了允许以 root 身份登录到 GNOME&#xff0c;你需要对位于 ​​/etc/…...

井字棋--课后程序(Python程序开发案例教程-黑马程序员编著-第7章-课后作业)

实例2&#xff1a;井字棋 井字棋是一种在3 * 3格子上进行的连珠游戏&#xff0c;又称井字游戏。井字棋的游戏有两名玩家&#xff0c;其中一个玩家画圈&#xff0c;另一个玩家画叉&#xff0c;轮流在3 * 3格子上画上自己的符号&#xff0c;最先在横向、纵向、或斜线方向连成一条…...

谷粒学院开发(三):统一日志、异常及前端准备工作

特定异常处理 ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(Exception.class) // 指定出现什么异常会被处理ResponseBody // 为了能够返回数据public R error(Exception e) {e.printStackTrace();return R.error().message("执行了全局异常…...

华为OD机试题 - 招聘(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:招聘题目输入输出示例一输入输出说明示例二输入输出说明示例三输…...