ISP算法之坏点校正DPC(二):Verilog硬件实现与仿真

DPC的算法讲解和MATLAB仿真参考上一节:

ISP算法之坏点校正DPC(一):MATLAB仿真验证-CSDN博客

本节讲解Verilog的硬件实现与仿真

行缓存设计

DPC算法是基于窗口邻域的像素级别算法,因此需要对实时到来的视频流进行行缓存,行缓存的设计参考:Verilog实现图像处理的行缓存Line Buffer_verilog行缓冲-CSDN博客

行缓存会并行输出N行同一列位置的数据,在算法模块实例化行缓存模块并对其并行输出打拍寄存就可以得到一定大小的窗口数据。

Pipeline设计

硬件设计的难点是拆分算法逻辑并对齐时序,将算法实现的步骤按照Pipeline的方式进行分解,在每个时钟周期完成一个步骤并寄存,经过一定延时后,每个时钟周期完成处理并输出一个像素。

例如在下列pipeline框图中,一个实现被差分成了3个时钟周期ABC,每个时钟周期实现一部分组合逻辑(A、B、C),延时一段时间后(3个时钟周期),每个时钟周期都能处理完ABC三个过程,这样的设计其实是面积换速度策略,通过添加寄存器存储中间值来实现Pipeline。

 DPC硬件设计框架

按照Pipeline的设计方式,DPC的数据流与算法硬件pipeline设计框架图如下所示:

每个时钟周期的已经用T1~T10表示。

1、通过行缓存得到并行的四行相同列的数据,同时输入第5行数据,此过程需要对行缓存和输入的像素进行打拍得到窗口大小的像素区域。

2、得到5x5窗口区域后,根据当前Bayer像素的格式R/B或G得到邻域区域的9个像素点(包含中心像素),详细查看上一节中的MATLAB仿真验证。

3、接下来充分利用硬件的并行性,同时进行中值的求取和坏点的检测过程,最后根据是否是坏点来输出中值或原值。每个过程按照Pipeline拆分为子过程。

计算中值

这里中值的获取采用三分法的原理,可以参考:

3x3开窗中值滤波器的FPGA硬件实现 - olivermahout - 博客园

(该方法的证明可以参考网络上的博客,这里会使用即可)

通过此方法无需对9个像素进行复杂的排序操作,只需要三三比较即可。

坏点检测

由于坏点检测当中涉及到了减法,因此需要对参与计算的数据扩展一位位宽用于符号判断(0正1负),如上述算法框图中过程6。计算得到的差值通过最高位来判断正负。

如果全为正或全为负且差值的绝对值超过一定阈值则判断为坏点,绝对值的计算使用有符号的0减去为负的数值。详细查看代码中的注释

t4_diff1 <= t3_diff1[BITS] ? 1'sd0 - t3_diff1 : t3_diff1; 

对齐控制时序

随数据输入的还有HREF和VSYNC控制信号,需要对这些信号进行时序对齐,由于算法整个算法Pipeline过程延时为10个时钟周期,所以对这些信号也统一打拍10个时钟周期。

verilog硬件设计源码

`timescale 1 ns / 1 ns/** ISP - Defective Pixel Correction*//** bayer 5x5邻域内同意颜色通道相对于中心像素都有8个临近像素。矫正按以下步骤操作:* 计算中心像素与周围八个像素值的差;* 判断八个差值是否都为正值或者都为负值;* 如果有的为正有的为负,那么就为正常值,否则进行下一步;* 设置一个阈值,如果八个差值的绝对值都查过阈值,那么就判断为坏点;* 判断为坏点后就用八个临近的像素值的中位值来替换当前的像素值;
*/module isp_dpc
#(parameter BITS = 8,parameter WIDTH = 1280,parameter HEIGHT = 960,parameter BAYER = 0      //0:RGGB 1:GRBG 2:GBRG 3:BGGR
)
(input pclk,input rst_n,input [BITS-1:0] threshold,    //阈值越小,检测越松,坏点检测数越多input in_href,input in_vsync,input [BITS-1:0] in_raw,output out_href,output out_vsync,output [BITS-1:0] out_raw
);wire [BITS-1:0] shiftout;wire [BITS-1:0] tap3x, tap2x, tap1x, tap0x;shift_register #(BITS, WIDTH, 4) linebuffer(pclk, in_href, in_raw, shiftout, {tap3x, tap2x, tap1x, tap0x});   //缓存4行,第5行开始实时处理reg [BITS-1:0] in_raw_r;                 reg [BITS-1:0] p11,p12,p13,p14,p15;         5x5窗口reg [BITS-1:0] p21,p22,p23,p24,p25;reg [BITS-1:0] p31,p32,p33,p34,p35;reg [BITS-1:0] p41,p42,p43,p44,p45;reg [BITS-1:0] p51,p52,p53,p54,p55;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) beginin_raw_r <= 0;p11 <= 0; p12 <= 0; p13 <= 0; p14 <= 0; p15 <= 0;p21 <= 0; p22 <= 0; p23 <= 0; p24 <= 0; p25 <= 0;p31 <= 0; p32 <= 0; p33 <= 0; p34 <= 0; p35 <= 0;p41 <= 0; p42 <= 0; p43 <= 0; p44 <= 0; p45 <= 0;p51 <= 0; p52 <= 0; p53 <= 0; p54 <= 0; p55 <= 0;endelse beginin_raw_r <= in_raw;p11 <= p12; p12 <= p13; p13 <= p14; p14 <= p15; p15 <= tap3x;p21 <= p22; p22 <= p23; p23 <= p24; p24 <= p25; p25 <= tap2x;p31 <= p32; p32 <= p33; p33 <= p34; p34 <= p35; p35 <= tap1x;p41 <= p42; p42 <= p43; p43 <= p44; p44 <= p45; p45 <= tap0x;p51 <= p52; p52 <= p53; p53 <= p54; p54 <= p55; p55 <= in_raw_r;endendreg odd_pix;always @ (posedge pclk or negedge rst_n) beginif (!rst_n)odd_pix <= 0;else if (!in_href)    odd_pix <= 0;elseodd_pix <= ~odd_pix;      //对列进行奇偶判断endwire odd_pix_sync_shift = odd_pix;reg prev_href;   //数据有效信号寄存一拍,用于后续提取下降沿always @ (posedge pclk or negedge rst_n) begin if (!rst_n) prev_href <= 0;elseprev_href <= in_href;end	reg odd_line;always @ (posedge pclk or negedge rst_n) begin //对行进行奇偶判断if (!rst_n) odd_line <= 0;else if (in_vsync)odd_line <= 0;else if (prev_href & (~in_href))     //数据有效下降沿odd_line <= ~odd_line;elseodd_line <= odd_line;endwire odd_line_sync_shift = odd_line;//根据输入的图像格式和奇偶行判断窗口中心像素的格式wire [1:0] p33_fmt = BAYER[1:0] ^ {odd_line_sync_shift, odd_pix_sync_shift};    //pixel format 0:[R]GGB 1:R[G]GB 2:RG[G]B 3:RGreg [BITS-1:0] t1_p1, t1_p2, t1_p3;                   //3x3窗口  reg [BITS-1:0] t1_p4, t1_p5, t1_p6;reg [BITS-1:0] t1_p7, t1_p8, t1_p9;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint1_p1 <= 0; t1_p2 <= 0; t1_p3 <= 0;t1_p4 <= 0; t1_p5 <= 0; t1_p6 <= 0;t1_p7 <= 0; t1_p8 <= 0; t1_p9 <= 0;endelse begincase (p33_fmt)    //根据中间像素的格式分离出不同的模式2'd0,2'd3: begin //R/B ,在5x5窗口中,中心点红色和绿色像素可以提取3x3t1_p1 <= p11; t1_p2 <= p13; t1_p3 <= p15;     t1_p4 <= p31; t1_p5 <= p33; t1_p6 <= p35;t1_p7 <= p51; t1_p8 <= p53; t1_p9 <= p55;end2'd1,2'd2: begin //Gr/Gb   //同样提取9个绿色像素t1_p1 <= p22; t1_p2 <= p13; t1_p3 <= p24;t1_p4 <= p31; t1_p5 <= p33; t1_p6 <= p35;t1_p7 <= p42; t1_p8 <= p53; t1_p9 <= p44;enddefault: begint1_p1 <= 0; t1_p2 <= 0; t1_p3 <= 0;t1_p4 <= 0; t1_p5 <= 0; t1_p6 <= 0;t1_p7 <= 0; t1_p8 <= 0; t1_p9 <= 0;endendcaseendend//中值滤波 step1  reg [BITS-1:0] t2_min1, t2_med1, t2_max1;reg [BITS-1:0] t2_min2, t2_med2, t2_max2;reg [BITS-1:0] t2_min3, t2_med3, t2_max3;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint2_min1 <= 0; t2_med1 <= 0; t2_max1 <= 0;t2_min2 <= 0; t2_med2 <= 0; t2_max2 <= 0;t2_min3 <= 0; t2_med3 <= 0; t2_max3 <= 0;endelse begint2_min1 <= min(t1_p1, t1_p2, t1_p3);t2_med1 <= med(t1_p1, t1_p2, t1_p3);t2_max1 <= max(t1_p1, t1_p2, t1_p3);t2_min2 <= min(t1_p4, t1_p5, t1_p6);t2_med2 <= med(t1_p4, t1_p5, t1_p6);t2_max2 <= max(t1_p4, t1_p5, t1_p6);t2_min3 <= min(t1_p7, t1_p8, t1_p9);t2_med3 <= med(t1_p7, t1_p8, t1_p9);t2_max3 <= max(t1_p7, t1_p8, t1_p9);endend//中值滤波 step2  reg [BITS-1:0] t3_max_of_min, t3_med_of_med, t3_min_of_max;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint3_max_of_min <= 0; t3_med_of_med <= 0; t3_min_of_max <= 0;endelse begint3_max_of_min <= max(t2_min1, t2_min2, t2_min3);t3_med_of_med <= med(t2_med1, t2_med2, t2_med3);t3_min_of_max <= min(t2_max1, t2_max2, t2_max3);endend//中值滤波 step3  reg [BITS-1:0] t4_medium;      //该中值就是3x3窗口的中值always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint4_medium <= 0;endelse begint4_medium <= med(t3_max_of_min, t3_med_of_med, t3_min_of_max);endend//将中值打拍对齐到坏点检测时序reg [BITS-1:0] t5_medium;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint5_medium <= 0;endelse begint5_medium <= t4_medium;endend//坏点检测 step1 (转有符号数)reg signed [BITS:0] t2_p1, t2_p2, t2_p3;         //扩展一位用于符号计算reg signed [BITS:0] t2_p4, t2_p5, t2_p6;reg signed [BITS:0] t2_p7, t2_p8, t2_p9;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint2_p1 <= 0; t2_p2 <= 0; t2_p3 <= 0;t2_p4 <= 0; t2_p5 <= 0; t2_p6 <= 0;t2_p7 <= 0; t2_p8 <= 0; t2_p9 <= 0;endelse begint2_p1 <= {1'b0,t1_p1}; t2_p2 <= {1'b0,t1_p2}; t2_p3 <= {1'b0,t1_p3};t2_p4 <= {1'b0,t1_p4}; t2_p5 <= {1'b0,t1_p5}; t2_p6 <= {1'b0,t1_p6};t2_p7 <= {1'b0,t1_p7}; t2_p8 <= {1'b0,t1_p8}; t2_p9 <= {1'b0,t1_p9};endend//坏点检测 step2 (计算中心像素与周围八个像素值的差)reg [BITS:0] t3_center;reg signed [BITS:0] t3_diff1, t3_diff2, t3_diff3, t3_diff4, t3_diff5, t3_diff6, t3_diff7, t3_diff8;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint3_center <= 0;t3_diff1 <= 0; t3_diff2 <= 0;t3_diff3 <= 0; t3_diff4 <= 0;t3_diff5 <= 0; t3_diff6 <= 0;t3_diff7 <= 0; t3_diff8 <= 0;endelse begint3_center <= t2_p5[BITS-1:0];     //求取差值,得出的是补码t3_diff1 <= t2_p5 - t2_p1;t3_diff2 <= t2_p5 - t2_p2;t3_diff3 <= t2_p5 - t2_p3;t3_diff4 <= t2_p5 - t2_p4;t3_diff5 <= t2_p5 - t2_p6;t3_diff6 <= t2_p5 - t2_p7;t3_diff7 <= t2_p5 - t2_p8;t3_diff8 <= t2_p5 - t2_p9;endend//坏点检测 step3 (判断差值是否都为正或都为负,计算差值绝对值)reg t4_defective_pix;reg [BITS-1:0] t4_center;reg [BITS-1:0] t4_diff1, t4_diff2, t4_diff3, t4_diff4, t4_diff5, t4_diff6, t4_diff7, t4_diff8;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint4_defective_pix <= 0;t4_center <= 0;t4_diff1 <= 0; t4_diff2 <= 0;t4_diff3 <= 0; t4_diff4 <= 0;t4_diff5 <= 0; t4_diff6 <= 0;t4_diff7 <= 0; t4_diff8 <= 0;endelse begint4_center <= t3_center;    //判断最高位是否都为正或者都为负,最高位0为正,1为负t4_defective_pix <= (8'b0000_0000 == {t3_diff1[BITS],t3_diff2[BITS],t3_diff3[BITS],t3_diff4[BITS],t3_diff5[BITS],t3_diff6[BITS],t3_diff7[BITS],t3_diff8[BITS]})|| (8'b1111_1111 == {t3_diff1[BITS],t3_diff2[BITS],t3_diff3[BITS],t3_diff4[BITS],t3_diff5[BITS],t3_diff6[BITS],t3_diff7[BITS],t3_diff8[BITS]});t4_diff1 <= t3_diff1[BITS] ? 1'sd0 - t3_diff1 : t3_diff1;    //有符号数减法相当于取绝对值t4_diff2 <= t3_diff2[BITS] ? 1'sd0 - t3_diff2 : t3_diff2;t4_diff3 <= t3_diff3[BITS] ? 1'sd0 - t3_diff3 : t3_diff3;t4_diff4 <= t3_diff4[BITS] ? 1'sd0 - t3_diff4 : t3_diff4;t4_diff5 <= t3_diff5[BITS] ? 1'sd0 - t3_diff5 : t3_diff5;t4_diff6 <= t3_diff6[BITS] ? 1'sd0 - t3_diff6 : t3_diff6;t4_diff7 <= t3_diff7[BITS] ? 1'sd0 - t3_diff7 : t3_diff7;t4_diff8 <= t3_diff8[BITS] ? 1'sd0 - t3_diff8 : t3_diff8;endend//坏点检测 step4 (判断差值绝对值是否超出阈值)reg t5_defective_pix;reg [BITS-1:0] t5_center;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint5_defective_pix <= 0;t5_center <= 0;endelse begint5_center <= t4_center;   //如果与邻域差值都为正或者负,且差值绝对值达到阈值,则认为该点为坏点t5_defective_pix <= t4_defective_pix && t4_diff1 > threshold && t4_diff2 > threshold && t4_diff3 > threshold && t4_diff4 > threshold && t4_diff5 > threshold && t4_diff6 > threshold && t4_diff7 > threshold && t4_diff8 > threshold;endend//坏点检测 step5 (坏点成立输出中值滤波值, 非坏点输出原值)reg [BITS-1:0] t6_center;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) begint6_center <= 0;endelse begint6_center <= t5_defective_pix ? t5_medium : t5_center;   //如果是坏点则输出中值滤波值,否则输出原值endendlocalparam DLY_CLK = 10;          //对控制信号进行打拍以对齐时序reg [DLY_CLK-1:0] href_dly;reg [DLY_CLK-1:0] vsync_dly;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) beginhref_dly <= 0;vsync_dly <= 0;endelse beginhref_dly <= {href_dly[DLY_CLK-2:0], in_href};vsync_dly <= {vsync_dly[DLY_CLK-2:0], in_vsync};endend//输出对齐后的控制时序assign out_href = href_dly[DLY_CLK-1];assign out_vsync = vsync_dly[DLY_CLK-1];assign out_raw = out_href ? t6_center : {BITS{1'b0}};function [BITS-1:0] min;      //求三个值中的最小值input [BITS-1:0] a, b, c;beginmin = (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c);endendfunctionfunction [BITS-1:0] med;   //取三个值中的中值input [BITS-1:0] a, b, c;beginmed = (a < b) ? ((b < c) ? b : (a < c ? c : a)) : ((b > c) ? b : (a > c ? c : a));endendfunctionfunction [BITS-1:0] max;   //求三个值中的最大值input [BITS-1:0] a, b, c;beginmax = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);endendfunction
endmodule

Verilog仿真验证

(验证框架的搭建查看往期博客)

编写testbench,实例化算法模块,代码如下:

`timescale 1ns / 1nsmodule tb_dpc;reg xclk = 0;
always #5 xclk <= ~xclk;     //像素时钟reg rst_n = 0;               //axis 时钟复位 
initial beginrst_n <= 0;#100 rst_n <= 1;
endlocalparam BAYER = 3;
localparam BITS     = 10;      
localparam WIDTH    = 2592;
localparam HEIGHT   = 1944;
localparam IN_FILE  = "E:/ISP/tb_dpc_2592x1944_16.raw";
localparam OUT_FILE = "E:/ISP/tb_dpc_2592x1944_16_verilogout.raw";reg [BITS-1:0] dpc_thresh=100;    ///DPC阈值参数FILE TO DVP/
wire pclk_in, href_in, vsyn_in,hsync_in;
wire [BITS-1:0] data_in;FILE_TO_DVP #(.FILE(IN_FILE),.BITS(BITS),.H_DISP(WIDTH),.V_DISP(HEIGHT)
)
file_to_dvp_inst
(.xclk(xclk),.rst_n(rst_n),.pclk(pclk_in),.href(href_in),.hsync(hsync_in),.vsync(vsyn_in),.data(data_in)
);ISP算法
wire [BITS-1:0] data_o;
wire href_o,vsyn_o;isp_dpc #(.BITS(BITS),.WIDTH(WIDTH),.HEIGHT(HEIGHT),.BAYER(BAYER)
) dpc_inst(.pclk(pclk_in),.rst_n(rst_n),.threshold(dpc_thresh),.in_href(href_in),.in_vsync(vsyn_in),.in_raw(data_in),.out_href(href_o),.out_vsync(vsyn_o),.out_raw(data_o)
);
/////DVP to FILE
DVP_TO_FILE #(.FILE(OUT_FILE),.BITS(BITS)
)
dvp_to_file_inst
(.pclk(pclk_in),.rst_n(rst_n),.href(href_o),.vsync(vsyn_o),.data(data_o)
);endmodule

输入raw图像为:

(测试图像的生成参考往期博客)

得到的raw仅进行demosaic后得到如下:

 可以看到坏点基本被消除,与MATAB仿真得到的结果基本一致。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5制作倒计时功能

设置画布和文本 文本绑定 格式化时间 转到事件图表&#xff0c;计算时间&#xff0c;时间结束后面的事件可以按自己需求写 进入关卡蓝图&#xff0c;添加倒计时UI

在Spring Boot中的实现国际化(i18n)

1.什么是国际化&#xff08;i18n&#xff09;&#xff1f; 国际化&#xff08;Internationalization&#xff0c;简称i18n&#xff09;是指在软件应用中支持多种语言和文化的能力。通过国际化&#xff0c;应用可以根据用户的语言和地区设置&#xff0c;动态地显示不同的文本内…

大模型的构建与部署(3)——数据标注

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 数据标注的重要性 1.1 增强数据可解释性 数据标注通过为原始数据添加标签或注释,显著增强了数据的可解释性。在机器学习和深度学习领域,模型的训练依赖于大量带标签的数据。这些标签不仅帮助…

【考前预习】4.计算机网络—网络层

往期推荐 【考前预习】3.计算机网络—数据链路层-CSDN博客 【考前预习】2.计算机网络—物理层-CSDN博客 【考前预习】1.计算机网络概述-CSDN博客 目录 1.网络层概述 2.网络层提供的两种服务 3.分类编址的IPV4 4.无分类编址的IPV4—CIDR 5.IPV4地址应用规划 5.1使用定长子…

需求管理(尊享版)

需求管理 由于需求是正在构建的系统必须符合的事务&#xff0c;而且符合某些需求决定了项目的成功或失败&#xff0c;因此找出需求是什么&#xff0c;将它们记下来&#xff0c;进行组织&#xff0c;并在发生变化时对它们进行追踪&#xff0c;这些活动都是有意义的。 需求管理…

前后端跨域问题(CROS)

前端 在src中创建util文件&#xff0c;写request.js文件&#xff1a; request.js代码如下&#xff1a; import axios from axios import { ElMessage } from element-plus;const request axios.create({// baseURL: /api, // 注意&#xff01;&#xff01; 这里是全局统一加…

【python从入门到精通】-- 第六战:列表和元组

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

操作系统课后习题2.2节

操作系统课后习题2.2节 第1题 CPU的效率指的是CPU的执行速度&#xff0c;这个是由CPU的设计和它的硬件来决定的&#xff0c;具体的调度算法是不能提高CPU的效率的&#xff1b; 第3题 互斥性&#xff1a; 指的是进程之间的同步互斥关系&#xff0c;进程是一个动态的过程&#…

openlane

openlane数据集&#xff0c;lane3d_1000里训练集157807张图片&#xff0c;测试集39981张图&#xff0c;md太多了

在pycharm2024.3.1中配置anaconda3-2024-06环境

version: anaconda3-2024.06-1 pycharm-community-2024.3.1 1、安装anaconda和pycharm 最新版最详细Anaconda新手安装配置环境创建教程_anaconda配置-CSDN博客 【2024最新版】超详细Pycharm安装保姆级教程&#xff0c;Pycharm环境配置和使用指南&#xff0c;看完这一篇就够了…

深度解读:Top14金融顶刊

作者Toby&#xff1a;来源&#xff1a;Python风控模型&#xff0c;Top14金融顶刊 各位同学好&#xff0c;我是Toby老师&#xff0c;今天为大家介绍金融风控领域的顶级学术期刊&#xff0c;用于小论文发布平台参考。 金融风控领域内有许多顶级学术期刊&#xff0c;它们发表高质…

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省&#xff0c;就是自我反省、自我检查&#xff0c;自知己短&#xff0c;从而弥补短处、纠正过失。佛陀强调自觉觉他&#xff0c;强调以达到觉行圆满为修行的最高境界。要改正错误&#xff0c;除了虚心接受他人意见之外&#xff0c;还要不忘时时观照己身。自省自悟之…

EnumMap:让Java Map更高效的技巧

前言 摘要 内容 什么是EnumMap 如何使用EnumMap EnumMap的实现原理 EnumMap的例子 测试用例 小结 前言 在Java中&#xff0c;枚举类型是一种非常有用的数据类型&#xff0c;它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用&#xff0c;例如状态码、…

计算机游戏运行时常见问题解析:d3dx9_43.dll丢失的真相与修复指南

游戏运行时d3dx9_43.dll缺失问题全解析 在计算机游戏的探险之旅中&#xff0c;d3dx9_43.dll文件缺失常成为玩家的绊脚石。此DLL文件是DirectX 9的关键组件&#xff0c;对图形渲染至关重要。以下&#xff0c;我们将深入剖析其丢失原因&#xff0c;并提供精简有效的修复策略。 …

电子科技大学《2024年839自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《电子科技大学839自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

BUUCTF Pwn [HarekazeCTF2019]baby_rop2 题解

下载 得到两个文件 checksec 64位 拖入IDA64 查看main函数 看到给了个libc说明这题是ret2libc题 这里的打印函数是printf 所以利用printf函数的plt输出真实地址got 但printf的got好像不行 所以换成了read的got 因为这是64位程序 所以用寄存器传参&#xff1b;又因为printf得…

Starfish 因子开发管理平台快速上手:如何完成策略编写与回测

DolphinDB 开发的因子开发管理平台 Starfish 围绕量化投研的因子、策略开发阶段设计&#xff0c;为用户提供了一个从数据管理、因子研究到策略回测的完整解决方案。 因子平台的回测引擎提供了多个关键的事件函数&#xff0c;涵盖策略初始化、每日盘前和盘后回调、逐笔、快照和…

ASP.NET|日常开发中读写TXT文本详解

ASP.NET&#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET&#xff5c;日常开发中…

走进 RAG 技术:一场智能数据交互的奇幻之旅

朋友们&#xff0c;咱身处的这个时代&#xff0c;科技那可是跟开了挂似的往前冲&#xff0c;其中人工智能更是厉害得没话说&#xff0c;宛如一个充满无限可能的魔法领域&#xff0c;时不时就给咱的生活来个大变样。而在这其中&#xff0c;RAG 技术就像是突然冒出来的一颗超亮眼…

leetcode-402.移调k位数字-day8

代码实现细节影响 方法一&#xff1a;在构建最终结果字符串时&#xff0c;通过 stack.substring(0, stack.length() - k < 1? 0 : stack.length() - k).toString() 这样的方式来截取需要的部分&#xff0c;这个操作相对比较直接简洁&#xff0c;不需要额外的反转等操作&…