基于xilinx IP的频域脉冲压缩算法的实现和matlab仿真

news2024/9/23 11:14:37

工具:matlabR2021b,vivado2018.3.

脉冲压缩的原理

脉冲压缩实际上就是对接收信号进行匹配滤波处理。根据发射的波形不同,脉冲压缩时选择不同的匹配滤波器系数。

数字脉冲压缩的实现方式有两种: 一是时域卷积法; 二是频域乘积法。依据傅里叶变换理论,时域卷积等效于频域乘法,因此两种方法实际上是等效的。时域处理方法直观、简单,但是运算量大,工程上一般采用频域法。

脉冲压缩的时域实现

时域脉冲压缩系统就是指在时域对信号进行卷积运算。

s_{0}(t)=s(t)*h(t)

采用 FIR 滤波器的结构实现时域脉压的过程是将匹配滤波器的系数作为 FIR滤波器的系数,这样实现脉压的点数就是 FIR 滤波器的阶数。FIR 滤波器的结构如下图所示,其特点是每一阶都需要一个延迟单元,一个乘法器和一个加法器。由于一般的信号处理器中乘法资源是非常有限的,这就决定了无法使用FIR结构实现脉压点数比较大的计算。当FIR的阶数过大时,使用的延迟单元和加法器乘法器也随之增大。

脉冲压缩的频域实现

脉冲压缩算法分别在频域上结论

s_{0}(n)=IFFT[FFT[s(n)]\times FFT[h(n)]]

频域脉冲压缩处理是指在频域实现时域线性卷积的过程,这个过程时域卷积和频域相乘时等效的。分别对回波信号和匹配滤波系数进行傅里叶变换后进行复乘运算。最后取傅里叶逆变换后得到结果。

脉冲压缩算法的matlab仿真

线性调频信号的产生

要获取较大的距离分辨率,可以增加发射信号的带宽。雷达的作用距离取决于信号的时宽,即要求信号要有大的时宽,而雷达的分辨精度取决于信号的带宽,即要求信号要有大的带宽。但是对于单载频脉冲信号,时宽和带宽的乘积近似等于1,所以同时得到大时宽和大带宽是矛盾的。

为了解决这一矛盾,必须采取同时具有大时宽和大带宽的复杂信号形式,最常用的就是线性调频信号(LFM),这种信号是在宽脉冲内附加载波线性调频,从而在大时宽的条件下扩展了带宽,通过脉冲压缩技术使宽脉冲变成窄脉冲,以获得高的距离分辨能力。

雷达的距离分辨率公式

\triangle R=\frac{C}{2B}

其中c为光速,B为信号带宽。

关于线性调频信号

%%线性调频信号
T=10e-6;                                  %脉冲持续时间10us
B=20e6;                                   %线性调频信号的频带宽度20MHz
K=B/T;                                    %调频斜率
Fs=5*B;Ts=1/Fs;                           %采样频率和采样间隔
N=512;                                   %取点数,根据采样率取点数
t=linspace(-T/2,T/2,N);                   %持续时间范围-5us到5us
St=exp(j*pi*K*t.^2);                      %线性调频信号

时域和频域图谱

发射信号,创建了一个100us的时间长度,发射线性调频信号持续数据为10us。

% 生成 0 - 100us 的时间向量
t_extended = linspace(0, 100e-6, 4096 );

% 进行脉冲调制
pulsed_signal = zeros(1, length(t_extended));
pulsed_signal(1:length(St)) = St;

p_imag = imag(pulsed_signal);

接受回波信号,创建了一个100us的时间长度。分别在3KM,5KM和10KM模拟了目标,产生三个回波信号。并根据距离将回波的在100us回波的时间计算出来。

% 时间延迟,目标距离
R0  = 3e3;  %目标距离
R1  = 5e3;  %目标距离
R2  = 10e3;  %目标距离
c   = 3e8;
tr0 = 2*R0/c;
tr1 = 2*R1/c;
tr2 = 2*R2/c;
% 回波时间转化成起始点数
start_point0 = tr0/100e-6*4096;
start_point1 = tr1/100e-6*4096;
start_point2 = tr2/100e-6*4096;
start_point0 = ceil(start_point0);
start_point1 = ceil(start_point1);
start_point2 = ceil(start_point2);
%距离和时间的关系,光在这一来一回传输的时间
pulsed_signal2 = zeros(1, length(t_extended));
pulsed_signal2(start_point0+1:(start_point0+length(St))) = St;

pulsed_signal2(start_point1+1:(start_point1+length(St))) = St;

pulsed_signal2(start_point2+1:(start_point2+length(St))) = St;

进行频域脉冲压缩

对发射信号进行傅里叶变换后求共轭,得出匹配滤波器系数。求出回波信号的傅里叶变换后与匹配滤波器系数相乘。然后在进行逆傅里叶变换还原波形。在通过时间和距离的关系计算出目标距离。

%频域脉冲压缩算法
%求原始信号的傅里叶变换并算出匹配滤波器系数
Xs      = fft(St,length(pulsed_signal));            % 原始信号的FFT
Xecho_0 = fft(pulsed_signal2,length(pulsed_signal2));       % 目标 1 回波信号的FFT
conj_s  = conj(Xs);
Y_0     = conj(Xs).*Xecho_0;                        % 目标 1 的乘法器
% Y_0     = fftshift(Y_0);
y_0     = ifft(Y_0,length(pulsed_signal2));         % 目标 1 的 IFFT


r_0=t_extended*c/2;                        %回波时计算了来回的时间,这里将距离除以2获得准确的距离

得出脉冲压缩的结果为,可以看到我们设置了三个回波对应了三个目标,此时目标对应距离分别为3000m。5000m。10000m。

完整的matlab仿真代码

clc
clear
close all
%%线性调频信号
T=10e-6;                                  %脉冲持续时间10us
B=20e6;                                   %线性调频信号的频带宽度20MHz
K=B/T;                                    %调频斜率
Fs=5*B;Ts=1/Fs;                           %采样频率和采样间隔
N=512;                                   %取点数,根据采样率取点数
t=linspace(-T/2,T/2,N);                   %持续时间范围-5us到5us
St=exp(j*pi*K*t.^2);                      %线性调频信号

% 生成 0 - 100us 的时间向量
t_extended = linspace(0, 100e-6, 4096 );

% 进行脉冲调制
pulsed_signal = zeros(1, length(t_extended));
pulsed_signal(1:length(St)) = St;

p_imag = imag(pulsed_signal);

% 时间延迟,目标距离
R0  = 3e3;  %目标距离
R1  = 5e3;  %目标距离
R2  = 10e3;  %目标距离
c   = 3e8;
tr0 = 2*R0/c;
tr1 = 2*R1/c;
tr2 = 2*R2/c;
% 回波时间转化成起始点数
start_point0 = tr0/100e-6*4096;
start_point1 = tr1/100e-6*4096;
start_point2 = tr2/100e-6*4096;
start_point0 = ceil(start_point0);
start_point1 = ceil(start_point1);
start_point2 = ceil(start_point2);
%距离和时间的关系,光在这一来一回传输的时间
pulsed_signal2 = zeros(1, length(t_extended));
pulsed_signal2(start_point0+1:(start_point0+length(St))) = St;

pulsed_signal2(start_point1+1:(start_point1+length(St))) = St;

pulsed_signal2(start_point2+1:(start_point2+length(St))) = St;

% ========================================================
% 将回波信号存入coe
% 2. 提取实部和虚部
real_part = real(pulsed_signal2);
imag_part = imag(pulsed_signal2);

% 3. 将实部和虚部转换为 16 位整数
% 注意:需要将值缩放到合适的范围
real_int = int16(real_part * 2^14);  % 进行缩放
imag_int = int16(imag_part * 2^14);  % 进行缩放

% 4. 组合成 32 位整数
combined_int = bitshift(uint32(typecast(imag_int, 'uint16')), 16) + uint32(typecast(real_int, 'uint16'));

% 5. 转换为二进制字符串
hex_str = dec2hex(combined_int, 8);
 
num_points = length(hex_str);
% 保存到coe文件
fileID = fopen('pluse_echo.coe', 'w');
fprintf(fileID, 'memory_initialization_radix=16;\n');
fprintf(fileID, 'memory_initialization_vector=\n');
for i = 1:num_points
    if i < num_points
        fprintf(fileID, '%s,\n', hex_str(i,:));
    else
        fprintf(fileID, '%s;', hex_str(i,:));
    end
end
fclose(fileID);

%频域脉冲压缩算法
%求原始信号的傅里叶变换并算出匹配滤波器系数
Xs      = fft(St,length(pulsed_signal));            % 原始信号的FFT
Xecho_0 = fft(pulsed_signal2,length(pulsed_signal2));       % 目标 1 回波信号的FFT
conj_s  = conj(Xs);
Y_0     = conj(Xs).*Xecho_0;                        % 目标 1 的乘法器
% Y_0     = fftshift(Y_0);
y_0     = ifft(Y_0,length(pulsed_signal2));         % 目标 1 的 IFFT

% ======================================================
% 画出原始信号傅里叶变换后的共轭存入coe
% 2. 提取实部和虚部
real_part = real(conj_s);
imag_part = imag(conj_s);

% 3. 将实部和虚部转换为 16 位整数
% 注意:需要将值缩放到合适的范围
real_int = int16(real_part * 100);  % 进行缩放
imag_int = int16(imag_part * 100);  % 进行缩放

% 4. 组合成 32 位整数
combined_int = bitshift(uint32(typecast(imag_int, 'uint16')), 16) + uint32(typecast(real_int, 'uint16'));

% 5. 转换为二进制字符串
hex_str = dec2hex(combined_int, 8);
 
num_points = length(hex_str);
% 保存到coe文件
fileID = fopen('conjxs.coe', 'w');
fprintf(fileID, 'memory_initialization_radix=16;\n');
fprintf(fileID, 'memory_initialization_vector=\n');
for i = 1:num_points
    if i < num_points
        fprintf(fileID, '%s,\n', hex_str(i,:));
    else
        fprintf(fileID, '%s;', hex_str(i,:));
    end
end
fclose(fileID);

%%====================画图====================%%%
%线性调频信号
figure;
subplot(211)
plot(t*1e6,real(St));
xlabel('时间/us');
title('线性调频信号的实部');
grid on;axis tight;
subplot(212)
freq=linspace(-Fs/2,Fs/2,N);
plot(freq*1e-6,fftshift(abs(fft(St))));
xlabel('频率/MHz');
title('线性调频信号的幅频特性');
grid on;axis tight;


% 绘制时域图像
figure;
% subplot(211)
plot(t_extended*1e6, real(pulsed_signal));
xlabel('时间 (us)');
ylabel('幅度');
title('产生的线性调频信号时域图像');

% % 傅里叶变换求频谱
% spectrum = fftshift(fft(pulsed_signal));
% spectrum_abs = abs(spectrum);
% % 绘制频谱图
% subplot(212)
% %做FT变化,算平均功率谱,并画谱输出
% f = Fs * (0:length(spectrum) - 1) / length(spectrum);
% plot(f/1e6, abs(spectrum));
% xlabel('频率 (MHz)');
% ylabel('幅度');
% title('产生线性调频信号时域图像');


% 绘制时域图像
figure;
% subplot(211)
plot(t_extended*1e6, real(pulsed_signal2));
xlabel('时间 (us)');
ylabel('幅度');
title('回波线性调频信号时域图像');

% % 傅里叶变换求频谱
% spectrum_real = real(fft(pulsed_signal2));
% spectrum = fftshift(fft(pulsed_signal2));
% % 绘制频谱图
% subplot(212)
% f = Fs * (0:length(spectrum) - 1) / length(spectrum);
% plot(f/1e6, abs(spectrum));
% xlabel('频率 (MHz)');
% ylabel('幅度');
% title('回波线性调频信号的频谱图');

% ========= 脉冲压缩结果 ===========
figure;
subplot(211)
plot(t_extended*1e6, abs(y_0)/max(abs(y_0)));
xlabel('时间 (us)');
ylabel('幅度');
title('脉冲压缩后时域图像');
%求距离
subplot(212)
r_0=t_extended*c/2;                        %回波时计算了来回的时间,这里将距离除以2获得准确的距离
plot(r_0,(abs(y_0)/max(abs(y_0))));        % 目标 1 绘制 y 的幅度(以 dB 为单位)与距离 r 的关系
xlabel('距离/m');title('目标 1 脉冲压缩结果');

脉冲压缩算法的FPGA实现

为了在FPGA中仿真。将回波数据和匹配滤波器系数分别写成coe文件加载到FPGA的BRAM中。BRAM参数设置为。

逻辑实现的思路为。

回波数据从BRAM中读出。对回波数据进行FFT。完成后,从BRAM中读出匹配滤波器系数。通过回波的FFT和匹配滤波器的复乘完成后。对数据进行逆傅里叶变换,还原波形。

FFTIP设置为4096个点(结合matlab产生的波形数据)

回波数据进行FFT变换后,与匹配滤波器系数进行复乘运算。

(a+bi)(c+di) = (ac-bd)+(ad+bc)i

可以看到上述的过程完成使用乘法器加法器即可完成。

FPGA测整体的仿真测试代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/08/15 15:45:55
// Design Name: 
// Module Name: vtf_pluse
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module vtf_pluse;
//bram echo
reg                [11:0] addr_echo            ; 
wire               [31:0] dout_echo            ; 

//system signal
reg                       clk                  ; 
reg                       rst_n                ; 
reg                       data_gen             ; 
reg                       data_flog            ; 
reg                       douta_vld            ; 
reg                [15:0] cnt                  ; 

//fft
wire             [31 : 0] s_axis_data_tdata    ; 
wire                      s_axis_data_tvalid   ; 
wire                      s_axis_data_tready   ; 
wire                      s_axis_data_tlast    ; 
wire             [31 : 0] m_axis_data_tdata    ; 
wire             [23 : 0] m_axis_data_tuser    ; 
wire                      m_axis_data_tvalid   ; 
wire                      m_axis_data_tready   ; 
wire                      m_axis_data_tlast    ; 


wire               [15:0] echo_imag            ; 
wire               [15:0] echo_real            ; 
wire               [15:0] fft_imag             ; 
wire               [15:0] fft_real             ; 

//输出脉冲压缩结果
wire               [31:0] yk_data              ; // 
wire                      yk_valid             ; // 
wire               [11:0] yk_cnt               ; //
wire                      yk_ready             ; 
wire                      yk_tlast             ; 

wire             [31 : 0] yk_data_tdata        ; 
wire             [23 : 0] yk_data_tuser        ; 
wire                      yk_data_tvalid       ; 
wire                      yk_data_tready       ; 
wire                      yk_data_tlast        ; 

//=============================================

assign  s_axis_data_tdata   = dout_echo;
assign  s_axis_data_tvalid  = douta_vld;
assign  s_axis_data_tlast   = (cnt == 16'd4095);
assign  m_axis_data_tready  = 1'b1;


assign  echo_imag           = s_axis_data_tdata[31:16];
assign  echo_real           = s_axis_data_tdata[15:0];
assign  fft_imag            = m_axis_data_tdata[31:16];
assign  fft_real            = m_axis_data_tdata[15:0];

assign  yk_tlast            = {yk_cnt == 12'd4095};
assign  yk_data_tready      = 1'b1;
//======================================================
//回波读出
//======================================================
blk_mem_echo u_echo (
    .clka                         (clk                          ), // input wire clka
    .ena                          (1'b1                         ), // input wire ena
    .wea                          (1'b0                         ), // input wire [0 : 0] wea
    .addra                        (addr_echo                    ), // input wire [11 : 0] addra
    .dina                         (32'd0                        ), // input wire [31 : 0] dina
    .douta                        (dout_echo                    )// output wire [31 : 0] douta
);


xfft_0 u_fft (
    .aclk                         (clk                         ), // input wire aclk
    .aresetn                      (rst_n                      ), // input wire aresetn
    .s_axis_config_tdata          (8'd1                         ), // input wire [7 : 0] s_axis_config_tdata
    .s_axis_config_tvalid         (1'b1                         ), // input wire s_axis_config_tvalid
    .s_axis_config_tready         (                             ), // output wire s_axis_config_tready
    .s_axis_data_tdata            (s_axis_data_tdata            ), // input wire [31 : 0] s_axis_data_tdata
    .s_axis_data_tvalid           (s_axis_data_tvalid           ), // input wire s_axis_data_tvalid
    .s_axis_data_tready           (s_axis_data_tready           ), // output wire s_axis_data_tready
    .s_axis_data_tlast            (s_axis_data_tlast            ), // input wire s_axis_data_tlast
    .m_axis_data_tdata            (m_axis_data_tdata            ), // output wire [31 : 0] m_axis_data_tdata
    .m_axis_data_tuser            (m_axis_data_tuser            ), // output wire [23 : 0] m_axis_data_tuser
    .m_axis_data_tvalid           (m_axis_data_tvalid           ), // output wire m_axis_data_tvalid
    .m_axis_data_tready           (m_axis_data_tready           ), // input wire m_axis_data_tready
    .m_axis_data_tlast            (m_axis_data_tlast            ), // output wire m_axis_data_tlast
    .m_axis_status_tdata          ( ), // output wire [7 : 0] m_axis_status_tdata
    .m_axis_status_tvalid         ( ), // output wire m_axis_status_tvalid
    .m_axis_status_tready         ( ), // input wire m_axis_status_tready
    .event_frame_started          ( ), // output wire event_frame_started
    .event_tlast_unexpected       ( ), // output wire event_tlast_unexpected
    .event_tlast_missing          ( ), // output wire event_tlast_missing
    .event_status_channel_halt    ( ), // output wire event_status_channel_halt
    .event_data_in_channel_halt   ( ), // output wire event_data_in_channel_halt
    .event_data_out_channel_halt  ( )// output wire event_data_out_channel_halt
);

//复乘
plural_mul u_plural_mul(
//输入sk回波FFT数据
    .sk_data                      (m_axis_data_tdata[31:0]                ), // (input ) (input )
    .sk_cnt                       (m_axis_data_tuser[11:0]                 ), // (input ) (input )
    .sk_valid                     (m_axis_data_tvalid                     ), // (input ) (input )

//输出脉冲压缩结果
    .yk_data                      (yk_data[31:0]                ), // (output) (output)
    .yk_valid                     (yk_valid                     ), // (output) (output)
    .yk_cnt                       (yk_cnt                       ), // (output) (output)

//
    .clk                          (clk                          ), // (input ) (input )
    .rst_n                        (rst_n                        )  // (input ) (input )
);

xfft_0 u_ifft (
    .aclk                         (clk                          ), // input wire aclk
    .aresetn                      (rst_n                        ), // input wire aresetn
    .s_axis_config_tdata          (8'd0                         ), // input wire [7 : 0] s_axis_config_tdata
    .s_axis_config_tvalid         (1'b1                         ), // input wire s_axis_config_tvalid
    .s_axis_config_tready         (                             ), // output wire s_axis_config_tready
    .s_axis_data_tdata            (yk_data                      ), // input wire [31 : 0] s_axis_data_tdata
    .s_axis_data_tvalid           (yk_valid                     ), // input wire s_axis_data_tvalid
    .s_axis_data_tready           (yk_ready                     ), // output wire s_axis_data_tready
    .s_axis_data_tlast            (yk_tlast                     ), // input wire s_axis_data_tlast
    .m_axis_data_tdata            (yk_data_tdata                ), // output wire [31 : 0] m_axis_data_tdata
    .m_axis_data_tuser            (yk_data_tuser                ), // output wire [23 : 0] m_axis_data_tuser
    .m_axis_data_tvalid           (yk_data_tvalid               ), // output wire m_axis_data_tvalid
    .m_axis_data_tready           (yk_data_tready               ), // input wire m_axis_data_tready
    .m_axis_data_tlast            (yk_data_tlast                ), // output wire m_axis_data_tlast
    .m_axis_status_tdata          (                             ), // output wire [7 : 0] m_axis_status_tdata
    .m_axis_status_tvalid         (                             ), // output wire m_axis_status_tvalid
    .m_axis_status_tready         (                             ), // input wire m_axis_status_tready
    .event_frame_started          (                             ), // output wire event_frame_started
    .event_tlast_unexpected       (                             ), // output wire event_tlast_unexpected
    .event_tlast_missing          (                             ), // output wire event_tlast_missing
    .event_status_channel_halt    (                             ), // output wire event_status_channel_halt
    .event_data_in_channel_halt   (                             ), // output wire event_data_in_channel_halt
    .event_data_out_channel_halt  (                             )// output wire event_data_out_channel_halt
);
//================================================================
//================================================================
initial
begin
        clk = 0;
        rst_n=0;
        data_gen   =0;
        #100;
        rst_n      =1;
        #1000;
        data_gen   =1;
        #100;
        data_gen   =0;


end

always @ (posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)begin         
                data_flog   <= 1'b0;
        end
        else if(data_gen == 1'b1)begin
                data_flog   <= 1'b1;
        end 
        else if(addr_echo   >= 16'd4095)begin
                data_flog   <= 1'b0;
        end
end

always @ (posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)begin         
                addr_echo   <= 12'b0;
        end
        else if(data_flog == 1'b1)begin
                addr_echo   <= addr_echo+12'b1;
        end 
        else begin
                addr_echo   <= 12'b0;
        end
end
always @ (posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)begin         
                douta_vld   <= 1'b0;
        end
        else begin
                douta_vld   <= data_flog;
        end 

end


always @ (posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)begin         
                cnt <= 16'd0;
        end
        else if(s_axis_data_tvalid == 1'b1 && s_axis_data_tready == 1'b1)begin
                cnt <= cnt + 1'b1;
        end 
        else begin
                cnt <= cnt;
        end

end

//================================================================
//================================================================

always #5 clk = ~clk;

endmodule

FPGA实现moldelsim仿真结果

可以看到脉冲压缩的结果高脉冲的点数在。

分别在820,1366,2731位置。计算结果和matlab结果一致。分别代表3KM,5KM以及10KM。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能化包括自动化与非自动化

智能化通常指的是系统或设备具备智能功能&#xff0c;以提高其自主性和效率。智能化可以分为自动化与非自动化两大类&#xff0c;每一类都有其独特的特点和应用场景。 一、自动化 自动化指的是系统能够在无需人为干预的情况下完成任务或操作。自动化系统通常依赖于预设的规则、…

基于LangChain手工测试用例转接口自动化测试生成工具!

接口自动化测试用例是一个老生常谈的问题&#xff0c;在未引入人工智能之前&#xff0c;也有非常多的生成方案&#xff0c;比如如下所示&#xff0c;通过har生成接口自动化测试用例&#xff1a; 但是以上的生成方式依然是有一些弊端&#xff0c;比如 har 本身虽然能表述一定的接…

铁威马NAS教程丨TOS应用中心无法下载应用,显示0%或“准备中“?

故障排除 适用机型 所有 TNAS型号 原因分析 该现象通常是网络配置不正确或文件系统异常引起&#xff1a; 1.获取不到网关&#xff0c;状态栏甚至显示红色的“未连接” 2.路由器自动分配的DNS无法解析出下载服务器的域名 3.文件系统为只读文件系统 解决方法 1.重新获取…

中间件|day1.Redis

Redis 定义 Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c; 散列&#xff08;hash…

TongHttpServer安装部署

TongHttpServer安装部署 毫无背景不是你堕落的理由&#xff0c;而更应该是你前进的动力。你该花时间思考&#xff0c;如何打好一副烂牌&#xff1b;而不是抱怨命运&#xff0c;或者干脆撕牌。 部署环境 TongHttpServer V6.0是一款轻量级负载均衡软件&#xff0c;支持 0SI 四层…

【瑞芯微RV1126(深度学习模型部署)】部署自己训练的yolov8-seg,实现足型检测!

前言 如果按照本系列第一篇博客那样交叉编译了opencv&#xff0c;那本文有些步骤就不用了&#xff0c;比如交叉编译工具链的下载&#xff0c;所以自己斟酌步骤。 本系列第一篇&#xff1a;https://blog.csdn.net/m0_71523511/article/details/139636367 本系列第二篇&#xff…

Android-RK356x GT9XX多点触控设置为单点触控的方法

本文基于RK356x Android11系统描述GT9XX驱动芯片由多点触摸改为单点触摸功能。本次介绍的是触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;Purple Pi OH是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大…

大模型应用——智能客服、机器翻译、文本生成、情感分析、问答系统、金融行业、电商、教育、医疗健康、个性化推荐、图像处理、视频处理、自动驾驶

大模型在各行业中的应用 1. 智能客服 应用场景&#xff1a;大模型可以作为智能客服系统的核心&#xff0c;提供自然流畅的对话体验&#xff0c;解答用户问题、推荐服务或产品&#xff0c;显著提升客户满意度。 效果&#xff1a;通过自然语言处理技术&#xff0c;大模型能够准…

深度学习每周学习总结N7:seq2seq翻译实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 使用seq2seq实现文本翻译一、前期准备工作1. 搭建语言类2. 文本处理函数3. 文件读取函数 二、Seq2Seq 模型1. 编码器&#xff08;Enc…

MySQL基础架构和日志系统

MySQL基础架构和日志系统 1&#xff0c;逻辑架构图1.1 连接器1.2.1 查询缓存1.2.2 分析器1.3 优化器1.4 执行器 2&#xff0c;日志系统2.1 redo log&#xff08;重做日志&#xff09;2.2 binlog&#xff08;归档日志&#xff09;2.3 两阶段提交2.3.1 崩溃恢复机制是什么&#x…

ai智能改写工具,一键智能改写文案效率高

在当今这个信息如洪流般涌来的时代&#xff0c;文案创作的重要性不言而喻。无论是为了吸引读者的目光、还是传达准确的信息&#xff0c;一篇精彩的文案都能发挥巨大的作用。而在这一过程中&#xff0c;ai智能改写工具宛如一颗璀璨的新星&#xff0c;以其独特的魅力和强大的功能…

Datawhale X 魔搭 AI夏令营第四期魔搭-AIGC文生图方向Task3笔记

Task3&#xff1a;进阶上分-实战优化 part1&#xff1a;工具初探一ComfyUI应用场景探索 ComfyUI概述 ComfyUI是一个功能强大、高度模块化的Stable Diffusion图形用户界面和后端系统&#xff0c;它允许用户通过链接不同的节点来构建复杂的图像生成工作流程。这些节点可以包括各…

Windows设置定时任务进行oracle数据库备份

先找到“定时任务计划” 方法1.开始->所有程序->附件->系统工具->定时任务计划 方法2:控制面板->输入计划 进行查询操作 名称随便定&#xff0c;点击下一步 下一步 设置每天的定时执行时间&#xff0c;点下一步 点下一步选择启动程序&#xff0c;点下一步 点…

Bruno API 工具

Bruno 是Postman 和Insomnia 的开源桌面替代品&#xff0c;用于 API 的测试、开发和调试。它将测试集合保存在本地&#xff0c;因此可以使用 Git 或其他版本控制工具来进行协作。 下载地址: https://www.usebruno.com/downloads 功能 1. 左边菜单 Collections Create Collec…

Unity 资源 之 功夫动画包(Kung-Fu animations),极致动作体验

震撼来袭&#xff01;Unity 功夫动画包&#xff0c;极致动作体验 一、前言二&#xff0c;资源包内容三、免费获取资源包 一、前言 这个动画包简直让人惊叹不已&#xff0c;它包含了多达 140 多种不同的动画&#xff01;想象一下&#xff0c;如此丰富的选择&#xff0c;几乎涵盖…

ChatGLM-4-9b-chat本地化|天翼云GPU上vLLM本地部署开源模型完整攻略

“ 拥有一个私有化的领先国产开源大模型&#xff1f;本文详细介绍了如何在天翼云GPU上使用vLLM部署ChatGLM-4-9b-chat本地化模型的完整攻略&#xff0c;助您快速上手。” 01 — vLLM 本来打算用ollama在GPU服务器上部署开源模型GLM4&#xff0c;在之前文章有部署教程&#xff1…

中央空调能量型计费系统,实现节能降耗

中央空调能量型计费系统是一种先进的计费方式&#xff0c;旨在通过科学、合理、公平地分摊中央空调使用费用&#xff0c;促进能源的有效利用和节能降耗。上海智能医疗创新示范基地使用的空调系统正是中央空调能量型计费系统 项目&#xff1a;上海智能医疗创新示范基地 项目情况…

【通信理论知识】数据传送的方式:串/并行;传输方向:单工、半/全双工;传输方式:同步/异步

通信协议与接口知识参考文章&#xff1a; 【通信理论知识】数据传送的方式&#xff1a;串/并行&#xff1b;传输方向&#xff1a;单工、半/全双工&#xff1b;传输方式&#xff1a;同步/异步 【串口通信详解】USART/UART、RS232、RS485标准接口与协议特点解析 【同步串行通信接…

【DGL系列】详细分析DGL中dgl.NID和orig_id的区别

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景知识 深入分析 初步结论 代码验证 实验设计 结果分析 最终结论 扩展思考 本文将详细分析orig_id和dgl.NID的区别。 背景知识 在做子图…

《Redis核心技术与实战》学习笔记4——AOF日志:宕机了,Redis如何避免数据丢失?

文章目录 AOF 日志是如何实现的&#xff1f;三种写回策略 日志文件太大了怎么办&#xff1f;AOF 重写会阻塞吗?小结 大家好&#xff0c;我是大白。 如果有人问你&#xff1a;“你会把 Redis 用在什么业务场景下&#xff1f;”我想你大概率会说&#xff1a;“我会把它当作缓存使…