语音识别芯片LD3320介绍再续

2023-11-06

语音识别芯片LD3320驱动程序

    1、芯片复位

    复位就是对LD3320芯片的第47腿(RSTB*)发送低电平,然后需要对片选CS做一次拉低→拉  高的操作,以激活内部DSP。按照以下顺序:

    void LD_reset()

    {

     RSTB=1;delay(1);RSTB=0;delay(1);RSTB=1;delay(1);

     CSB=0;delay(1);CSB=1;delay(1);

   }

    delay(1)是为了更稳定地工作。 初始化一般在程序的开始进行,如果有时芯片的反应不太正常,也可用这个方法恢复芯片初始状态。

    (1)通用初始化

    按照以下序列设置寄存器。

    void LD_Init_Common()

    {

     bMp3Play=0;

     LD_ReadReg(0x06);

     LD_WriteReg(0x17,0x35);delay(10);

     LD_ReadReg(0x06);

     LD_WriteReg(0x89,0x03);delay(5);

     LD_WriteReg(0xCF,0x43);delay(5);

     LD_WriteReg(0xCB,0x02);

     /*PLL setting*/

     LD_WriteReg(0x11,LD_PLL_11);

     if(nLD_Mode==LD_MODE_MP3)

     {

      LD_WriteReg(0x1E,0x00);

      //!!注意,下面三个寄存器,会随晶振频率变化而设置不同

      //!!注意,请根据使用的晶振频率修改参考程序中的CLK_IN

      LD_WriteReg(0x19,LD_PLL_MP3_19);

      LD_WriteReg(0x1B,LD_PLL_MP3_1B);

      LD_WriteReg(0x1D,LD_PLL_MP3_1D);

     }

     else

     {

      LD_WriteReg(0x1E,0x00);

      //!!注意,下面三个寄存器,会随晶振频率变化而设置不同

      //!!注意,请根据使用的晶振频率修改参考程序中的CLK_IN

      LD_WriteReg(0x19,LD_PLL_ASR_19);

      LD_WriteReg(0x1B,LD_PLL_ASR_1B);

      LD_WriteReg(0x1D,LD_PLL_ASR_1D);

    }

    LD_WriteReg(0xCD,0x04);LD_WriteReg(0x17,0x4c);delay(5);

    LD_WriteReg(0xB9,0x00);LD_WriteReg(0xCF,0x4f);

    LD_WriteReg(0x6F,0xFF);

  }

   (2)语音识别用初始化

    按照以下序列设置寄存器。

    void LD_Init_ASR()

     {

      nLD_Mode=LD_MODE_ASR_RUN;

      LD_Init_Common();

      LD_WriteReg(0xBD,0x00);LD_WriteReg(0x17,0x48);delay(10);

      LD_WriteReg(0x3C,0x80);LD_WriteReg(0x3E,0x07);

      LD_WriteReg(0x38,0xff);LD_WriteReg(0x3A,0x07);

      LD_WriteReg(0x40,0x00);LD_WriteReg(0x42,0x08);

      LD_WriteReg(0x44,0x00);LD_WriteReg(0x46,0x08);delay(1);

     }

    (3)写入识别列表

    列表的规则是:每个识别条目对应一个特定的编号(1个字节),不同的识别条目的编号可以相同,而且不用连续。本芯片最多支持50个识别条目,每个识别条目是标准普通话的汉语拼音(小写),每2个字(汉语拼音)之间用一个空格间隔。下面是一个简单的例子:

     编号可以相同,可以不连续,但是数值要小于256(00H~FFH)。例子中的“北京”和“首都”对应同一编号,说这两个词会有相同的结果返回。简单流程图如下:

 

    代码如下:

    #define CODE_DEFAULT 0

    #define CODE_BEIJING 1

    #define CODE_SHANGHAI 3

    #define CODE_TIANJIN 7

    #define CODE_CHONGQING 8

    先介绍一个读取0xB2寄存器的函数,如果在以后的ASR命令函数前不能够读取到正确Idle状态,说明芯片内部可能出错了。当使用的电源电压/电流出现不稳定有较大波动时,有小概率会出现这种情况。出现这种情况时,建议Reset LD3320芯片,重新启动设置芯片。

    // Return 1: success.

    uint8 LD_Check_ASRBusyFlag_b2()

    {

     uint8 j;uint8 flag=0;

     for(j=0;j<10;j++)

     {

      if(LD_ReadReg(0xb2)= 0x21)

      {flag=1;break;}

      delay(10);

     }

     return flag;

   }

    // Return 1: success.

    uint8 LD_AsrAddFixed()

    {

     uint8 k, flag;

     uint8 nAsrAddLength;

     const char sRecog[5][13]={"bei jing","shou du","shang hai","tian jin", "chong qing"};

     const uint8 pCode[5]={CODE_BEIJING,CODE_BEIJING,CODE_SHANGHAI,                                                                   CODE_TIANJIN,CODE_CHONGQING};

     flag=1;

     for(k=0;k<5;k++)

     {

      if(LD_Check_ASRBusyFlag_b2()==0)

      {flag=0;break;}

      LD_WriteReg(0xc1, pCode[k] );

      LD_WriteReg(0xc3, 0 );

      LD_WriteReg(0x08, 0x04); Delay(1);

      LD_WriteReg(0x08, 0x00); Delay(1);

      for(nAsrAddLength=0;nAsrAddLength<20;nAsrAddLength++)

      {

       if(sRecog[k][nAsrAddLength]==0) break;

       LD_WriteReg(0x5,sRecog[k][nAsrAddLength]);

      }

      LD_WriteReg(0xb9, nAsrAddLength);

      LD_WriteReg(0xb2, 0xff);

      LD_WriteReg(0x37, 0x04);

    }

    return flag;

   }

(4)开始识别

    设置几个相关的寄存器,就可以控制LD3320芯片开始语音识别。 值得注意:单片机程序中,一般会用一个全局变量控制当前状态,(例如:LD_ASR_RUNING状态或者LD_ASR_FOUNDOK状态),在编程时一定要把对该状态的设置放在正式LD3320芯片开始识别以前,例如下面例程中的语句nAsrStatus=LD_ASR_RUNING;便是设置控制变量。需要把这句语句放置在LD3320正式开始识别之前调用:

    {

     。。。

     nAsrStatus=LD_ASR_RUNING;LD_AsrRun();

    }

    参考代码如下:

    // Return 1: success.

    uint8 LD_AsrRun()

    {

     nAsrStatus=LD_ASR_RUNING;

     LD_WriteReg(0x35,MIC_VOL);

     LD_WriteReg(0x1C,0x09);

     LD_WriteReg(0xBD,0x20);

     LD_WriteReg(0x08,0x01);delay(1);

     LD_WriteReg(0x08,0x00);delay(1);

     if(LD_Check_ASRBusyFlag_b2()==0)

     {return 0;}

     LD_WriteReg(0xB2,0xff);

     LD_WriteReg(0x37,0x06);delay(5);

     LD_WriteReg(0x1C,0x0b);

     LD_WriteReg(0x29,0x10);

     LD_WriteReg(0xBD,0x00);

     EX0=1;

     return 1;

    }

    综上所述:语音识别的流程可以总结成如下的参考代码,可以以此为参考,根据使用流程进行合理的改动。

    uint8 RunASR()

    {

     uint8 i=0;uint8 asrflag=0;

     for(i=0;i<5;i++)

     {

      LD_Init_ASR();delay(100);

      if(LD_AsrAddFixed()==0)

      {LD_reset();delay(100);continue;}

      delay(10);

      if(LD_AsrRun()==0)

      {LD_reset();delay(100);continue;}

      asrflag=1;

      break;

     }

     return asrflag;

   }

    对上述函数的调用参考代码:

    文件main.c 函数main()

    case LD_ASR_NONE:

    {

     nAsrStatus=LD_ASR_RUNING;

     if (RunASR()==0)

     {nAsrStatus=LD_ASR_ERROR;LED1=0;LED2=0;}

     break;

    }

    (5)响应中断

    如果麦克风采集到声音,不管是否识别出正常结果,都会产生一个中断信号。而中断程序要根据寄存器的值分析结果。

    读取BA寄存器的值,可以知道有几个候选答案,而C5寄存器里的答案是得分最高、最可能正确的答案。

    例如发音为“上海”并被成功识别(无其他候选),那么BA寄存器里的数值是1,而C5寄存器里的值是对应的编码3。

    以下为简单流程图:

    程序代码如下:

    void ExtInt0Handler(void) interrupt 0 {ProcessInt0();}

    void ProcessInt0()

    {

     uint8 nAsrResCount=0;EX0=0;ET0=0;

     ucRegVal=LD_ReadReg(0x2B);

     ucHighInt=LD_ReadReg(0x29);

     LD_WriteReg(0x29,0);

     ucLowInt=LD_ReadReg(0x02);

     LD_WriteReg(0x02,0);

     if(nLD_Mode==LD_MODE_ASR_RUN)

     {

      if((ucRegVal&0x10)&&LD_ReadReg(0xbf)==0x35&&LD_ReadReg(0xb2)==0x21)

      {

       nAsrResCount=LD_ReadReg(0xba);

       if(nAsrResCount>0&&nAsrResCount<4) {nAsrStatus=LD_ASR_FOUNDOK;}

       else{nAsrStatus=LD_ASR_FOUNDZERO;}

      }

      else{nAsrStatus=LD_ASR_FOUNDZERO;}

      LD_WriteReg(0x2b,0);

      LD_WriteReg(0x1C,0);

      ET0=1;

      return;

     }

   }

    uint8 LD_GetResult() {return LD_ReadReg(0xc5);}

    值得注意:获取识别结果 LD_ReadReg(0xba); 多少条候选识别结果,值1~4说明是有正确的识别结果。

    4个候选结果的读取:根据0xba决定读取几个识别结果。

    LD_ReadReg(0xc5);

    LD_ReadReg(0xc7);

    LD_ReadReg(0xc9);

    LD_ReadReg(0xcb);

    在目前的Demo程序中,只读取了最优候选。在其他使用场合,如果需要读取其他候选,用户可以自己编程实现。

    3、声音播放

    播放声音的操作顺序是:

    MP3播放用初始化(包括通用初始化)→调节播放音量→开始播放声音, 并准备好中断响应函数,打开中断允许位。

    (1)通用初始化

     和语音识别部分一样,按指定序列设置寄存器。

    (2)声音播放用初始化 请参照源代码设置寄存器。

    void LD_Init_MP3()

    {

     nLD_Mode = LD_MODE_MP3;

     LD_Init_Common();

     LD_WriteReg(0xBD,0x02);

     LD_WriteReg(0x17, 0x48); delay(10);

     LD_WriteReg(0x85,0x52);

     LD_WriteReg(0x8F,0x00);

     LD_WriteReg(0x81,0x00);

     LD_WriteReg(0x83,0x00);

     LD_WriteReg(0x8E,0xff);

     LD_WriteReg(0x8D,0xff); delay(1);

     LD_WriteReg(0x87,0xff);

     LD_WriteReg(0x89,0xff); delay(1);

     LD_WriteReg(0x22,0x00);

     LD_WriteReg(0x23,0x00);

     LD_WriteReg(0x20,0xef);

     LD_WriteReg(0x21,0x07);

     LD_WriteReg(0x24, 0x77);

     LD_WriteReg(0x25,0x03);

     LD_WriteReg(0x26, 0xbb);

     LD_WriteReg(0x27,0x01);

    }

    (3)调节播放音量

    这里需要修改寄存器8E。 音量分为16级,用4位二进制表示,范围是0-15。 设置音量时,将(15-音量值) 设给寄存器8E的第2-5位。

    源代码如下:

    void LD_AdjustMIX2SPVolume(uint8 val)

    {

     uint8 ucTmp;

     ucSPVol=val;

     val=((15-val)&0x0f)<<2;

     LD_WriteReg(0x8E,val|0xc3);

    }

    这个函数只调节喇叭(Speaker)的音量,和耳机等其他输出无关。而且实验板上只有喇叭连接了输出。

    耳机音量是可以调节的,使用寄存器81(左耳音量)和83(右耳音量)。 2个寄存器都是只有第1-5位有效,共32级,而且这5位都为0(00000B)的时候是音量最大的,都为1(11111B)的时候音量最小。

    (4)开始播放声音

    开始播放位置清零(自定义变量Mp3Pos=0)

    寄存器1B的第3位设为1(按位或0x08)

        循环执行:

        while(【播放条件】=true)

        {

         顺序将MP3数据放入寄存器01(每次一个字节);

         Mp3Pos增加1

        }

  【播放条件】为下面条件都成立,有一个不满足就跳出循环:

        读取寄存器06,第3位=0

        Mp3Pos < MP3文件的总长度。

   修改BA 、17等寄存器。(参照源代码)

   开放中断允许。例如,EX0=1。

   开始播放的简单流程图如下:

 

    源代码如下:

    void LD_play()

    {

     nMp3Pos=0;bMp3Play=1;

     if(nMp3Pos>=nMp3Size)return ;

     LD_ReloadMp3Data();

     LD_WriteReg(0xBA,0x00);

     LD_WriteReg(0x17,0x48);

     LD_WriteReg(0x33,0x01);

     LD_WriteReg(0x29,0x04);

     LD_WriteReg(0x02,0x01);

     LD_WriteReg(0x85,0x5A);

     EX0=1;

    }

    void LD_ReloadMp3Data()

    {

     uint32 nCurMp3Pos;uint8 val;uint8 k;

     nCurMp3Pos=nMp3StartPos+nMp3Pos;

     FLASH_CS=1;FLASH_CLK=0;FLASH_CS=0;

     IO_Send_Byte(W25P_FastReadData);                   /* read command */

     IO_Send_Byte(((nCurMp3Pos&0xFFFFFF)>>16)); /* send 3 address bytes */

     IO_Send_Byte(((nCurMp3Pos&0xFFFF)>>8));

     IO_Send_Byte(nCurMp3Pos&0xFF);

     IO_Send_Byte(0xFF);

     ucStatus=LD_ReadReg(0x06);

     while(!(ucStatus&MASK_FIFO_STATUS_AFULL)&&(nMp3Pos<nMp3Size))

     {

      val=0;

      for(k=0;k<8;k++){FLASH_CLK=0;val<<=1;FLASH_CLK=1;val|=FLASH_DO;}     

      LD_WriteReg(0x01,val);nMp3Pos++;ucStatus=LD_ReadReg(0x06);

     }

    FLASH_CS=1;FLASH_CLK=0;

   }

    LD_ReloadMp3Data()函数的功能是送入数据,不同的硬件结构可能需要改写这一部分。例如有的系统可能使用大容量的RAM,取数据就会很方便。这里是根据串行FLASH存储器的接口写的函数,使用的是SPI协议。

     (5)中断响应。

    开始播放可以把声音数据的最初部分送入芯片,等到芯片播放这一段后会发出中断请求。而中断函数里会不断的送入数据,直到FIFO_DATA装满或声音数据结束。这一段程序和开始播放比较类似,都是通过LD_ReloadMp3Data()函数送入数据。

    由于LD3320芯片只有一只管脚负责中断请求输出,所以一般情况下用一个中断响应函数处理2种中断。这里为了简明,将中断函数分开书写。

    中断处理函数里,播放声音部分流程图如下:

    要注意的是,寄存器操作2)和寄存器操作3) 并不会恢复寄存器02和29的内容。因为这时播放已经结束了,应该让02,29清零。 而数据重载结束后(达到了继续播放的条件),需要恢复寄存器02,29。 以便于继续出中断,连续播放。 

    源代码是:

    void ExtInt0Handler(void) interrupt 0{ProcessInt0();}

    void ProcessInt0()

    {

     uint8 nAsrResCount=0;

     EX0=0;ET0=0;

     ucRegVal=LD_ReadReg(0x2B);

     ucHighInt=LD_ReadReg(0x29);

     ucLowInt=LD_ReadReg(0x02);

     LD_WriteReg(0x29,0);

     LD_WriteReg(0x02,0);

     if(nLD_Mode==LD_MODE_MP3)

     {

      if(LD_ReadReg(0xBA)&CAUSE_MP3_SONG_END)

      {

       LD_WriteReg(0x2B,0);

       LD_WriteReg(0xBA,0x00);

       LD_WriteReg(0xBC,0x00);

       bMp3Play=0;

       LD_WriteReg(0x08,0x01);

       LD_WriteReg(0x08,0x00);

       LD_WriteReg(0x33,0x00);

       return ;

     }

    if(nMp3Pos>=nMp3Size)

    {

     LD_WriteReg(0xBC,0x01);

     LD_WriteReg(0x29,0x10);

     EX0=1;

     return;

    }

    LD_ReloadMp3Data();

    LD_WriteReg(0x29,ucHighInt);

    LD_WriteReg(0x02,ucLowInt) ;

    EX0=1;

    }

  }

    补充说明

    1、此芯片的特色是兼有语音识别和MP3播放的两项功能,但是由于这两项功能会使用一些公用的资源,所以为了使芯片稳定地工作,在功能切换的时候,必须从最“通用初始化”开始,对芯片进行一系列的设置。

    2、当芯片长时间没有响应时,可能是应用程序的设置不合理或者是电源的电压/电流有比较大的波动造成。这时应使用芯片复位的功能(对芯片的RTSB*发送低电平),使芯片重新开始工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语音识别芯片LD3320介绍再续 的相关文章

  • 概述:利用大模型 (LLMs) 解决信息抽取任务

    论文标题 Large Language Models for Generative Information Extraction A Survey 论文链接 https arxiv org pdf 2312 17617 pdf 论文主要探讨
  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 比尔盖茨与萨姆.奥尔特曼的对话及感想

    谈话内容 比尔 盖茨 嘿 萨姆 萨姆 奥尔特曼 嘿 比尔 比尔 盖茨 你好吗 萨姆 奥尔特曼 哦 天哪 这真的太疯狂了 我还好 这是一个非常激动人心的时期 比尔 盖茨 团队情况怎么样 萨姆 奥尔特曼 我想 你知道很多人都注意到了这样一个事实
  • 问CHAT很繁琐的问题会不会有答案呢?

    问CHAT 什么已有的基于极值理论的极端温度重现期主要针对极端高温事件 对极端低温事件研究较少 CHAT 回复 为这主要可能是由于以下几个原因 1 气候变化与全球变暖 当前 全球变暖和气候变化的问题备受关注 这导致科研者更加关注极端高温事件
  • 利用CHAT写实验结论

    问CHAT 通过观察放置在玻璃表面上的单个水滴 人们可以观察到水滴充当成像系统 探究这样一个透镜的放大倍数和分辨率 CHAT回复 实验报告标题 利用玻璃表面的单一水滴观察成像系统的放大倍数和分辨率 一 实验目的 通过对比和测量 研究和探索玻
  • 让CHAT介绍下V2ray

    CHAT回复 V2Ray是一个网络工具 主要用于科学上网和保护用户的网络安全 它的名字源自Vmess Ray 光线 通过使用新的网络协议 为用户提供稳定且灵活的代理服务 下面是一些V2Ray的主要特性 1 多协议支持 V2Ray 提供了大量
  • 打造完美人像,PixCake像素蛋糕助您一键修图

    您是否曾经为自己的人像照片需要进行繁琐的修图而感到困扰 是否曾经想要打造出完美的自拍照 却不知道该如何下手 现在 我们为您推荐一款强大的人像处理技术修图软件 PixCake像素蛋糕 PixCake像素蛋糕是一款基于AI人像处理技术的修图软件
  • 毕业设计:基于深度学习的微博谣言检测系统 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 三 检测的实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有
  • 作物叶片病害识别系统

    介绍 由于植物疾病的检测在农业领域中起着重要作用 因为植物疾病是相当自然的现象 如果在这个领域不采取适当的护理措施 就会对植物产生严重影响 进而影响相关产品的质量 数量或产量 植物疾病会引起疾病的周期性爆发 导致大规模死亡 这些问题需要在初
  • 2024 人工智能与大数据专业毕业设计(论文)选题指导

    目录 前言 毕设选题 选题迷茫 选题的重要性 更多选题指导 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生
  • 机器学习算法实战案例:BiLSTM实现多变量多步光伏预测

    文章目录 1 数据处理 1 1 导入库文件 1 2 导入数据集 1 3 缺失值分析 2 构造训练数据
  • 如何用GPT进行论文润色与改写?

    详情点击链接 如何用GPT GPT4进行论文润色与改写 一OpenAI 1 最新大模型GPT 4 Turbo 2 最新发布的高级数据分析 AI画图 图像识别 文档API 3 GPT Store 4 从0到1创建自己的GPT应用 5 模型Ge
  • 机器学习算法实战案例:Informer实现多变量负荷预测

    文章目录 机器学习算法实战案例系列 答疑 技术交流 1 实验数据集 2 如何运行自己的数据集 3 报错分析 机器学习算法实战案例系
  • AI在保护环境、应对气候变化中的作用

    对于AI生命周期数据领域的全球领导者而言 暂时搁置我们惯常的AI见解和AI生命周期数据内容产出 来认识诸如世界地球日这样的自然环境类活动日 似乎是个奇怪的事情 我们想要知道 数据是否真的会影响我们的地球环境 简而言之 是 确实如此 但作为一
  • AI在广告中的应用——预测性定位和调整

    营销人员的工作就是在恰当的时间将适合的产品呈现在消费者面前 从而增加他们购买的可能性 随着时间的推移 营销人员能够深入挖掘越来越精准的客户细分市场 他们不仅具备了实现上述目标的能力 而且这种能力还在呈指数级提升 在AI技术帮助下 现在的营销
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 深度学习(5)--Keras实战

    一 Keras基础概念 Keras是深度学习中的一个神经网络框架 是一个高级神经网络API 用Python编写 可以在TensorFlow CNTK或Theano之上运行 Keras优点 1 允许简单快速的原型设计 用户友好性 模块化和可扩
  • 自动驾驶离不开的仿真!Carla-Autoware联合仿真全栈教程

    随着自动驾驶技术的不断发展 研发技术人员开始面对一系列复杂挑战 特别是在确保系统安全性 处理复杂交通场景以及优化算法性能等方面 这些挑战中 尤其突出的是所谓的 长尾问题 即那些在实际道路测试中难以遇到的罕见或异常驾驶情况 这些问题暴露了实车
  • Making Large Language Models Perform Better in Knowledge Graph Completion论文阅读

    文章目录 摘要 1 问题的提出 引出当前研究的不足与问题 KGC方法 LLM幻觉现象 解决方案 2 数据集和模型构建

随机推荐

  • js怎样计算两个年月的月份差

    function getMonths date1 date2 用 分成数组 date1 date1 split date2 date2 split 获取年 月数 var year1 parseInt date1 0 month1 parse
  • 【Stata】Stata论文的一个有趣的行文方向分享

    目录 Stata论文的一个有趣的行文方向分享 一 前言 二 文章 三 数据集分享 一 前言 应用回归的课程论文 最大的难度是没有一个合适的行文方向 这里分享一下我在写论文之前的一个有趣的方向 数据集也会分享 二 文章 三 数据集分享 链接
  • mongodb数据库基本sql

    show dbs 显示数据库列表 show collections 显示当前数据库中的集合 类似关系数据库中的表 show users 显示用户 use
  • open3d教程(一):open3d的安装和测试(Python版本)

    1 介绍 Open3d 用于3D数据处理的现代库 Open3D 是一个开源库 支持快速开发处理 3D 数据的软件 Open3D 前端在 C 和 Python 中公开了一组精心挑选的数据结构和算法 后端经过高度优化 并设置为并行化 我们欢迎来
  • Docker安装mysql教程

    通过Docker安装mysql 一行命令 docker run p 3306 3306 name mysql v mydata mysql log var log mysql v mydata mysql data var lib mysq
  • 试下用内存映射处理海量数据

    目前项目中 数百万顶点 太慢 可以用内存映射方式处理下 先占个坑 windows核心编程 还是要学习下
  • Dredd - HTTP API 测试框架

    通过使用dredd测试框架 可以测试已经发布的API可以正常调用 返回的数据格式一致 一 安装 没有安装nodejs的请先安装nodejs https nodejs org en download npm install g dredd 二
  • 1.测试框架开发

    POM 1 什么是POM POM Page Object Model 页面对象模型 有的人也会说PO Page Object 模式 本质就是用一个页面对象模型 python里面是类 来管理维护一组页面元素的对象库 在PO下 应用程序的每一个
  • Qt富文本 - 文档边框格式

    文档边框格式 新建桌面应用程序testRichText 基类QMainWindow 勾选创建界面文件 其他选择默认 编辑mainwindow cpp构造函数 mainwindow h ifndef MAINWINDOW H define M
  • 【Spring AOP】面向切面编程的概念,实践,原理详解

    AOP概念 AOP的全名是aspect oriented programming面向切面编程 它是面对对象编程 OOP 的一种方式 这个AOP的思想主要是指对一个事务的集中处理 将多个类都要完成的功能都在一个类中统一完成 如用户登录的校验功
  • Linux下软件安装:Openblas安装

    一 apt安装 sudo apt get install libopenblas dev 二 手动从source安装 1 下载OpenBLAS并编译 1 git clone https github com xianyi OpenBLAS
  • 代码管理平台—GitHub

    1 GitHub介绍 GitHub是一个开源的代码托管平台 使用GitHub可以查看别人的项目 可以建立静态网页 可以管理插件 可以在线编译 可以托管代码等等 1 1 GitHub使用方法 注册用户 网址 https github com
  • C++内存四大区域

    文章目录 前言 所划分的内存区块有 代码区解析 全局区解析 1 全局变量的地址 2 静态变量的地址 3 常量 字符常量及const全局常量 栈区解析 1 普通局部变量 2 const修饰局部变量 3 栈区注意事项 堆区解析 new的用法 1
  • 在 React 中运行 Vue react-vue

    react vue 详细介绍 React Vue旨在连接 React 和 Vue 帮助您在 React 中运行 Vue 用途 使用Vue 的 Reactivity 系统来观察React组件 使用 react vue loader 以在Rea
  • pycharm打开多个项目并存

    问题 有时我们需要打开多个项目 而现在的做法是 原有的a项目不动 新打开一个pycharm来打开b项目 或者 在原有的a项目中打开b项目并覆盖a项目 即a项目与b项目不能共存 需求 有时我们只想打开一个pycharm 但想打开多个项目 方法
  • LSTM多输入多输出解决数据回归预测问题matlab

    文章目录 引言 LSTM 简介 LSTM多输入多输出matlab实现 结论 引言 在许多数据分析和预测问题中 我们需要使用机器学习算法来处理多输入多输出的数据回归预测问题 长短期记忆网络 Long Short Term Memory 简称
  • 国内期货怎么交易?

    国内期货怎么交易 期货市场 是按达成的协议交易并按预定日期交割的金融市场 现货与期货的显著区别是 期货的交割期放在未来 而价格 交货及付款的数量 方式 地点和其他条件是在即期由买卖双方在合同中规定的 商品及证券均可在期货市场上交易 虽然合同
  • Flutter 的键值存储数据库

    Flutter 键值存储数据库 键值存储是开发中十分常见的需求 在Flutter开发中 一般使用 shared preferences 插件来实现 shared preferences 本质上就是将键值对保存到一个XML文件中进行持久化 而
  • Spring Boot请求403 Forbidden错误

    欢迎关注笔者的微信公众号 在项目中引入了Spring Security框架做权限控制 但是出于调试的方便 在开始的时候就禁用了Spring Security 计划到项目后期再专门开发 但是 在调试的过程中发现 Postman发出的请求后台无
  • 语音识别芯片LD3320介绍再续

    语音识别芯片LD3320驱动程序 1 芯片复位 复位就是对LD3320芯片的第47腿 RSTB 发送低电平 然后需要对片选CS做一次拉低 拉 高的操作 以激活内部DSP 按照以下顺序 void LD reset RSTB 1 delay 1