ADC 的音频实验,无线收发模块( nRF24L01)

nRF24L01 采用 QFN20 封装,有 20 个引脚,以下是各引脚的详细介绍:
1. 电源引脚
◦ VDD:电源输入端,一般接 + 3V 电源,为芯片提供工作电压,供电电压范围为 1.9V~3.6V。
◦ VSS:电源地引脚,接地,为芯片提供电气参考电位。
◦ VDD_PA:为功率放大器供电,输出为 1.8V,给射频功率放大器提供所需的电源。
◦ DVDD:去耦电路电源正极端,用于连接去耦电容,为芯片内部电路提供稳定的电源。
2. SPI 接口引脚
◦ CSN:SPI 片选信号引脚,低电平有效。当 CSN 为低电平时,芯片被选中,微处理器可以通过 SPI 接口对 nRF24L01 进行配置和数据传输。
◦ SCK:SPI 时钟引脚,用于同步 SPI 数据传输,由微处理器提供时钟信号,决定数据传输的速率和时序。
◦ MOSI:主设备输出从设备输入引脚,微处理器通过该引脚将数据发送到 nRF24L01 芯片中,进行寄存器配置、发送数据等操作。
◦ MISO:主设备输入从设备输出引脚,nRF24L01 通过该引脚将数据返回给微处理器,如返回寄存器的值、接收的数据等。
3. 控制与状态引脚
◦ CE:使能发射或接收引脚,数字输入。在 CSN 为低的情况下,CE 协同 CONFIG 寄存器共同决定 nRF24L01 的状态,用于选择芯片的工作模式,如发射模式、接收模式、待机模式等。
◦ IRQ:中断标志位引脚,数字输出,低电平触发。当状态寄存器中 TX_DS(数据发送完成中断位)、RX_DR(接收数据中断位)或 MAX_RT(达到最多次重发中断位)为高时触发中断,通知微处理器进行相应的处理。
4. 晶体振荡器引脚
◦ XC2:晶体振荡器 2 脚,模拟输出,用于连接外部晶体振荡器的一端,与 XC1 共同构成晶体振荡电路,为芯片提供时钟信号。
◦ XC1:晶体振荡器 1 脚 / 外部时钟输入脚,模拟输入,可连接外部晶体振荡器的另一端,也可以作为外部时钟信号的输入引脚。
5. 天线接口引脚
◦ ANT1:天线接口 1,用于连接天线,实现射频信号的发射和接收。
◦ ANT2:天线接口 2,同样用于连接天线,与 ANT1 共同作用,提高射频信号的传输性能。
6. 参考电流输入引脚
◦ IREF:参考电流输入引脚,模拟输入,用于输入参考电流,为芯片内部的电路提供基准电流。

  1. ADC 配置

/* ADC 及引脚 定义 */

#define ADC_ADCX_CHY_GPIO_PORT GPIOA

#define ADC_ADCX_CHY_GPIO_PIN GPIO_PIN_5

#define ADC_ADCX_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE();\

}while(0) /* PA 口时钟使能 */

#define ADC_ADCX ADC1

#define ADC_ADCX_CHY ADC_CHANNEL_5 /* 通道 Y, 0 <= Y <= 16 */

/* ADC1 时钟使能 */

#define ADC_ADCX_CHY_CLK_ENABLE() do{ __HAL_RCC_ADC1_CLK_ENABLE();}while(0)

ADC_HandleTypeDef hadc;

void ADC_Init(void)

{

        __HAL_RCC_ADC1_CLK_ENABLE();// 使能ADC时钟

    //  配置ADC结构体参数

    hadc.Instance = ADC1;  // 选择使用ADC1,

hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;

    // 时钟预分频,这里将APB2时钟(PCLK)除以4作为ADC时钟,

hadc.Init.Resolution = ADC_RESOLUTION_12B; // 分辨率设置为12位,这意味着ADC转换结果的范围是0 - 4095

hadc.Init.ScanConvMode = DISABLE; // 禁用扫描模式,因为我们只处理单个通道

hadc.Init.ContinuousConvMode = ENABLE;

// 启用连续转换模式,ADC会不断进行转换,而不是只进行一次

hadc.Init.DiscontinuousConvMode = DISABLE; // 禁用不连续转换模式

hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

// 不使用外部触发转换,即采用软件触发

 hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发ADC转换

hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐,转换结果的低12位有效

hadc.Init.NbrOfConversion = 1; // 转换通道数量为1

hadc.Init.DMAContinuousRequests = DISABLE; // 禁用DMA连续请求,这里不使用DMA传输

hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; // 单个转换结束标志

    // 3. 初始化ADC

if (HAL_ADC_Init(&hadc) != HAL_OK)

    {

        Error_Handler();// 初始化失败处理

    }

    ADC_ChannelConfTypeDef sConfig;// 4. 配置ADC通道

sConfig.Channel = ADC_CHANNEL_0;  // 选择ADC通道0,可根据实际连接的引脚修改

    sConfig.Rank = 1; // 通道转换顺序为第1个

    sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

    // 采样时间设置为3个ADC时钟周期,可根据需要调整

    if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)

    {

                Error_Handler();// 通道配置失败处理

    }

}

// 错误处理函数示例

void Error_Handler(void)

{

    while (1)

    {

        // 可以添加错误提示代码,如点亮LED等

    }

}

音频信号采集,模拟信号转换为数字信号

uint16_t adc_value;

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)

{

    if (hadc->Instance == ADC1)

    {

        adc_value = HAL_ADC_GetValue(hadc);

        // 在这里可以对采集到的数字音频信号进行进一步处理

GPIO_InitTypeDef gpio_init_struct;

ADC_ADCX_CHY_CLK_ENABLE(); /* 使能 ADCx 时钟 */

ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启 GPIO 时钟 */

/* AD 采集引脚模式设置,模拟输入 */

gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN;

gpio_init_struct.Mode = GPIO_MODE_ANALOG;

gpio_init_struct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, &gpio_init_struct);

    }

}

编码与调制

#include "nrf24l01.h"

void ASK_Modulate(uint16_t data)

{

    // 将数字信号转换为适合ASK调制的形式,例如0对应低电平,非0对应高电平

    uint8_t modulated_data = (data == 0)? 0 : 1;

    // 发送调制后的数据到nRF24L01

    NRF24L01_TxPacket(&modulated_data);

}

无线传输

#include "stm32f4xx_hal.h"

#include "nrf24l01.h"

// 定义nRF24L01相关引脚

#define NRF24L01_CE_Pin GPIO_PIN_0

#define NRF24L01_CE_GPIO_Port GPIOA

#define NRF24L01_CSN_Pin GPIO_PIN_1

#define NRF24L01_CSN_GPIO_Port GPIOA

#define NRF24L01_IRQ_Pin GPIO_PIN_2

#define NRF24L01_IRQ_GPIO_Port GPIOA

// 定义SPI句柄

extern SPI_HandleTypeDef hspi1;

// 初始化nRF24L01相关GPIO引脚

static void NRF24L01_GPIO_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct

= {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

    // 配置CE引脚

    GPIO_InitStruct

.Pin = NRF24L01_CE_Pin;

    GPIO_InitStruct

.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct

.Pull = GPIO_NOPULL;

    GPIO_InitStruct

.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init(NRF24L01_CE_GPIO_Port, &GPIO_InitStruct);

    // 配置CSN引脚

    GPIO_InitStruct

.Pin = NRF24L01_CSN_Pin;

    GPIO_InitStruct

.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct

.Pull = GPIO_NOPULL;

    GPIO_InitStruct

.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init(NRF24L01_CSN_GPIO_Port, &GPIO_InitStruct);

    // 配置IRQ引脚

    GPIO_InitStruct

.Pin = NRF24L01_IRQ_Pin;

    GPIO_InitStruct

.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct

.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(NRF24L01_IRQ_GPIO_Port, &GPIO_InitStruct);

    // 初始化CE和CSN引脚电平

    HAL_GPIO_WritePin(NRF24L01_CE_GPIO_Port, NRF24L01_CE_Pin, GPIO_PIN_RESET);

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);

}

// 向nRF24L01写寄存器

static void NRF24L01_Write_Reg(uint8_t reg, uint8_t value)

{

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET);

    HAL_SPI_Transmit(&hspi1, ®, 1, 100);

    HAL_SPI_Transmit(&hspi1, &value, 1, 100);

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);

}

// 从nRF24L01读寄存器

static uint8_t NRF24L01_Read_Reg(uint8_t reg)

{

    uint8_t value;

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET);

    HAL_SPI_Transmit(&hspi1, ®, 1, 100);

    HAL_SPI_Receive(&hspi1, &value, 1, 100);

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);

    return value;

}

// 初始化nRF24L01

void NRF24L01_Init(void)

{

    // 初始化相关GPIO引脚

    NRF24L01_GPIO_Init();

    // 延时一段时间等待nRF24L01上电稳定

    HAL_Delay(100);

    // 配置为发射模式(可根据需要修改为接收模式)

    NRF24L01_Write_Reg(NRF24L01_REG_CONFIG, 0x0E); // 使能CRC,2字节CRC校验,上电,发射模式

    // 设置通道频率

    NRF24L01_Write_Reg(NRF24L01_REG_RF_CH, 0x40); // 通道76

    // 设置数据速率和发射功率

    NRF24L01_Write_Reg(NRF24L01_REG_RF_SETUP, 0x0F); // 2Mbps速率,最大发射功率

    // 设置接收地址宽度

    NRF24L01_Write_Reg(NRF24L01_REG_SETUP_AW, 0x03); // 5字节地址宽度

    // 设置自动重发时间和次数

    NRF24L01_Write_Reg(NRF24L01_REG_SETUP_RETR, 0x1A); // 自动重发延迟500us,重发次数10次

    // 设置接收通道0地址

    uint8_t rx_addr_p0[5] = {0xE7, 0xE7, 0xE7, 0xE7, 0xE7};

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET);

    HAL_SPI_Transmit(&hspi1, (uint8_t *)&NRF24L01_CMD_WRITE_REG + NRF24L01_REG_RX_ADDR_P0, 1, 100);

    HAL_SPI_Transmit(&hspi1, rx_addr_p0, 5, 100);

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);

    // 设置发射地址

    uint8_t tx_addr[5] = {0xE7, 0xE7, 0xE7, 0xE7, 0xE7};

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET);

    HAL_SPI_Transmit(&hspi1, (uint8_t *)&NRF24L01_CMD_WRITE_REG + NRF24L01_REG_TX_ADDR, 1, 100);

    HAL_SPI_Transmit(&hspi1, tx_addr, 5, 100);

    HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);

    // 设置接收通道0数据长度

    NRF24L01_Write_Reg(NRF24L01_REG_RX_PW_P0, 1); // 1字节数据长度

    // 清除中断标志

    NRF24L01_Write_Reg(NRF24L01_REG_STATUS, 0x70);

}int main(void)

{

    // 初始化ADC、nRF24L01等

    ADC_Init();

    NRF24L01_Init();

    while (1)

    {

        // 启动ADC转换

        HAL_ADC_Start_IT(&hadc);

        // 等待ADC转换完成,在中断中获取adc_value

        // 对采集到的音频数据进行编码和ASK调制并发送

        ASK_Modulate(adc_value);

    }

}

DAC 实验数模转换器

typedef struct

{

 DAC_TypeDef *Instance; /* DAC 寄存器基地址 */

 __IO HAL_DAC_StateTypeDef State; /* DAC 工作状态 */

 HAL_LockTypeDef Lock; /* DAC 锁定对象 */

 DMA_HandleTypeDef *DMA_Handle1; /* 通道 1 的 DMA 处理句柄指针 */

 DMA_HandleTypeDef *DMA_Handle2; /* 通道 2 的 DMA 处理句柄指针 */

 __IO uint32_t ErrorCode; /* DAC 错误代码 */

} DAC_HandleTypeDef;

typedef struct

{

  uint32_t Trigger;     //指定DAC触发源

DAC_TRIGGER_NONE:不使用触发源,通过软件触发。

DAC_TRIGGER_T6_TRGO:使用定时器 6 的触发输出(TRGO)作为触发源。

DAC_TRIGGER_T3_TRGO:使用定时器 3 的触发输出(TRGO)作为触发源。

  uint32_t OutputBuffer;  //指定DAC输出缓冲状态

DAC_OUTPUTBUFFER_ENABLE:使能输出缓冲,提高输出驱动能力。

DAC_OUTPUTBUFFER_DISABLE:禁用输出缓冲。

} DAC_InitTypeDef;

MSP 初始化函数 HAL_DAC_MspInit,

void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac);

DAC 的通道参数初始化函数:

HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef *hdac,

DAC_ChannelConfTypeDef *sConfig, uint32_t Channel);

typedef struct

{

 uint32_t DAC_Trigger; /* DAC 触发源的选择 */

 uint32_t DAC_OutputBuffer; /* 启用或者禁用 DAC 通道输出缓冲区 */

} DAC_ChannelConfTypeDef;

使能启动 DAC 转换通道函数,

HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);

DAC 的通道输出值函数,其声明如下:

HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel,

uint32_t Alignment, uint32_t Data);

Channel选择输出通道, DAC_CHANNEL_1或DAC_CHANNEL_2

DAC 读取通道输出值函数:

uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef *hdac, uint32_t Channel);

启动 DAC 使用 DMA 方式传输函数,

HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel,

uint32_t *pData, uint32_t Length, uint32_t Alignment);

形参 3 是使用 DAC 输出数据缓冲区的指针。

形参 4 是 DAC 输出数据的长度。

形参 5 是指定 DAC 通道的数据对齐方式,有:DAC_ALIGN_8B_R(8 位右对齐)、

DAC_ALIGN_12B_L(12 位左对齐)和 DAC_ALIGN_12B_R(12 位右对齐)三种方式

停止 DAC 的 DMA 方式函数,其声明如下:

HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel);

配置主模式下的定时器触发输出选择函数,其声明如下:

HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(

TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig);

接收端,无线接收

uint8_t received_data;

void NRF24L01_Receive(void)

{

    if (NRF24L01_RxPacket(&received_data) == 0)

    {

        // 接收成功,对received_data进行处理

    }

}

解调与解码

uint16_t ASK_Demodulate(uint8_t data)

{

    // ASK解调,将接收到的数据转换为数字音频信号形式

return (data == 0)? 0 : 1000; // 这里假设0对应0,1对应1000,实际需根据编码情况调整

}

DAC 配置与音频输出

DAC_HandleTypeDef hdac;

void DAC_Init(void)

{

    hdac.Instance = DAC;

    hdac.Init.OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;

    HAL_DAC_Init(&hdac);

    // 配置DAC通道

    DAC_ChannelConfTypeDef sConfig;

    sConfig.DAC_Channel = DAC_CHANNEL_1;

    sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;

    HAL_DAC_ConfigChannel(&hdac, &sConfig);

}

int main(void)

{

    // 初始化nRF24L01、DAC等

    NRF24L01_Init();

    DAC_Init();

    while (1)

    {

        // 接收无线数据

        NRF24L01_Receive();

        // 对接收数据进行ASK解调

        uint16_t demodulated_data = ASK_Demodulate(received_data);

        // 通过DAC输出模拟音频信号

        HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, demodulated_data);

    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【css】width:100%;padding:20px;造成超出100%宽度的解决办法 - box-sizing的使用方法 - CSS布局

问题 修改效果 解决方法 .xx {width: 100%;padding: 0 20px;box-sizing: border-box; } 默认box-sizing: content-box下&#xff0c; width 内容的宽度 height 内容的高度 宽度和高度的计算值都不包含内容的边框&#xff08;border&#xff09;和内边距&#xff08;padding&…

C++ Primer 函数基础

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

滤波总结 波形处理原理 如何对一个规律的波形进行滤波 显现出真正的波形 如何设计滤波

需要用到的软件:waveserialport vofa++ 1.波形想用MCU进行采集首先你要考虑到你的采集频率因为如果你的对象波形即你要采集的波形,他过于快速的话有一些MCU它是不能的比如说有一些它的主频才36兆72兆呢你如果遇到一个特别快的波形毫秒级别那他就检测不了 2.…

PyQt组态软件 拖拽设计界面测试

PyQt组态软件测试 最近在研究PyQt,尝试写个拖拽设计界面的组态软件&#xff0c;目前实现的功能如下&#xff1a; 支持拖入控件&#xff0c;鼠标拖动控件位置 拖动控件边缘修改控件大小支持属性编辑器&#xff0c;修改当前选中控件的属性 拖动框选控件&#xff0c;点选控件 控…

算法学习笔记之贪心算法

导引&#xff08;硕鼠的交易&#xff09; 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间&#xff0c;第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换&#xff0c;硕鼠可以按比例来交换&#xff0c;不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…

把 DeepSeek1.5b 部署在显卡小于4G的电脑上

这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好设置Ollama环境变量验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话 调整gpu精度 介绍 Deepseek1.5b能够运行在只用cpu和gpu内…

第四十四篇--Tesla P40+Janus-Pro-7B部署与测试

环境 系统&#xff1a;CentOS-7 CPU: 14C28T 显卡&#xff1a;Tesla P40 24G 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26创建环境 conda create --name trans python3.10torch 2.6.0 transformers 4.48.3克隆项目 git clone https:/…

「vue3-element-admin」Vue3 + TypeScript 项目整合 Animate.css 动画效果实战指南

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

LabVIEW太阳能制冷监控系统

在全球能源需求日益增长的背景下&#xff0c;太阳能作为一种无限再生能源&#xff0c;被广泛应用于各种能源系统中。本基于LabVIEW软件和STM32F105控制器的太阳能制冷监控系统的设计与实现&#xff0c;提供一个高效、经济的太阳能利用方案&#xff0c;以应对能源消耗的挑战。 项…

【openresty服务器】:源码编译openresty支持ssl,增加service系统服务,开机启动,自己本地签名证书,配置https访问

1&#xff0c;openresty 源码安装&#xff0c;带ssl模块 https://openresty.org/cn/download.html &#xff08;1&#xff09;PCRE库 PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式&#xff0c;那么在编译Nginx时就必须把PCRE库编译进Nginx&#xf…

迅为RK3568开发板篇Openharmony配置HDF控制UART-什么是串口

串口&#xff08;Serial Port&#xff09;也叫串行通信接口&#xff0c;通常也叫做 COM 接口&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输。 两个 UART 设备的连接示意图如下&#xff0c;UART 与其他模块一般用 2 线…

Anaconda +Jupyter Notebook安装(2025最新版)

Anaconda安装&#xff08;2025最新版&#xff09; Anaconda简介安装1&#xff1a;下载anaconda安装包2&#xff1a; 安装anaconda3&#xff1a;配置环境变量4&#xff1a;检查是否安装成功5&#xff1a;更改镜像源6&#xff1a;更新包7&#xff1a;检查 Jupyter Notebook一.Jup…

HtmlRAG:RAG系统中,HTML比纯文本效果更好

HtmlRAG 方法通过使用 HTML 而不是纯文本来增强 RAG 系统中的知识表示能力。通过 HTML 清洗和两步块树修剪方法&#xff0c;在保持关键信息的同时缩短了 HTML 文档的长度。这种方法优于现有基于纯文本的RAG的性能。 方法 其实主要看下围绕html提纯思路&#xff0c;将提纯后的…

Linux 文件系统:恢复已删除文件的挑战

如今&#xff0c;Linux 操作系统越来越受欢迎。它的明显优势首先是免费。此外&#xff0c;该操作系统提供了种类繁多的版本及其衍生产品&#xff0c;可满足从手机到超级计算机等设备的不同用户需求。 Linux 操作系统使用独有的文件系统&#xff0c;包括 Ext2、Ext3 和 Ext4、X…

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab)

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测&#xff08;Maltab&#xff09; 完整代码私信回复三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测&#xff08;Maltab&#xff09; 一、引言 1、研究背景和意义 在现代数据科学领域&#xff0c;时间序列…

提供可传递的易受攻击的依赖项

问题如图所示&#xff1a; 原因&#xff1a;okhttp3.version 3.14.9 版本存在部分漏洞&#xff0c;在 maven 仓库是可以看到的 maven 地址&#xff1a; maven 下图中 Vulnerabilities 即为漏洞 处理&#xff1a;换一个无漏洞的版本即可

使用pocketpal-ai在手机上搭建本地AI聊天环境

1、下载安装pocketpal-ai 安装github的release APK 2、安装大模型 搜索并下载模型&#xff0c;没找到deepseek官方的&#xff0c;因为海外的开发者上传了一堆乱七八糟的deepseek qwen模型&#xff0c;导致根本找不到官方上传的……deepseek一开源他们觉得自己又行了。 点击之…

头歌实验--面向对象程序设计

目录 实验五 类的继承与派生 第1关&#xff1a;简易商品系统 任务描述 答案代码 第2关&#xff1a;公司支出计算 任务描述 答案代码 第3关&#xff1a;棱柱体问题 任务描述 答案代码 实验五 类的继承与派生 第1关&#xff1a;简易商品系统 任务描述 答案代码 #incl…

卷积神经网络实战人脸检测与识别

文章目录 前言一、人脸识别一般过程二、人脸检测主流算法1. MTCNN2. RetinaFace3. CenterFace4. BlazeFace5. YOLO6. SSD7. CascadeCNN 三、人脸识别主流算法1.deepface2.FaceNet3.ArcFace4.VGGFace5.DeepID 四、人脸识别系统实现0.安装教程与资源说明1. 界面采用PyQt5框架2.人…

Spring IoC的实现机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Spring IoC的实现机制是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring IoC的实现机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring IoC&#xff08;Inversion of Control…