音频数据如果在中断中会随机给的那就放入队列或者缓冲区;队列缓冲区对音频的作用

回采的数据是在中断函数au0_dma_isr_data_output里面给的,而给算法的时候是在主程序karaok_sdadc_process,这样子就会出现中断给的数据和当前的mic帧不匹配,或者说每次的差值不一定,算法就会有问题,解决办法是讲回采数据放入队列,给个缓冲区来循环取放值,这样子缓存去的数据先进先出,就可以实现存取长时间的数据,在这长时间的情况下,一定能轮到另外一边主程序karaok_sdadc_process运行,以拿到数据

错误模型如下,没加循环缓存

#include "include.h"
#include "func.h"
#include "karaok_list.h"#if SYS_KARAOK_EN
#define AUDIO_DEBUG/****************************************************************************** Module    :*****************************************************************************/
extern u8 mdac_spr_hold;                            //开启将MDAC的采样率固定为跟LR一样
void bt_aec_process(u8 *ptr, u32 samples, int ch_mode);
void bt_sco_tx_process(u8 *ptr, u32 samples, int ch_mode);static karaok_list_cfg_t karaok_list_cfg AT(.func_list.cfg.karaok);static module_link_list_str_t karaok_link_list_tbl[] = {
/*  模块类型,                   使能, 初始化,                       输入接口,                         设置输出*/{KARAOK_INPUT_TYPE,          1,     karaok_audio_init,             karaok_audio_input,                karaok_audio_output_callback_set},  // {MIC_MSC_HIFI4_EFFECT_TYPE,  1,     mic_hifi4_effect_audio_init,   mic_hifi4_effect_audio_buf_input,  mic_hifi4_effect_audio_output_callback_set},// {SRC1_OUT_TYPE,              1,     src1_out_init,                 src1_out_audio_input,              NULL},  {SRC2_OUT_TYPE,             1,     src2_out_init,                  src2_out_audio_input,               NULL},    
};
#define MICBUF_LENGTH 4096
WEAK uint32_t micbuf_length_weak = MICBUF_LENGTH;
u8 ude_micbuf[MICBUF_LENGTH] AT(.ude.aubuf);//这个变量也要跟buf一样大小
short mic_buff[MIC_SAMPLES_LEN] AT(.mic_algo.buf); 
short aec_mic_buff[AEC_MIC_48K_EACH_SAMPLES_LEN] AT(.mic_algo.buf);
short aec222_mic_buff[AEC_MIC_48K_EACH_SAMPLES_LEN] AT(.usb_222dev.buf);  
#ifdef TEST_MODE
short interleaved_channel_buff[MIC_SAMPLES_16K_STEP] AT(.mic_algo.buf); 
#endif#if DAC_DMA_OUTPUT_EN || FUNC_REC_EN
#define DAC_DMA_OUTPUT_SAMPLES          MIC_EACH_BUFF_LEN //byte not shortu8 au0_dma_buff[DAC_DMA_OUTPUT_SAMPLES*4] AT(.au0out_buf);     //DMA OUT的中断缓存,至少为 au0_dma_start_do 的 samples*2*(1<<is_24bits)*2 Bytevoid au0_dma_start_do(u32 type, u8 *au0_dma_addr, u16 samples, u8 is_24bits);AT(.text.au0dma) WEAK
void au0_dma_start(u32 type)
{au0_dma_start_do(type, au0_dma_buff, DAC_DMA_OUTPUT_SAMPLES, 0);
}#if DAC_DMA_OUTPUT_EN#ifdef AUDIO_DEBUG
AT(.com_text.au0dma1)
const char au0_dma_output_str[] = "au0_size_1s_sampling_rate:%d, size:%d\n";
#endifAT(.com_text.au0dma)
void au0_dma_isr_data_output(void *ptr/*16bit stereo*/, u32 size/*Byte*/)//采样率只可以设置成48k或者44.1k
{// for (u32 i = MIC_SAMPLES_AEC_STEP, j = 0; i < MIC_SAMPLES_LEN; i+=3, j+=2){//     mic_buff[i] = (*((short *)ptr+j) + *((short *)ptr+j+1))/2;// }// for (u32 i = MIC_SAMPLES_AEC_STEP, j = 0; i < MIC_SAMPLES_16K_STEP; i++, j+=2){//     mic_buff[i] = (*((short *)ptr+j) + *((short *)ptr+j+1))/2;// } for (u32 i = 0, j = 0; i < AEC_MIC_48K_EACH_SAMPLES_LEN; i++, j+=2){aec_mic_buff[i] = (*((short *)ptr+j) + *((short *)ptr+j+1))/2;}         
#ifdef AUDIO_DEBUGstatic u32 ticks = 0;static u32 sampling_rate = 0;sampling_rate += size/4;//双通道,16位,byte,48kif (tick_check_expire(ticks, 1000)) {ticks = tick_get();my_printf(au0_dma_output_str, sampling_rate, size);//采样率只可以设置成48k或者44.1ksampling_rate = 0;}
#endif   }
#endif // DAC_DMA_OUTPUT_EN
#endif // DAC_DMA_OUTPUT_EN || FUNC_REC_ENAT(.com_text.func_list.karaok)
void my_algo_process(short *ptr)
{   for(int i = 0; i < MIC_48K_EACH_SAMPLES_LEN; i++){ptr[i] = 10 * ptr[i + MIC_SAMPLES_MIC_STEP];//algo}  for(int i = 0, j = 0; i < MIC_48K_EACH_SAMPLES_LEN; i+=3, j++){ptr[j + MIC_SAMPLES_16K_STEP] = ptr[i];//16k}  for(int i = 0, j = 0; i < MIC_48K_EACH_SAMPLES_LEN; i+=6, j++){ptr[j + MIC_SAMPLES_8K_STEP] = ptr[i];//8k}        
}#ifdef TEST_MODE
AT(.com_text.func_list.karaok)
void interleaved_channel(short *scr, short *dst)
{   for(int i = 0, j = 0; i < MIC_48K_EACH_SAMPLES_LEN; i++, j+=3){dst[j] = scr[i + MIC_SAMPLES_ALGO_STEP];//algodst[j + 1] = scr[i + MIC_SAMPLES_MIC_STEP];//micdst[j + 2] = scr[i + MIC_SAMPLES_AEC_STEP];//aec}         
}
#endifAT(.com_text.func_list.karaok)
void karaok_audio_init(u8 sample_rate, u16 samples, u8 channel)
{memset(&karaok_list_cfg, 0, sizeof(karaok_list_cfg_t));karaok_list_cfg.sample_rate = sample_rate;my_printf("%s: MDACVOLCON %x\n", __func__, MDACVOLCON);my_printf("%s: sample_rate %d\n", __func__, sample_rate);// bsp_change_md_volume(4, 1);//调节mdac输出音量my_printf("%s: MDACVOLCON %x\n", __func__, MDACVOLCON);my_printf("%s: bt_sco_is_msbd %d\n", __func__, bt_sco_is_msbc());//判断蓝牙录音的采样率:1(16k),0(8k)// mdac_spr_set(SPR_16000);mdac_spr_hold = 0;}AT(.com_text.func_list.karaok)
void karaok_audio_input(u8 *ptr, u32 samples, int ch_mode, u32 is_24bits, void *param)
{if (karaok_list_cfg.callback) {karaok_list_cfg.callback((u8 *)mic_buff, samples, MIC_CHANNEL, is_24bits, param);}
}AT(.text.src)
void karaok_audio_output_callback_set(audio_callback_t callback)
{karaok_list_cfg.callback = callback;
}AT(.text.bsp.bsp.unicast)
void karaok_module_init(u8 sample_rate)
{
//    my_printf("%s\n", __func__);my_printf("%s: sample_rate %d\n", __func__, sample_rate);module_link_list_init(karaok_link_list_tbl,sizeof(karaok_link_list_tbl)/sizeof(module_link_list_str_t), sample_rate, 10, 2);
}AT(.text.bsp.bsp.unicast)
void karaok_module_exit(void)
{
//    my_printf("%s\n", __func__);src1_fade_out();
}//AT(.com_text.karaok.proc1)
//const char k_sdadc_str[] = "get_karaok_sco_sta():%d, sample_cnt:%d\n";
AT(.com_text.karaok.proc)
void karaok_sdadc_process(u8 *ptr, u32 samples, int ch_mode)
{u8 channel = (ch_mode&BIT(0)) + 1;u8 in_24bits = (ch_mode&BIT(1)) ? 1 : 0;memcpy(mic_buff + MIC_SAMPLES_MIC_STEP, ptr, MIC_48K_EACH_SAMPLES_LEN * sizeof(short));memcpy(mic_buff + MIC_SAMPLES_AEC_STEP, aec_mic_buff, MIC_48K_EACH_SAMPLES_LEN * sizeof(short));    
#ifdef AUDIO_DEBUGstatic u32 p_algo_ticks = 0;static u32 n_algo_ticks = 0;static u32 lastTimestamp = 0;static u32 timeInterval = 0;      p_algo_ticks = tick_get();if (lastTimestamp != 0) {timeInterval = p_algo_ticks - lastTimestamp;}lastTimestamp = p_algo_ticks;    
#endif //AUDIO_DEBUGhifi4_effect_mic_process_new(XTP_EFFECT_ID_SPEAKER, (u8 *)mic_buff, MIC_SAMPLES_LEN, MIC_CHANNEL, 0);// my_algo_process(mic_buff);#ifdef AUDIO_DEBUGn_algo_ticks = tick_get(); 
#endif//AUDIO_DEBUGif (dev_is_online(DEV_USBPC)) {
#ifdef TEST_MODEinterleaved_channel(mic_buff, interleaved_channel_buff);usbmic_sdadc_process((u8 *)interleaved_channel_buff, samples, MIC_TEST_CHANNEL);
#elseusbmic_sdadc_process((u8 *)mic_buff, samples, MIC_CHANNEL);
#endif//TEST_MODE        }audio_process_param_t audio_process_param;audio_process_param.link_id = INPUT_MIC_ID;if (get_karaok_sco_sta()) {if (bt_sco_is_msbc()) {bt_sco_tx_process((u8 *)(mic_buff + MIC_SAMPLES_16K_STEP), MIC_16K_EACH_SAMPLES_LEN, 0);}else{bt_sco_tx_process((u8 *)(mic_buff + MIC_SAMPLES_8K_STEP), MIC_8K_EACH_SAMPLES_LEN, 0);}}// mdac_spr_set(SPR_16000);karaok_audio_input((u8 *)mic_buff, samples, channel, in_24bits, &audio_process_param);#ifdef AUDIO_DEBUG static u32 ticks = 0;  static u32 sampling_rate = 0;sampling_rate += samples;    if (tick_check_expire(ticks, 1000)) {ticks = tick_get();printf("%s: samples = %d, sampling_rate = %d, channel = %d,  usb_connect = %d, bt_phone = %d, bt_is_16k = %d, algo_time = %d timeInterval = %d\n", __func__, samples, sampling_rate, channel, dev_is_online(DEV_USBPC), get_karaok_sco_sta(), bt_sco_is_msbc(), n_algo_ticks - p_algo_ticks, timeInterval);sampling_rate = 0;} 
#endif//AUDIO_DEBUG }#endif //SYS_KARAOK_EN

正确模型如下,加循环缓存

#include "include.h"
#include "func.h"
#include "karaok_list.h"#if SYS_KARAOK_EN
// #define AUDIO_DEBUG/****************************************************************************** Module    :*****************************************************************************/
extern u8 mdac_spr_hold;                            //开启将MDAC的采样率固定为跟LR一样
void bt_aec_process(u8 *ptr, u32 samples, int ch_mode);
void bt_sco_tx_process(u8 *ptr, u32 samples, int ch_mode);static karaok_list_cfg_t karaok_list_cfg AT(.func_list.cfg.karaok);static module_link_list_str_t karaok_link_list_tbl[] = {
/*  模块类型,                   使能, 初始化,                       输入接口,                         设置输出*/{KARAOK_INPUT_TYPE,          1,     karaok_audio_init,             karaok_audio_input,                karaok_audio_output_callback_set},  // {MIC_MSC_HIFI4_EFFECT_TYPE,  1,     mic_hifi4_effect_audio_init,   mic_hifi4_effect_audio_buf_input,  mic_hifi4_effect_audio_output_callback_set},// {SRC1_OUT_TYPE,              1,     src1_out_init,                 src1_out_audio_input,              NULL},  {SRC2_OUT_TYPE,             1,     src2_out_init,                  src2_out_audio_input,               NULL},    
};
#define MICBUF_LENGTH 4096
WEAK uint32_t micbuf_length_weak = MICBUF_LENGTH;
u8 ude_micbuf[MICBUF_LENGTH] AT(.ude.aubuf);//这个变量也要跟buf一样大小
short mic_buff[MIC_SAMPLES_LEN] AT(.mic_algo.buf); 
short aec_mic_stm_buff[AEC_MIC_48K_EACH_SAMPLES_LEN * 3] AT(.aec_mic.buf);
au_stm_t aw_stm AT(.aec_mic.buf);
#ifdef TEST_MODE
short interleaved_channel_buff[MIC_SAMPLES_16K_STEP] AT(.mic_algo.buf); 
#endif#if DAC_DMA_OUTPUT_EN || FUNC_REC_EN
#define DAC_DMA_OUTPUT_SAMPLES          MIC_EACH_BUFF_LEN //byte not shortu8 au0_dma_buff[DAC_DMA_OUTPUT_SAMPLES*4] AT(.au0out_buf);     //DMA OUT的中断缓存,至少为 au0_dma_start_do 的 samples*2*(1<<is_24bits)*2 Bytevoid au0_dma_start_do(u32 type, u8 *au0_dma_addr, u16 samples, u8 is_24bits);AT(.text.au0dma) WEAK
void au0_dma_start(u32 type)
{memset(aec_mic_stm_buff, 0, sizeof(aec_mic_stm_buff));memset(&aw_stm, 0, sizeof(au_stm_t));aw_stm.buf = (u8 *)aec_mic_stm_buff;aw_stm.size = sizeof(aec_mic_stm_buff);aw_stm.len = 0;aw_stm.wptr = (u8 *)aec_mic_stm_buff;aw_stm.rptr = (u8 *)aec_mic_stm_buff;//初始化循环bufau0_dma_start_do(type, au0_dma_buff, DAC_DMA_OUTPUT_SAMPLES, 0);
}#if DAC_DMA_OUTPUT_EN#ifdef AUDIO_DEBUG
AT(.com_text.au0dma1)
const char au0_dma_output_str[] = "au0_size_1s_sampling_rate:%d, size:%d\n";
#endifAT(.com_text.au0dma)
void au0_dma_isr_data_output(void *ptr/*16bit stereo*/, u32 size/*Byte*/)//采样率只可以设置成48k或者44.1k
{short aec_mic_buff[AEC_MIC_48K_EACH_SAMPLES_LEN];    for (u32 i = 0, j = 0; i < AEC_MIC_48K_EACH_SAMPLES_LEN; i++, j+=2){aec_mic_buff[i] = (*((short *)ptr+j) + *((short *)ptr+j+1))/2;}       puts_stm_buf(&aw_stm, (u8 *)aec_mic_buff, sizeof(aec_mic_buff));//数据放入循环buf     
#ifdef AUDIO_DEBUGstatic u32 ticks = 0;static u32 sampling_rate = 0;sampling_rate += size/4;//双通道,16位,byte,48kif (tick_check_expire(ticks, 1000)) {ticks = tick_get();my_printf(au0_dma_output_str, sampling_rate, size);//采样率只可以设置成48k或者44.1ksampling_rate = 0;}
#endif   }
#endif // DAC_DMA_OUTPUT_EN
#endif // DAC_DMA_OUTPUT_EN || FUNC_REC_ENAT(.com_text.func_list.karaok)
void my_algo_process(short *ptr)
{   for(int i = 0; i < MIC_48K_EACH_SAMPLES_LEN; i++){ptr[i] = 10 * ptr[i + MIC_SAMPLES_MIC_STEP];//algo}  for(int i = 0, j = 0; i < MIC_48K_EACH_SAMPLES_LEN; i+=3, j++){ptr[j + MIC_SAMPLES_16K_STEP] = ptr[i];//16k}  for(int i = 0, j = 0; i < MIC_48K_EACH_SAMPLES_LEN; i+=6, j++){ptr[j + MIC_SAMPLES_8K_STEP] = ptr[i];//8k}        
}#ifdef TEST_MODE
AT(.com_text.func_list.karaok)
void interleaved_channel(short *scr, short *dst)
{   for(int i = 0, j = 0; i < MIC_48K_EACH_SAMPLES_LEN; i++, j+=3){dst[j] = scr[i + MIC_SAMPLES_ALGO_STEP];//algodst[j + 1] = scr[i + MIC_SAMPLES_MIC_STEP];//micdst[j + 2] = scr[i + MIC_SAMPLES_AEC_STEP];//aec}         
}
#endifAT(.com_text.func_list.karaok)
void karaok_audio_init(u8 sample_rate, u16 samples, u8 channel)
{memset(&karaok_list_cfg, 0, sizeof(karaok_list_cfg_t));karaok_list_cfg.sample_rate = sample_rate;my_printf("%s: MDACVOLCON %x\n", __func__, MDACVOLCON);my_printf("%s: sample_rate %d\n", __func__, sample_rate);// bsp_change_md_volume(4, 1);//调节mdac输出音量my_printf("%s: MDACVOLCON %x\n", __func__, MDACVOLCON);my_printf("%s: bt_sco_is_msbd %d\n", __func__, bt_sco_is_msbc());//判断蓝牙录音的采样率:1(16k),0(8k)// mdac_spr_set(SPR_16000);mdac_spr_hold = 0;}AT(.com_text.func_list.karaok)
void karaok_audio_input(u8 *ptr, u32 samples, int ch_mode, u32 is_24bits, void *param)
{if (karaok_list_cfg.callback) {karaok_list_cfg.callback((u8 *)mic_buff, samples, MIC_CHANNEL, is_24bits, param);}
}AT(.text.src)
void karaok_audio_output_callback_set(audio_callback_t callback)
{karaok_list_cfg.callback = callback;
}AT(.text.bsp.bsp.unicast)
void karaok_module_init(u8 sample_rate)
{
//    my_printf("%s\n", __func__);my_printf("%s: sample_rate %d\n", __func__, sample_rate);module_link_list_init(karaok_link_list_tbl,sizeof(karaok_link_list_tbl)/sizeof(module_link_list_str_t), sample_rate, 10, 2);
}AT(.text.bsp.bsp.unicast)
void karaok_module_exit(void)
{
//    my_printf("%s\n", __func__);src1_fade_out();
}//AT(.com_text.karaok.proc1)
//const char k_sdadc_str[] = "get_karaok_sco_sta():%d, sample_cnt:%d\n";
AT(.com_text.karaok.proc)
void karaok_sdadc_process(u8 *ptr, u32 samples, int ch_mode)
{u8 channel = (ch_mode&BIT(0)) + 1;u8 in_24bits = (ch_mode&BIT(1)) ? 1 : 0;memcpy(mic_buff + MIC_SAMPLES_MIC_STEP, ptr, MIC_48K_EACH_SAMPLES_LEN * sizeof(short));gets_stm_buf(&aw_stm, (u8 *)(mic_buff + MIC_SAMPLES_AEC_STEP), AEC_MIC_48K_EACH_SAMPLES_LEN * sizeof(short));//从循环buf拿数据 
#ifdef AUDIO_DEBUGstatic u32 p_algo_ticks = 0;static u32 n_algo_ticks = 0;static u32 lastTimestamp = 0;static u32 timeInterval = 0;      p_algo_ticks = tick_get();if (lastTimestamp != 0) {timeInterval = p_algo_ticks - lastTimestamp;}lastTimestamp = p_algo_ticks;    
#endif //AUDIO_DEBUG// hifi4_effect_mic_process_new(XTP_EFFECT_ID_SPEAKER, (u8 *)mic_buff, MIC_SAMPLES_LEN, MIC_CHANNEL, 0);my_algo_process(mic_buff);#ifdef AUDIO_DEBUGn_algo_ticks = tick_get(); 
#endif//AUDIO_DEBUGif (dev_is_online(DEV_USBPC)) {
#ifdef TEST_MODEinterleaved_channel(mic_buff, interleaved_channel_buff);usbmic_sdadc_process((u8 *)interleaved_channel_buff, samples, MIC_TEST_CHANNEL);
#elseusbmic_sdadc_process((u8 *)mic_buff, samples, MIC_CHANNEL);
#endif//TEST_MODE        }audio_process_param_t audio_process_param;audio_process_param.link_id = INPUT_MIC_ID;if (get_karaok_sco_sta()) {if (bt_sco_is_msbc()) {bt_sco_tx_process((u8 *)(mic_buff + MIC_SAMPLES_16K_STEP), MIC_16K_EACH_SAMPLES_LEN, 0);}else{bt_sco_tx_process((u8 *)(mic_buff + MIC_SAMPLES_8K_STEP), MIC_8K_EACH_SAMPLES_LEN, 0);}}// mdac_spr_set(SPR_16000);karaok_audio_input((u8 *)mic_buff, samples, channel, in_24bits, &audio_process_param);#ifdef AUDIO_DEBUG static u32 ticks = 0;  static u32 sampling_rate = 0;sampling_rate += samples;    if (tick_check_expire(ticks, 1000)) {ticks = tick_get();printf("%s: samples = %d, sampling_rate = %d, channel = %d,  usb_connect = %d, bt_phone = %d, bt_is_16k = %d, algo_time = %d timeInterval = %d\n", __func__, samples, sampling_rate, channel, dev_is_online(DEV_USBPC), get_karaok_sco_sta(), bt_sco_is_msbc(), n_algo_ticks - p_algo_ticks, timeInterval);sampling_rate = 0;} 
#endif//AUDIO_DEBUG }#endif //SYS_KARAOK_EN

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

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

相关文章

云计算2主从数据库

设置主从数据库的目的是将数据库1和数据库2分别建在两个虚拟机上&#xff0c;并实现数据互通访问 首先准备两个虚拟机&#xff0c;这里示例ip分别为&#xff1a; 192.168.200.10&#xff1b;192.168.200.20 修改主机名&#xff0c;一个是mysql1&#xff0c;一个是mysql2&#x…

vscode 运行 java 项目之解决“Build failed, do you want to continue”的问题

Visual Studio Code运行 java 起来似乎比 IDEA 更轻量、比 eclipse 更友好&#xff0c;是不可多得的现代编译法宝。 安装好官方推荐的 java 扩展包后&#xff0c;就可以运行 java 代码了。功能 比 code runner 强&#xff0c;支持 gradle、maven、普通java项目&#xff0c;运行…

[云原生] Prometheus之部署 Alertmanager 发送告警

一、Alertmanager 发送告警的介绍 Prometheus 对指标的收集、存储与告警能力分属于 Prometheus Server 和 AlertManager 两个独立的组件&#xff0c;前者仅负责定义告警规则生成告警通知&#xff0c; 具体的告警操作则由后者完成。 Alertmanager 负责处理由 Prometheus Serve…

力扣L12--- 125验证回文串(java版)-2024年3月15日

1.题目 2.知识点 注1&#xff1a;在 Java 中&#xff0c;toString() 方法用于将对象转换为字符串表示形式。对于数组对象&#xff0c;toString() 方法将返回数组的字符串表示形式&#xff0c;其中包含数组中每个元素的字符串表示形式&#xff0c;以逗号分隔&#xff0c;并且包…

Python基础入门 --- 1-2.字面量

文章目录 Python基础入门第一章&#xff1a;1.1 第一个python程序 第二章 &#xff1a;2.1 字面量2.2 常用的值类型2.3 字符串2.3.1 三种定义方式2.3.2 引号嵌套2.3.3 字符串拼接2.3.4 字符串格式化2.3.5 格式化的精度控制数字精度控制&#xff1a; 2.3.6 字符串格式化方式22.3…

CentOS7 部署 k8s

准备两台虚拟机192.168.152.129192.168.152.130更改主机名192.168.152.129&#xff1a;hostnamectl set-hostname k8s-masterhostnamectl192.168.152.130&#xff1a;hostnamectl set-hostname k8s-node1hostnamectl master节点配置 1.配置hosts 在两台节点上执行vim /etc/h…

金蝶云星空,怎么做BI数据可视化分析?

金蝶云星空是一个流程管理方面的软件&#xff0c;如果想要做BI数据可视化分析&#xff0c;还就需要一套BI方案&#xff0c;即一套奥威BI软件金蝶云星空BI方案。 奥威BI软件&#xff0c;负责提供平台和技术&#xff1b;金蝶云星空BI方案&#xff0c;则提供标准化的数据分析模型…

C++(1): std::vector的使用

1. 简述 vector是C编程中使用频率较高的一种顺序容器。实际上是一个可以动态扩展内存的数组。 2. 容器特性 &#xff08;1&#xff09;顺序序列 顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。 &#xff08;2&#xff09;动态数组 …

「HarmonyOS」下拉刷新组件使用详情

前言&#xff1a;在客户端开发过程中&#xff0c;经常会出现下拉刷新的功能&#xff0c;用于重新加载数据和加载更多数据&#xff0c;通过查找相关资料&#xff0c;查找到一个refresh下拉刷新的第三方库&#xff0c;今天主要介绍一下其中比较常用的RefreshLayout形式下拉刷新使…

【设计模式】Java 设计模式之代理模式(Proxy Pattern)

代理模式深入分析 一、概述 代理模式是一种为其他对象提供一种代理以控制对这个对象的访问的设计模式。在某些情况下&#xff0c;一个对象不适合或者不能直接访问另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式的主要目的是&#xf…

【gpt实践】50个提升工作效率的GPT指令

收集整理了50个工作不同场景中可能会用到的gpt指令&#xff0c;希望对大家有帮助。 1. 用「532规则」定制月度宣传规划 提示&#xff1a;“对于我的 [产品/服务] 在 [社交媒体平台上 ]定位 [我的目标受众]”&#xff0c;使用 5-3-2 规则制定 1 个月的社交媒体内容计划。” Pro…

关于I2C(Inter-Integrated Circuit)死锁及解决措施

I2C&#xff08;Inter-Integrated Circuit&#xff09;死锁是指两个或多个设备&#xff08;比如主设备和从设备&#xff09;在通信过程中&#xff0c;由于某种原因互相等待&#xff0c;导致无法正常进行通信的现象。这种死锁状态可能会导致整个系统的通信受阻&#xff0c;影响设…

K8S日志收集方案-EFK部署

EFK架构工作流程 部署说明 ECK (Elastic Cloud on Kubernetes)&#xff1a;2.7 Kubernetes&#xff1a;1.23.0 文件准备 crds.yaml 下载地址&#xff1a;https://download.elastic.co/downloads/eck/2.7.0/crds.yaml operator.yaml 下载地址&#xff1a;https://download.e…

性能出众的一区新算法|星鸦优化算法NOA原理及代码实现(Matlab)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 CEC2005中的测试 本文KAU将介绍一个2023年发表在1区期刊KBS上的优化算法——星鸦优化算法(Nutcracker Optimization Algorithm&#xff0c;NOA)[1] 该算法由Mohamed …

一直被模仿,从未被超越

德国威步以及卓越的创新能力&#xff0c;成为业内不断被模仿的对象。德国威步自1989年创立35年以来&#xff0c;一直坚定地在软件保护及授权管理领域努力耕耘并不断创新和改进&#xff0c;拥抱互联网及软件开发技术的革新&#xff0c;完美融入并发展&#xff0c;虽然被其他竞争…

Github 2024-03-15 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-15统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3Python项目3非开发语言项目2PHP项目1C#项目1Rust项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476…

通过Rothko罗斯科绘画学习CSS盒子

本文章属于学习笔记&#xff0c;在https://www.freecodecamp.org/chinese/learn/2022/responsive-web-design/中练习 1、使用 padding 简写属性来增加两个元素之间的空间到。 .canvas {} .frame { padding:50px; }2、overflow 设置为 hidden - 将画布更改回其原始尺寸。overfl…

第十四届“中关村青联杯”全国研究生数学建模竞赛-A题:无人机在抢险救灾中的优化运用(续)

目录 6 问题三模型建立与求解 6.1 问题描述与分析 6.2 模型建立 6.3 模型求解

Discourse 分类图片

我们可以在 Discourse 上为分类添加图片。 进入分类编辑界面&#xff0c;然后选择 Image 标签。 在 Images 标签下&#xff0c;上传分类需要的图片。 图片大小 图片的大小是 Discourse 进行控制的&#xff0c;高度为 150 PX 像素。 如果上传的图片大于 150 px 的高度像素&…

C++ 虚函数与多态

定义宠物类 Pet &#xff0c;包含虚函数 speak &#xff0c;显示 " miao ! miao !"和" wang ! wang !"。 信息" How does a pet speak ?"; 主团数中定义 Pet 、 Cat 和 Dog 的对象&#xff0c;再定义 Pet 指针量 &#xff0c;分别指向 Pet Cat…