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

关于xilinx的FFTIP的使用和仿真

工具:vivado2018.3,modelsim10.6d

场景:在进行数据进行频谱分析的时候,使用FPGA来完成FFT的计算可以加快数据的计算速度。

下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生,通过IP产生的波形数据直接输入到FFT进行傅里叶正变换。然后再使用FFT对数据进行IFFT傅里叶逆变换还原波形数据。过程中完成了fftshift(将零频分量搬移到频谱中心),以及使用cordic计算平方根的过程。

FFT端口说明

端口名称

方向

描述

aclk

I

时钟

aresetn

I

复位

s_axis_config_tvalid

I

配置有效

s_axis_config_tready

O

配置准备好

s_axis_config_tdata

I

针对配置通道的TDATA。携带配置信息: CP_LEN、FWD/INV、NFFT和SCALE_SCH。关于FWD/INV为FFTIP的方式,1为FFT,0为IFFT。当选择FFT点数可配置时NFFT为点数。SCALE_SCH为缩放计划,以确保在计算过程中不溢出。对于不同的IO架构有不同的规则。

s_axis_data_tdata

I

输入数据

s_axis_data_tvalid                

I

数据有效

s_axis_data_tready

O

数据准备好

s_axis_data_tlast

I

输入的一帧最后一个数据

m_axis_data_tvalid

O

输出数据有效

m_axis_data_tready

I

输出数据准备好

m_axis_data_tdata

O

输出数据

m_axis_data_tuser

O

输出数据状态参数。包含XK_INDEX, OVFLO, and BLK_EXP.

XK_INDEX输出数据索引

OVFLO溢出标志
BLK_EXP块指数,字段中出现的值表示在转换过程中数据被缩放的比特总数。例如,如果BLK_EXP的值为00101 = 5,这意味着相关的输出数据(XK_RE,XK_IM)被缩放为5位(向右移5位),或者换句话说,被除以32,以充分利用输出数据路径的可用动态范围而不会溢出。

m_axis_data_tlast

O

输出的最后一个数据。

m_axis_status_tvalid

O

状态有效

m_axis_status_tready

I

状态准备好

m_axis_status_tdata

O

状态数据。包含每一帧的状态休息。

event_frame_started

O

事件帧开始

event_tlast_unexpected

O

当核心在不是帧中最后一个的数据样本上看到s_axis_data_tlast高时有效

event_tlast_missing

O

当一帧的最后一个数据样本上的s_axis_data_tlast为低时断言。

event_fft_overflow

O

当正在从数据输出通道卸载的数据样本中出现溢出时断言。仅在溢出是一个有效的选项时才会出现。

event_data_in_channel_halt

O

当核心从数据输入通道请求数据而没有数据可用时断言。

event_data_out_channel_halt

O

当核心从数据输入通道请求数据而没有数据可用时断言。

event_status_in_channel_halt

O

当核心试图将数据写入状态通道而无法这样做时,将被断言。仅在非实时模式下出现。

FFT IP的配置界面

Channels:从1到12中选择通道数。三种Burst I/O架构均可使用多通道操作。对于浮点格式,通道必须为1。

Transform Length: 选择一次处理所需点的大小。

The Pipelined Streaming I/O:运行连续处理。

Radix-4,Radix-2,Radix-2 Lite Burst I/O。几种不同的实现方式,延迟依次增大,资源依次减少。

Run time configurable Transform Length:允许运行的过程中改变点数。勾选此后注意,s_axis_config_tdata的字段的意义。

DataFormat:选择输入和输出数据样本是否为定点格式,或在IEEE-754单精度(32位)浮点格式中。浮点格式不是当核心处于多通道配置时可用。

Scaling Options:

Scaling:用户自定义缩放格式。注意s_axis_config_tdata的字段需要配置每个阶段的缩放信息。

Block Floating-Point:由核心来判断所需的缩放程度,以实现对可用动态范围的最佳利用,并以块指数的形式报告缩放因子。注意m_axis_data_tuser字段的块指数报告。

Output ordering:自然顺序和反转顺序。这里使用自然顺序。

Optional Output Fields:XK_INDEX,输出数据索引。

资源消耗设置界面。

关于matlab仿真,产生1MHZ的正弦波余弦波信号,采样率为100MHZ。共计1024个点。对其进行FFT。

matlab仿真程序

% 生成正弦波
fc = 1e6;               % 频率
fs = 100e6;             % 采样率
t1 = 0:1/fs:1e-3;       % 时间序列,1微秒
t = t1(1:1024);         %RW需要取整数计算出的频率是真实sin_wave = sin(2 * pi * fc * t);
cos_wave = cos(2 * pi * fc * t);% 复数
plural_wave = cos_wave+ 1i*sin_wave;% 加噪声
data =awgn(cos_wave,100) ;
% data =awgn(plural_wave,100) ;% 绘制原始正弦波数据
figure;
subplot(1,1,1);
plot(t*1e9, imag(plural_wave));
title('原始正弦波');
xlabel('时间 (ns)');
ylabel('幅值');%%做FT变化,算平均功率谱,并画谱输出
FFT_data = data; N = length(FFT_data); w = blackman(N);Fs =100e6;
% Sf_I_Q_wave=fftshift(fft((FFT_data).*w',N)*2.381);
% w = gausswin(N);%高斯窗函数,窗长度为N
gauss_data = fft((FFT_data).*w',N)*2.396;%%做FFT变换,加窗并还原窗系数
Sf_I_Q_wave=fftshift(gauss_data);
Sf_I_Q_wave_dBm =(abs(Sf_I_Q_wave));
% Sf_I_Q_wave_dBm =20*log10(1/N*abs(Sf_I_Q_wave));
X_freq=Fs.*(-N/2:N/2-1)/N;figure(2);plot(X_freq,Sf_I_Q_wave_dBm);title('plural_wave原始数据普');

对实信号余弦波进行傅里叶变换,频谱图如下。

对复信号进行进行傅里叶变换频谱。

在逻辑中我们使用DDSIP来产生我们需要的波形数据。

DDS IP配置界面

可以看到我需要控制DDS的控制字来生成不同频率的波形数据,输出数据的格式为高16位为正弦,低16位为余弦。

输出频率计算公式。

其中X为频率控制字,Fs采样率,即系统时钟。N为多少位的控制字。要输出1MHZ的波形信号的控制字为X=655。

输出波形正好为一个周期1000ns。即1MHZ。

1024点FFT实信号输入。

FFTSHIFT频谱搬移模块

对于FFTSHIFT模块我们打开matlab帮助后可以发现,搬移的效果就是以频谱中心左右两端谱线互换。

ABS求平方根模块

求复数的模,定义为

复数\left | a+b*i \right |\sqrt{a^{2}+b^{2}}

在逻辑中我们使用cordic来计算平方根。

cordicIP配置如下所示

模块仿真

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/08/12 14:14:51
// Design Name: 
// Module Name: vtf_fft_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module vtf_fft_test;
//fft
//input
wire               [31:0] s_axis_data_tdata    ; 
wire                      s_axis_data_tvalid   ; 
wire                      s_axis_data_tready   ; 
wire                      s_axis_data_tlast    ; 
//output
wire               [31:0] m_axis_data_tdata    ; 
wire                      m_axis_data_tvalid   ; 
wire                      m_axis_data_tready   ; 
wire                      m_axis_data_tlast    ; 
wire               [23:0] m_axis_data_tuser    ; //dds
wire                      m_dds_tvalid         ; 
wire               [31:0] m_dds_tdata          ; //system signal
reg                       clk                  ; 
reg                       rst_n                ; 
reg                       data_gen             ; 
reg                       data_flog            ; 
reg                       douta_vld            ; 
reg                [15:0] cnt                  ; //fftshift
wire               [31:0] fftshift_data        ; // 
wire                      fftshift_data_valid  ; // 
wire                [9:0] fftshift_cnt         ; // //abswire               [15:0] abs_data             ; // (output)
wire                      abs_data_valid       ; // (output)
//system signal//
assign  s_axis_data_tdata   = douta_vld ? m_dds_tdata : 32'h0;//给复信号
//assign  s_axis_data_tdata   = douta_vld ? {16'd0,m_dds_tdata[15:0]} : 32'h0;//实信号
assign  s_axis_data_tvalid  = douta_vld;
assign  s_axis_data_tlast   = (cnt == 16'd1023 );assign  m_axis_data_tready  = 1'b1;//FFT后数据
//取实部
wire               [15:0] f_imag               ; 
wire               [15:0] f_real               ; 
wire               [31:0] f_abs                ; assign  f_imag = m_axis_data_tdata[31:16];
assign  f_real = m_axis_data_tdata[15:0];
assign  f_abs  = f_imag + f_real;//=========================================================
dds_compiler_0 u_dds (.aclk                         (clk                         ), // input wire aclk.s_axis_config_tvalid         (1'b1                         ), // input wire s_axis_config_tvalid.s_axis_config_tdata          (16'd655                      ), // input wire [15 : 0] s_axis_config_tdata.m_axis_data_tvalid           (m_dds_tvalid                 ), // output wire m_axis_data_tvalid.m_axis_data_tdata            (m_dds_tdata                  ), // output wire [31 : 0] m_axis_data_tdata.m_axis_phase_tvalid          (                             ), // output wire m_axis_phase_tvalid.m_axis_phase_tdata           (                             )// output wire [15 : 0] m_axis_phase_tdata
);//=========================================================
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         (1'b1                         ), // 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
);//==========================================================
fft_shift u_fft_shift(
//.fft_data                     (m_axis_data_tdata            ), // (input ) .fft_cnt                      (m_axis_data_tuser[9:0]       ), // (input ) .fft_last                     (m_axis_data_tlast            ), // (input ) .fft_data_valid               (m_axis_data_tvalid           ), // (input ) .fftshift_data                (fftshift_data                ), // (output) .fftshift_data_valid          (fftshift_data_valid          ), // (output) .fftshift_cnt                 (fftshift_cnt[9:0]            ), // (output) 
//system signal.sys_clk                      (clk                          ), // (input ) .rst_n                        (rst_n                        )// (input ) );//==========================================================
abs_top u_abs_top(
//.plural_data                  (fftshift_data[31:0]            ), // (input ) (input ).plural_data_valid            (fftshift_data_valid            ), // (input ) (input ).abs_data                     (abs_data[15:0]               ), // (output) (output).abs_data_valid               (abs_data_valid               ), // (output) (output)
//system signal.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'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            (m_axis_data_tdata            ), // input wire [31 : 0] s_axis_data_tdata.s_axis_data_tvalid           (m_axis_data_tvalid           ), // input wire s_axis_data_tvalid.s_axis_data_tready           (m_axis_data_tready           ), // output wire s_axis_data_tready.s_axis_data_tlast            (m_axis_data_tlast            ), // input wire s_axis_data_tlast.m_axis_data_tdata            (                             ), // output wire [31 : 0] m_axis_data_tdata.m_axis_data_tuser            (                             ), // output wire [23 : 0] m_axis_data_tuser.m_axis_data_tvalid           (                             ), // output wire m_axis_data_tvalid.m_axis_data_tready           (1'b1                         ), // input wire m_axis_data_tready.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         (1'b1                         ), // 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
beginclk = 0;rst_n=0;data_gen   =0;#100;rst_n      =1;#1000;data_gen   =1;#100;data_gen   =0;endalways @ (posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)begin         data_flog   <= 1'b0;endelse if(data_gen == 1'b1)begindata_flog   <= 1'b1;end else if(cnt   >= 10'd1022)begindata_flog   <= 1'b0;end
endalways @ (posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)begin         douta_vld   <= 1'b0;endelse begindouta_vld   <= data_flog;end endalways @ (posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)begin         cnt <= 16'd0;endelse if(s_axis_data_tvalid == 1'b1 && s_axis_data_tready == 1'b1)begincnt <= cnt + 1'b1;end else begincnt <= cnt;endend//================================================================
//================================================================always #5 clk = ~clk;endmodule

复信号输入。

实信号输入。

逆傅里叶变换结果

相关文章:

关于xilinx的FFTIP的使用和仿真

工具&#xff1a;vivado2018.3&#xff0c;modelsim10.6d 场景&#xff1a;在进行数据进行频谱分析的时候&#xff0c;使用FPGA来完成FFT的计算可以加快数据的计算速度。 下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生&#xff0c;通过IP产生的波形数据…...

ant design pro 如何去保存颜色

上图 就是实现这样的效果 后端是这样的&#xff0c;这个颜色肯定是存到字符串里的 这是第一步 import mongoose, { Schema, Document } from mongoose;interface IDiscountCard extends Document {title: string;subtitle: string;image: string;shopUrl: string;bgColor: s…...

【Hadoop】建立圈内组件的宏观认识

01存储02计算03调度04其他05回忆 众多组件们构建了大规模分布式计算和存储平台。本文介绍Hadoop生态圈中各个组件的主要功能和作用&#xff0c;辅助学者理解每个组件的定位和用途&#xff0c;从而建立对圈内组件的宏观认识。梳理清楚HDFS、MapReduce、YARN、Hive、HBase、Spark…...

C++:命名空间与输入输出

目录 前言 一、命名空间 1.1 namespace的价值 1.2 namespace的定义 1.3 命名空间的使用 二、C输入&输出 前言 C是一种面向对象的计算机程序设计语言&#xff0c;‌它扩展了C语言的功能&#xff0c;‌并引入了面向对象编程的概念&#xff0c;‌如类、‌继承和多态等&a…...

Azure DevOps Server 数据库日志已满,TF30042: The database is full

Contents 1. 问题描述2. 处理方式 2.1 系统备份2.2 收缩日志2.3 恢复模式2.4 日志增长无法控制 1. 问题描述 Azure DevOps Server 作为微软的软件开发管理平台产品&#xff0c;理所当然地使用了微软的数据库软件SQL Server。 在一个大型的开发团队中&#xff0c;Azure DevOps S…...

[C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换

//转为 bitmap方法一&#xff1a; Bitmap map OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); process_pictureBox.Image map; //转为 bitmap方法二&#xff1a; Bitmap map new Bitmap(mat.ToMemoryStream()); process_pictureBox.Image map; //Image img 转为…...

【区块链+金融服务】基于区块链的供应链金融系统 | FISCO BCOS应用案例

传统供应链金融存在着信息不对称、信任问题和繁琐流程等弊端。为了解决这些问题&#xff0c;京北方搭建了基于区块链 的供应链金融系统&#xff0c;提供了更高效、透明、安全和可信的交易环境。 系 统 采 用 FISCO BCOS 为 底 层 链&#xff0c; 技 术 栈 使 用 Java 语 言 进…...

AI语言大模型商业价值深度解析

点击蓝字 关注我 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;特别是深度学习算法的进步&#xff0c;AI语言大模型在自然语言处理领域的表现日益突出。国内外多种语言大模型如&#xff1a;OpenAi 的 ChatGpt&#xff0c;阿里通义千问&#xff0c;百度文心…...

理解DDD领域驱动设计思想

一、引言 在软件开发的广袤领域中&#xff0c;领域驱动设计&#xff08;Domain-Driven Design&#xff0c;简称 DDD&#xff09;犹如一颗璀璨的明星&#xff0c;备受瞩目。对于期望运用 DDD 开展项目的研发人员而言&#xff0c;明晰 DDD 的本质是实现其有效应用的基石。需注意…...

音频剪辑软件哪个好用?五大音频剪辑软件分享

如果你正打算在家自学视频制作&#xff0c;那么恭喜你&#xff0c;你已经踏上了一段充满魔法与惊喜的旅程&#xff01;不过&#xff0c;别忘了&#xff0c;视频的灵魂不仅仅在于画面&#xff0c;更在于那直击心灵的音效。 想象一下&#xff0c;一个精心剪辑的片段&#xff0c;…...

12.2 使用prometheus-sdk向pushgateway打点

本节重点介绍 : 使用golang sdk打prometheus4种指标&#xff0c;推送到pushgateway gauge、counter、histogram、summary的初始化4种类似的设置值的方法推送到pushgateway的方法 prometheus配置采集pushgateway&#xff0c;grafana上配大盘 golang-sdk 项目地址 https://git…...

HTTPS 详解

HTTPS 是以安全为目标的 HTTP 通道&#xff0c;它在 HTTP 中加入 SSL 层以提高数据传输的安全性。HTTP 被用于在 Web 浏览器和网站服务器之间传递信息&#xff0c;但以明文形式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果攻击者截取了 Web 浏览器和网站服务…...

Microsoft Edge 使用方法与秘诀概览

目录 ​编辑引言 Microsoft Edge 功能与技巧概览 掌握这些设置技巧&#xff0c;让 Edge 浏览器的体验更干净 1. 使用阅读视图 2. 开启广告过滤 3. 管理扩展 4. 个性化新标签页 5. 使用网页截图 6. 清理浏览器缓存 7. 管理启动设置 8. 自定义地址栏建议 9. 使用内置笔…...

【视频】onvif、RTP、RTCP、SDP、RTSP、gb21818区别

ONVIF (Open Network Video Interface Forum): ONVIF是一个全球性的开放网络视频接口论坛&#xff0c;致力于发展基于IP网络的物联网设备的标准化。它提供了一个通用的标准接口&#xff0c;使不同厂商生产的网络视频产品能够互相兼容。 RTP (Real-time Transport Protocol): R…...

8-4 循环神经网络

对于 (8.4.2)中的函数 f f f&#xff0c;隐变量模型不是近似值。 毕竟 h t h_{t} ht​是可以仅仅存储到目前为止观察到的所有数据&#xff0c; 然而这样的操作可能会使计算和存储的代价都变得昂贵。 回想一下&#xff0c;我们在前面讨论过的具有隐藏单元的隐藏层。 值得注意的…...

Linux系统编程 --- 多线程

线程&#xff1a;是进程内的一个执行分支&#xff0c;线程的执行粒度&#xff0c;要比进程要细。 一、线程的概念 1、Linux中线程该如何理解 地址空间就是进程的资源窗口。 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1…...

Grafana中的rate与irate以及histogram

用法 rate rate函数用于计算一个时间序列在给定时间范围内的平均速率。它对每个数据点进行线性插值来计算速率&#xff0c;因此对于平滑和稳定的数据来说&#xff0c;rate是一个不错的选择。语法如下&#xff1a; rate(metric_name[time_range])metric_name: 指标名称。time…...

什么是网络安全态势感知

态势感知是一种基于环境的、动态、整体地洞悉安全风险的能力&#xff0c;是以安全大数据为基础&#xff0c;从全局视角提升对安全威胁的发现识别、理解分析、响应处置能力的一种方式、最终是为了决策与行动&#xff0c;是安全能力的落地 态势感知的重要性 随着网络与信息技术的…...

php 在app中唤起微信app进行支付,并处理回调通知

<?phpnamespace app\api\controller;use think\facade\Db; use think\facade\Log;class Wxzf {...

高效同步与处理:ADTF流服务在自动驾驶数采中的应用

目录 一、ADTF 流服务 1、流服务源&#xff08;Streaming Source&#xff09; 2、流服务汇&#xff08;Streaming Sink&#xff09; 二、数据链路 1、数据管道&#xff08;Data Pipe&#xff09; 2、子流&#xff08;Substreams&#xff09; 3、触发管道&#xff08;Tri…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...