查看: 5043|回复: 1

[LPC双核挑战赛] 电子音乐识别器

[复制链接]
  • TA的每日心情
    擦汗
    2024-11-7 09:48
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    35

    主题

    82

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1243
    最后登录
    2025-7-11
    发表于 2018-6-6 16:58:13 | 显示全部楼层 |阅读模式
    电子音乐识别器

    一、项目名称: 电子音乐识别器

    二、项目概述:
      开发板开发语音采集和编码方式。采用8kHzPCM编码方式,然后用后台对PCM进行识别和量化,通过FFT快速傅里叶变换,形成频谱图,识别出音高。根据这个音高值对比形成电子校音器。[size=15.3333px] 这个项目展现LPC54114的特征,包括:灵敏的板载麦克风,以及高速的DSPlib来实现FFT功能,使用双核通讯来传递识别出来的频率,并通过串口显示出来。

    三、作品实物图
    1. 开发板加电运行图
    WP_20180607_11_17_03_Pro.jpg 2. 实测响应图
    WP_20180607_11_21_10_Pro.jpg

    3 显示在开关变化后输出的频率
    2.JPG
    四、演示视频


    五、项目文档
    [size=15.3333px]5.1 产品逻辑框图
    LPC54114lite.png
    [size=15.3333px]5.2 [size=15.3333px]使用说明
    [size=15.3333px]5.2.1 首先需要编译创建cm0内核的bin可执行文件,主要代码如下,用uart_write输出形成的音频数据
    1.        if (has_received)
    2.         {
    3.             has_received = 0;
    4.                                                 ch=msg.DATA;
    5.                                           USART_WriteBlocking(DEMO_USART, &ch, 1);
    6.             rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg, sizeof(THE_MESSAGE), RL_DONT_BLOCK);
    7.         }
    复制代码
    捕获.JPG
    5.2.2 在cm4内核中引入这个bin文件,写入代码区,这个bin文件就编译进了整个项目中。
    1. #define CORE1_BOOT_ADDRESS (void *)0x20010000

    2. #if defined(__CC_ARM)
    3. extern uint32_t Image$CORE1_REGION$Base;
    4. extern uint32_t Image$CORE1_REGION$Length;
    5. #define CORE1_IMAGE_START &Image$CORE1_REGION$Base
    复制代码
    使用keil的时候,需要修订内存分布如下
    捕获.JPG
    编译后的结果如下,这样就可以把程序写入内存了。
    捕获.JPG
    [size=15.3333px]
    [size=15.3333px]5.2.3 音乐识别,需要[size=15.3333px]DMIC_CtrlClrIntrHwvad功能和DMIC_TransferReceiveDMA功能,实现的功能是在声音启动后,开始读取DMIC直接进入DMA,因为DMA的buffer只有16字节,所以当超过16字节的数据,需要及时写入数组。
    [size=15.3333px]以下数据确定了8kHz的采样速率,以实现数据采集,这样可以最大识别4kHz的音频数据。对应最高B7的音高        3951.07Hz

    1. dmic_channel_cfg.divhfclk = kDMIC_PdmDiv1;
    2.     dmic_channel_cfg.osr = 25U;
    3.     dmic_channel_cfg.gainshft = 3U;
    4.     dmic_channel_cfg.preac2coef = kDMIC_CompValueZero;
    5.     dmic_channel_cfg.preac4coef = kDMIC_CompValueZero;
    6.     dmic_channel_cfg.dc_cut_level = kDMIC_DcCut155;
    7.     dmic_channel_cfg.post_dc_gain_reduce = 0U;
    8.     dmic_channel_cfg.saturate16bit = 1U;
    9.     dmic_channel_cfg.sample_rate = kDMIC_PhyFullSpeed;
    10.     DMIC_Init(DMIC0);
    复制代码

    [size=15.3333px]
    [size=15.3333px]5.2.4 音乐识别采用dsp的功能,因此需要引入DSPlib中的fft函数。识别之后,生成的数组用fft变换直接生成频谱,并识别出音乐的基因频率。
    1.   /*start DSP FFT  */
    2.   arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse); //Process the data through the CFFT/CIFFT module
    3.   arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);        // Process the data through the Complex Magnitude Module for calculating the magnitude at each bin
    4.   arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);  // Calculates maxValue and returns corresponding BIN value
    5.         if (testIndex !=  refIndex)  { status = ARM_MATH_TEST_FAILURE;} // Check results...
    6.         if ( status != ARM_MATH_SUCCESS) { PRINTF("ARM_MATH Fails. \r\n");; }
    7.                         else {
    8.                                 PRINTF("testIndex= %d \r\n", testIndex);
    9.                         };
    10.         /*end of  DSP FFT  */
    复制代码

    5.2.5 生成的数据,即testIndex数据,启动双核通讯功能,传送的cm0 内核,如5.2.1所述输出到UART串口。
    1.     /* Initialize MCMGR before calling its API */
    2.     MCMGR_Init();   
    3.     /* Register the application event before starting the secondary core */
    4.     MCMGR_RegisterEvent(kMCMGR_RemoteApplicationEvent, RPMsgRemoteReadyEventHandler, (void *)&RPMsgRemoteReadyEventData);
    5.     /* Boot Secondary core application */
    6.     MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, (uint32_t)rpmsg_lite_base, kMCMGR_Start_Synchronous);
    7.     /* Print the initial banner */
    8.     PRINTF("\r\nRPMsg demo starts in primary Core0.\r\n");
    9.     /* Wait until the secondary core application signals the rpmsg remote has been initialized and is ready to communicate. */
    10.     while(APP_RPMSG_READY_EVENT_DATA != RPMsgRemoteReadyEventData) {};

    11.     my_rpmsg = rpmsg_lite_master_init(rpmsg_lite_base, SH_MEM_TOTAL_SIZE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &rpmsg_ctxt);
    12.     my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, my_ept_read_cb, (void *)&has_received, &my_ept_context);
    13.     has_received = 0;
    14.     /* Wait until the secondary core application signals the rpmsg remote endpoint has been created. */
    15.     while(APP_RPMSG_EP_READY_EVENT_DATA != RPMsgRemoteReadyEventData) {};
    复制代码

    [size=15.3333px]5.2.6 核心的代码是启动后初始化外设后,进入中断状态,等待声音驱动的中断响应程序,实现对以上程序的逐个调用。
    1. void DMIC0_HWVAD_Callback(void)
    2. {
    3. ...
    4. }
    复制代码
    5.2.7 测试后显示的截图
    捕获.JPG
    [size=15.3333px]5.3 工程项目文件
    tune20180608.rar (5.76 MB, 下载次数: 32)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-31 22:07
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    20

    主题

    385

    帖子

    19

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2088
    最后登录
    2020-7-1
    发表于 2018-6-7 00:38:28 | 显示全部楼层
    实物?视频?
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 14:48 , Processed in 0.087230 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表