【MAX7800实现KWS20 demo演示】

news2025/1/16 12:57:24

【MAX7800实现KWS20 demo演示】

  • 1. 概述
  • 2. 关键字定位演示
    • 2.1 构建固件:
    • 2.2 选择板卡
    • 2.3 MAX78000 EVKIT
      • 2.3.1 MAX78000 EVKIT下载程序
      • 2.3.2 MAX78000 EVKIT 跳线设置
      • 2.3.3 MAX78000 EVKIT 操作
    • 2.4 MAX78000 Feather
      • 2.4.1 MAX78000 Feather羽毛板下载固件
      • 2.4.2 MAX78000羽毛板操作
    • 2.5 使用调试终端
  • 3. CNN模型
    • 3.1 网络训练
    • 3.2 网络量化
    • 3.3 网络综合
    • 3.4 KWS20 演示代码
      • 3.4.1 麦克风模式
      • 3.4.2 离线模式
      • 3.4.3 KWS20 演示固件结构
  • 4. MAX7800 羽毛板Eclipse配置
  • 5.小结

在这里插入图片描述

1. 概述

Keyword Spotting Demo 软件演示了如何使用MAX78000 EVKIT 识别大量关键字。
KWS20 演示软件使用第二版 Google 语音命令数据集,其中包含 35 个关键字和超过 100K 的话语:

https://storage.cloud.google.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz

此演示使用了完整数据集中的以下 20 个关键字子集:

[‘up’, ‘down’, ‘left’, ‘right’, ‘stop’, ‘go’, ‘yes’, ‘no’, ‘on’, ‘off’, ‘one’, ‘two’, ‘three’, ‘four’, ‘five’, ‘six’, ‘seven’, ‘eight’, ‘nine’, ‘zero’]
其余关键字和无法识别的词属于“Unknown”类别。

2. 关键字定位演示

2.1 构建固件:

导航到 KWS20 演示软件所在的目录并构建项目:

$ cd /Examples/MAX78000/CNN/kws20_demo
$ make

如果是第一次安装工具后,或者更新了外设文件,请先清理驱动再重建工程:

$ make distclean

2.2 选择板卡

  1. 要为 MAX78000 EVKIT 编译代码,请在 project.mk 中启用BOARD=EvKit_V1:
# Specify the board used
ifeq "$(BOARD)" ""
BOARD=EvKit_V1
#BOARD=FTHR_RevA
endif
  1. 要为 MAX78000 Feather 板编译代码,请在 project.mk 中启用BOARD=FTHR_RevA:
# Specify the board used
ifeq "$(BOARD)" ""
#BOARD=EvKit_V1
BOARD=FTHR_RevA
endif

注意:如果您使用的是 Eclipse,还请确保通过以下方式将 Board 环境变量的值更改为“FTHR_RevA”:

右键单击项目名称 > 属性 > C/C++ 构建 > 环境 > Board"
在这里插入图片描述

2.3 MAX78000 EVKIT

2.3.1 MAX78000 EVKIT下载程序

将 USB 电缆连接到 CN1 (USB/PWR) 并打开电源开关 (SW1)。
将 PICO 适配器连接到 JH5 SWD 接头。
如果您使用的是 Windows,请在 MinGW shell 中使用 OpenOCD 加载固件映像:

openocd -s $MAXIM_PATH/Tools/OpenOCD/scripts -f interface/cmsis-dap.cfg -f target/max78000.cfg -c "program build/MAX78000.elf reset exit"

如果使用 Linux,请执行此步骤:

./openocd -f tcl/interface/cmsis-dap.cfg -f tcl/target/max78000.cfg -c "program build/MAX78000.elf verify reset exit"

确保在加载固件后移除 PICO 适配器。

2.3.2 MAX78000 EVKIT 跳线设置

确保在 JP20-CLK(INT 位置)安装跳线,如下所示:
在这里插入图片描述

注:板载外部振荡器 Y3 用于生成 I2S 时钟。I2S 采样率为 16kHz,以匹配数据集的语音样本。

2.3.3 MAX78000 EVKIT 操作

重新上电后,如果 TFT 显示屏为空白,或如下图显示不正确,请按 RESET (SW5)。

TFT 显示屏显示它已准备就绪。按 PB1 开始:

在这里插入图片描述

一旦红色 LED2 亮起,初始化就完成了,可以接受关键字了。如果 PICO 适配器仍连接到 SWD,请将其断开并重启。

可以检测到以下单词:

['up', 'down', 'left', 'right', 'stop', 'go', 'yes', 'no', 'on', 'off', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'zero']

MAX78000 KWS20 演示固件可识别关键字并报告结果和置信度。
麦克风 (U15) 位于 EVKIT 上的 JH4 和 JH5 接头之间,(MK1) 位于 MAX78000 Feather 板上的 J5 和 J7 音频连接器之间。
在这里插入图片描述

2.4 MAX78000 Feather

2.4.1 MAX78000 Feather羽毛板下载固件

将 USB 电缆连接到 CN1 USB 连接器。
如果您使用的是 Windows,请在 MinGW shell 中使用 OpenOCD 加载固件映像:

openocd -s $MAXIM_PATH/Tools/OpenOCD/scripts -f interface/cmsis-dap.cfg -f target/max78000.cfg -c "program build/MAX78000.elf reset exit"

如果使用 Linux,请执行此步骤:

./openocd -f tcl/interface/cmsis-dap.cfg -f tcl/target/max78000.cfg -c "program build/MAX78000.elf verify reset exit"

2.4.2 MAX78000羽毛板操作

KWS20 演示在通电或按下复位按钮 (SW4) 后自动启动。TFT 显示器是可选的,不随 MAX78000 Feather 板提供。用户应使用 PC 终端程序观察 KWS20 演示结果,如“使用调试终端”部分所述。

可在此处订购兼容 MAX78000 Feather 的 2.4’’ TFT FeatherWing 显示器:

https://learn.adafruit.com/adafruit-2-4-tft-touch-screen-featherwing

这款 TFT 显示器完全组装有双插座,供 MAX78000 Feather 插入。

要使用启用的 TFT 功能编译代码,请使用 project.mk 中的以下设置:

ifeq "$(BOARD)" "FTHR_RevA"
PROJ_CFLAGS += -DENABLE_TFT
endif

使用 TFT 显示器时,请将其电源开关保持在“ON”位置。TFT“重置”按钮也可用作羽化重置。按 PB1 (SW1) 按钮开始演示。
在这里插入图片描述

PB1(SW1)按钮的位置如下图所示:

在这里插入图片描述

2.5 使用调试终端

调试终端显示有关状态和检测到的单词的更多信息。
连接到 CN1 (USB/PWR) 的 USB 电缆提供电源和串行通信。
要配置 PC 终端程序,请选择正确的 COM 端口和设置,如下所示:

在这里插入图片描述

打开电源或按下重置按钮后,终端窗口中将出现以下消息:

在这里插入图片描述

检测词后终端显示:

在这里插入图片描述

KWS20 demo的软件组成如下图所示:

在这里插入图片描述

3. CNN模型

KWS20 v.3 卷积神经网络 (CNN) 模型由具有 8 层的1D CNN 和一个完全连接的层组成,用于从用于训练的 20 个单词词典中识别关键字。

class AI85KWS20Netv3(nn.Module):
    """
    Compound KWS20 v3 Audio net, all with Conv1Ds
    """

    # num_classes = n keywords + 1 unknown
    def __init__(
            self,
            num_classes=21,
            num_channels=128,
            dimensions=(128, 1),  # pylint: disable=unused-argument
            bias=False,
            **kwargs

    ):
        super().__init__()
        self.drop = nn.Dropout(p=0.2)
        # Time: 128 Feature :128
        self.voice_conv1 = ai8x.FusedConv1dReLU(num_channels, 100, 1, 
                                                stride=1, padding=0,
                                                bias=bias, **kwargs)
        # T: 128 F: 100
        self.voice_conv2 = ai8x.FusedConv1dReLU(100, 96, 3, 
                                                stride=1, padding=0,
                                                bias=bias, **kwargs)
        # T: 126 F : 96
        self.voice_conv3 = ai8x.FusedMaxPoolConv1dReLU(96, 64, 3, 
                                                       stride=1, padding=1,
                                                       bias=bias, **kwargs)
        # T: 62 F : 64
        self.voice_conv4 = ai8x.FusedConv1dReLU(64, 48, 3, 
                                                stride=1, padding=0,
                                                bias=bias, **kwargs)
        # T : 60 F : 48
        self.kws_conv1 = ai8x.FusedMaxPoolConv1dReLU(48, 64, 3, 
                                                     stride=1, padding=1,
                                                     bias=bias, **kwargs)
        # T: 30 F : 64
        self.kws_conv2 = ai8x.FusedConv1dReLU(64, 96, 3, 
                                              stride=1, padding=0,
                                              bias=bias, **kwargs)
        # T: 28 F : 96
        self.kws_conv3 = ai8x.FusedAvgPoolConv1dReLU(96, 100, 3, 
                                                     stride=1, padding=1,
                                                     bias=bias, **kwargs)
        # T : 14 F: 100
        self.kws_conv4 = ai8x.FusedMaxPoolConv1dReLU(100, 64, 6, 
                                                     stride=1, padding=1,
                                                     bias=bias, **kwargs)
        # T : 2 F: 128
        self.fc = ai8x.Linear(256, num_classes, bias=bias, wide=True, **kwargs)

    def forward(self, x):  # pylint: disable=arguments-differ
        """Forward prop"""
        # Run CNN
        x = self.voice_conv1(x)
        x = self.voice_conv2(x)
        x = self.drop(x)
        x = self.voice_conv3(x)
        x = self.voice_conv4(x)
        x = self.drop(x)
        x = self.kws_conv1(x)
        x = self.kws_conv2(x)
        x = self.drop(x)
        x = self.kws_conv3(x)
        x = self.kws_conv4(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)

        return x

CNN 输入是 128x128=16384 个 8 位带符号语音样本。

3.1 网络训练

要调用网络训练,请执行脚本:

(ai8x-training) $ ./scripts/train_kws20_v3.sh

如果是第一次,并且本地不存在数据集,scrip会自动下载谷歌语音命令数据集(1秒关键词.wav文件,16KHz采样,16位)到/data/KWS/raw,并处理它使适当的训练、测试和验证数据集集成在 /data/KWS/process/dataset.pt 中。处理步骤通过使用增强技术(如添加白噪声、随机时移和拉伸)来扩展训练数据集,以改善训练结果。此外,每个 16000 个样本单词示例都用零填充,使其成为 128x128=16384 个语音样本。扩充过程将数据集的大小增加了三倍,可能需要 30 分钟才能完成。

AI8X模型训练和量化中描述了网络训练方法的细节

训练未量化网络后,可以通过执行脚本进行评估:

(ai8x-training) $ ./scripts/evaluate_kws20_v3.sh

3.2 网络量化

训练时产生的CNN权重需要量化:

(ai8x-synthesis) $ ./scripts/quantize_kws20_v3.sh

量化的细节在AI8X 模型训练和量化中有描述

3.3 网络综合

网络综合脚本生成通过/失败 C 示例代码,其中包括初始化 MAX78000 CNN 加速器、加载量化 CNN 权重和输入样本以及卸载分类结果的必要函数。具有预期结果的示例输入是此自动生成的代码的一部分以进行验证。以下脚本生成所有示例项目,包括kws20_v3:

(ai8x-synthesis) $ ./gen-demos-max78000.sh

kws20_v3准系统C 代码部分用于 KWS20 演示。特别是,CNN 初始化、权重(内核)和用于加载/卸载权重和样本的辅助函数已从kws20_v3移植到 KWS20 Demo。

3.4 KWS20 演示代码

KWS20 演示有两种模式:使用麦克风(实时)或离线处理:

#define ENABLE_MIC_PROCESSING

3.4.1 麦克风模式

在此模式下,EVKIT I2S Mic 被初始化为以 16KHz 32 位样本运行。在主循环中,检查 I2S 缓冲区并将采样存储到 pChunkBuff缓冲区中。

3.4.2 离线模式

如果未定义 ENABLE_MIC_PROCESSING,则应将包含 16 位样本的头文件(例如kws_five.h)包含在要用作输入的项目中。要从 wav 文件创建头文件,请使用包含的实用程序来记录 wav 文件并将其转换为头文件。

# record 3sec of 16-bit 16KHz sampled wav file 
$ python VoiceRecorder.py -d 3 -o voicefile.wav
# convert to header
$ python RealtimeAudio.py -i voicefile.wav -o voicefile.h

3.4.3 KWS20 演示固件结构

下图为 KWS20 Demo 固件中的处理过程:

在这里插入图片描述

从麦克风/文件中收集的样本是 18/16 位符号的,并被转换为 8 位符号以输入 CNN。如果是麦克风模式,则使用高通滤波器滤除捕获样本中的直流电平。缩放样本以 128 个样本(字节)的块存储在pPreambleCircBuffer循环缓冲区中。

可以调整固件中的以下参数:

#define SAMPLE_SCALE_FACTOR    		4		// multiplies 16-bit samples by this scale factor before converting to 8-bit
#define THRESHOLD_HGIH				350  	// voice detection threshold to find beginning of a keyword
#define THRESHOLD_LOW				100  	// voice detection threshold to find end of a keyword
#define SILENCE_COUNTER_THRESHOLD 	20 		// [>20] number of back to back CHUNK periods with avg < THRESHOLD_LOW to declare the end of a word
#define PREAMBLE_SIZE				30*CHUNK// how many samples before beginning of a keyword to include
#define INFERENCE_THRESHOLD   		49 		// min probability (0-100) to accept an inference

当最后 128 个样本中样本的平均绝对值超过阈值时,标记单词的开头。

当观察到平均绝对阈值低于THRESHOLD_LOW的SILENCE_COUNTER_THRESHOLD背靠背样本块时,会发出单词结束信号。

CNN 需要 1 秒的样本 (128*128) 才能开始处理。此窗口从单词开头前的PREAMBLE_SIZE个样本开始,到 16384
个样本后结束。如果较早确定了一个字的结尾,则 pAI85Buffer 样本缓冲区用零填充。

CNN 相关的 API 函数在cnn.c中。它们用于加载权重和数据,启动CNN,等待CNN完成处理并卸载结果。

如果开发合成新的网络,需要从自动生成的kws20示例工程中移植新的权重文件和相关API函数。此外,如果训练网络中 128x128
样本集的输入层或组织发生变化,则应更改AddTranspose()函数以反映 CNN 内存中新的样本数据排列。

4. MAX7800 羽毛板Eclipse配置

KWS20 例程已经嵌入到example里面,可新建直接调用

注意需要插SD卡,才可以正常运行程序

在这里插入图片描述
选择开发MAXIM项目
在这里插入图片描述

新建kws20例程
在这里插入图片描述

选择相关

在这里插入图片描述

  • 新建成功如下
    在这里插入图片描述

  • 编译成功如下
    在这里插入图片描述

-下载验证
在这里插入图片描述
打印如下:

18:17:42.528 -> 
18:17:42.528 -> 
18:17:42.528 -> ANALOG DEVICES 
18:17:42.531 -> Keyword Spotting Demo
18:17:42.533 -> 
18:17:42.533 -> Ver. 3.1.0 (10/17/22) 
18:17:42.533 -> 
18:17:42.533 -> 
18:17:42.533 -> ***** Init *****
18:17:42.534 -> pChunkBuff: 128
18:17:42.536 -> pPreambleCircBuffer: 3840
18:17:42.538 -> pAI85Buffer: 16384
18:17:42.792 -> SD card mounted.
18:17:42.794 -> Creating directory...
18:17:42.910 -> Directory "001" created.
18:17:42.913 -> Changed directory to "001"
18:17:42.917 -> 
18:17:42.917 -> *** I2S & Mic Init ***
18:17:42.919 -> 
18:17:44.916 -> 
18:17:44.916 -> *** READY ***
18:18:04.413 -> 301952 Word starts from index: 297984, avg:442 > 350 
18:18:05.202 -> 314496: Starts CNN: 1
18:18:05.207 -> 314496: Completes CNN: 1
18:18:05.208 -> CNN Time: 1843 us
18:18:05.209 -> Min: -128,   Max: 127 
18:18:05.212 -> ----------------------------------------- 
18:18:05.216 -> 
18:18:05.216 -> Detected word: TWO (82.0%)
18:18:05.218 -> ----------------------------------------- 
18:18:05.222 -> Creating file "0000_TWO" with length 16384
18:18:05.227 -> File opened!
18:18:05.250 -> 16384 bytes written to file!
18:18:05.259 -> File Closed!
18:18:05.259 -> 
18:18:05.260 -> 

5.小结

通过对这篇文章我们掌握了MAX7800实现KWS20 demo演示,接下来会有许多有趣的实验,尝试与Arduino通讯做语音小车,进而丰富我们的生活。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣
🥳🥳🥳再次非常感谢大赛支持和胡同学🥳🥳🥳
参考文献:
window10下配置Maxim SDK
数据手册
MAX78000板卡项目汇总
应用笔记
【window下配置Maxim SDK环境】
【MAX78000基础案例演示】
MAX78000 关键字定位演示 v.3

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

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

相关文章

IBM MQ MQCSP

一&#xff0c;概念 1.1 用途 用途&#xff1a;MQCSP 结构使授权服务能够验证用户 ID 和密码。您在 MQCONNX 调用上指定 MQCSP 连接安全参数结构。 警告&#xff1a;在某些情况下&#xff0c;客户端应用程序的 MQCSP 结构中的密码将以纯文本形式通过网络发送。要确保客户端应…

【学习笔记58】JavaScript面向对象

一、认识面向对象 &#xff08;一&#xff09;面向过程编程 按照程序执行的过程一步一步的完成程序代码 &#xff08;二&#xff09;面向对象编程 面向对象编程是一种编程的方式/模式官方&#xff1a;对一类具有相同属性和功能的程序代码抽象的描述&#xff0c;实现代码编程…

Triangle Attack: A Query-efficient Decision-based Adversarial Attack

Triangle Attack: A Query-efficient Decision-based Adversarial Attack 三角攻击:一种查询高效的基于决策的对抗性攻击 Abstract 基于决策的攻击对实际应用程序构成了严重的威胁&#xff0c;因为它将目标模型视为一个黑箱&#xff0c;只访问硬预测标签。最近已经做出了很大…

【计组】指令和运算1--《深入浅出计算机组成原理》(二)

一、计算机指令 1、指令 从软件工程师的角度来讲&#xff0c;CPU就是一个执行各种计算机指令&#xff08;Instruction Code&#xff09;的逻辑.。 这里的计算机指令&#xff0c;也可以叫做机器语言。 不同发CPU支持的机器语言不同&#xff0c;如个人电脑用的是Intel的CPU&a…

同样Java后端开发三年,朋友已经涨薪到了30k,而我才刚到12K。必须承认多背背八股文确实有奇效!

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而&#xff0c;小编要说的是&#xff0c;不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿&#xff0c;薪资的差别还是很大的。 众所周知&#xff0c;目前互联网行业是众多行业中薪资待遇最好的&#xff0c;…

2022年NPDP新版教材知识集锦--【第四章节】(2)

【概念设计阶段】(全部获取文末) 概念描述提供了产品概念的优点和特征的定性描述&#xff0c;其必要性体现在&#xff1a; ①为开发团队的所有成员以及与项目相关的成员提供了清晰性和一致性。 ②是向潜在客户解释产品的重要手段之一。 典型流程&#xff1a; 2.1概念工程 …

python使用websocket服务并在fastAPI中启动websocket服务

依赖 pip install websockets-routes 代码 import asyncio import websockets import websockets_routes from websockets.legacy.server import WebSocketServerProtocol from websockets_routes import RoutedPath# 初始化一个router对象 router websockets_routes.Router()…

Archlinux安装软件的那些事

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、ArchLinux1.1 ArchLinux原则1.2 软件包管理1.2.1 软件仓库1.2.2 包管理器2、Pacman2.1 pacman介绍2.…

什么是幂等性?四种接口幂等性方案详解!

幂等性在我们的工作中无处不在&#xff0c;无论是支付场景还是下订单等核心场景都会涉及&#xff0c;也是分布式系统最常遇到的问题&#xff0c;除此之外&#xff0c;也是大厂面试的重灾区。 知道了幂等性的重要性&#xff0c;下面我就详细介绍幂等性以及具体的解决方案&#…

SpringBoot中自动配置

第一种&#xff1a; 给容器中的组件加上 ConfigurationProperties注解即可 测试&#xff1a; Component ConfigurationProperties(prefix "mycar") public class Car {private String brand;private Integer price;private Integer seatNum;public Integer getSeat…

币圈已死,绿色积分是全新的赛道吗?

近几年来&#xff0c;移动互联网行业的迅猛发展&#xff0c;快速改变着社会业态。尽管如此&#xff0c;仍有大量企业线上线下处于割裂状态&#xff0c;2020 年一场疫情的突然爆发&#xff0c;并持续到 2022年&#xff0c;对零售行业造成流量崩塌、供应链中断、市场供需下滑等压…

现代 CSS 高阶技巧,完美的波浪进度条效果。

将专注于实现复杂布局&#xff0c;兼容设备差异&#xff0c;制作酷炫动画&#xff0c;制作复杂交互&#xff0c;提升可访问性及构建奇思妙想效果等方面的内容。 在兼顾基础概述的同时&#xff0c;注重对技巧的挖掘&#xff0c;结合实际进行运用&#xff0c;欢迎大家关注。 正…

金属非金属如何去毛刺 机器人浮动去毛刺

毛刺的产生 在金属非金属零件的加工中&#xff0c;由于切削加工过程中塑性变形引起的毛边&#xff0c;或者是铸造、模锻等加工的飞边&#xff0c;或是焊接挤出的残料&#xff0c;这些与所要求的形状、尺寸有所出入&#xff0c;在被加工零件上派生出的多余部分即为毛刺&#xf…

音视频开发之 ALSA实战!

前言&#xff1a; 今天我们来分享一个开源的音频采集代码&#xff0c;现在大部分音频采集都是通过ALSA框架去采集&#xff0c;如果大家把ALSA采集代码学懂&#xff0c;那么大部分的音频采集都可以搞定。这个代码是用ALSA进行音频PCM的采集并保存到本地文件。一、alsa框架的介绍…

C#语言实例源码系列-实现输入框焦点变色和窗体拖拽改变大小

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

002.组合总和|||——回溯算法

1.题目链接&#xff1a; 216. 组合总和 III 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给一个元素数量k和一个元素和n&#xff0c;要求从范围[1,2,3,4,5,6,7,8,9]中返回所有元素数量为k和元素和为n的组合。&#xff08;每个数字只能使用一次&#xff09; 比如输入k…

深度学习快速入门----Pytorch 系列2

注&#xff1a;参考B站‘小土堆’视频教程 视频链接&#xff1a;【PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】 上一篇&#xff1a;深度学习快速入门----Pytorch 1 文章目录八、神经网络--非线性激活九、神经网络--线性层及其他层…

作为IT行业过来人,我有3个重要建议给后辈程序员!

见字如面&#xff0c;我是军哥&#xff01;作为一名 40 岁的 IT 老兵&#xff0c;我在年轻时踩了不少坑&#xff0c;我总结了其中最重要的 3 个并一次性分享给你&#xff0c;文章不长&#xff0c;你一定要看完哈&#xff5e;1、重视基础还不够&#xff0c;还要注重技术广度和深…

第2-4-8章 规则引擎Drools实战(1)-个人所得税计算器

文章目录9. Drools实战9.1 个人所得税计算器9.1.1 名词解释9.1.2 计算规则9.1.2.1 新税制主要有哪些变化&#xff1f;9.1.2.2 资较高人员本次个税较少&#xff0c;可能到年底扣税增加&#xff1f;9.1.2.3 关于年度汇算清缴9.1.2.4 个人所得税预扣率表&#xff08;居民个人工资、…

科教导刊杂志科教导刊杂志社科教导刊编辑部2022年第27期目录

前沿视角《科教导刊》投稿&#xff1a;cn7kantougao163.com 新时代研究生教育质量评价指标体系的框架构建 李军伟;赵永克;杨丹; 1-3 基于现代学徒制的“多主体、双标准、五维度”人才培养质量评价体系构建 汪帆;刘严; 4-6 高教论坛 新工科背景下地方性院校第二课堂…