OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7837|回复: 4

求助贴,扬声器信号识别。

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-7-25
在线时间
19 小时
发表于 2019-8-20 19:30:06 来自手机 | 显示全部楼层 |阅读模式
如题,通过麦克风采集音频信号,44.1khz采样率,pcm格式数据经过256点傅里叶变换,然后取模,扬声器是变调的,要判断扬声器是否发出警报声音,但是不知道他们的声音信号频率(只知道一个大致范围)就没法在相应的频域判断其模值是否超过临界值。这可如何是好,恭请各位大佬入座,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-7-25
在线时间
19 小时
 楼主| 发表于 2019-8-20 22:38:59 来自手机 | 显示全部楼层
麦克风使用的数字全向麦克风,INMP441,录音后数据经过串口发出然后保存为wav格式的文件,播放时是没问题的,可以确定录音是没问题的。现在问题是我想要识别扬声器高低音循环播放的声音,看了相关傅里叶变换的知识,了解到声音波形是由不同频率的波叠加而成,采集的扬声器数字信号傅里叶变换后若处于高频和低频阶段,然后我判断高频和低频分别对应的频域的模值(这里转化为了分贝)是否超过临界值,但是我如果用麦克风采集音乐也能识别到是在这一频域,这是为什么呢?
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-7-25
在线时间
19 小时
 楼主| 发表于 2019-8-22 17:00:18 | 显示全部楼层
//I2S音频总线配置,44.1khz采样率,16bit量化位数
void I2S_Configuration(void)
{   
        NVIC_InitTypeDef NVIC_InitStructure;
              GPIO_InitTypeDef GPIO_InitStructure;
         // Initialise and Configure the Mode for I2S
        I2S_InitTypeDef I2S_InitStructure;
              RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
   // Enable I2S peripheral clocks
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  
              SPI_I2S_DeInit(SPI2);
              GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13;     //端口
              GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
              GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;            //IO复用输出
              GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;      
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //IO口悬空输入
        GPIO_Init(GPIOB, &GPIO_InitStructure);
              GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_12);
             
        I2S_InitStructure.I2S_Mode       =  I2S_Mode_MasterRx;                          
               I2S_InitStructure.I2S_Standard   =  I2S_Standard_Phillips;           
        I2S_InitStructure.I2S_DataFormat =  I2S_DataFormat_16b;
        I2S_InitStructure.I2S_AudioFreq  =  I2S_AudioFreq_44k;           
        I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
        I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;       
        I2S_Init(SPI2, &I2S_InitStructure);
        SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, DISABLE);
              SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Rx,ENABLE);            //SPI2
        I2S_Cmd(SPI2, ENABLE);
        SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);  
              
        NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


void I2S_DMA_Config(void)
{       
        DMA_InitTypeDef  DMA_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //??DMA2
        DMA_DeInit(DMA1_Channel4);
       
  DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&(SPI2->DR);     //               
  DMA_InitStructure.DMA_MemoryBaseAddr =(uint32_t)Tx_buffer ;               //                       
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                         //                                       
  DMA_InitStructure.DMA_BufferSize =TXHEADER;                                           //                               
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;     //       
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;               //
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;        //
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;                //               
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                              
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                                               
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                               
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);                  
  /* Enable DMA1 channel1 IRQ Channel */
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);                        //开启 DMA传输完成中断
  /* Enable DMA1 channel1 */
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
  DMA_Cmd(DMA1_Channel4, ENABLE);               
  
        NVIC_InitStructure.NVIC_IRQChannel                                                                                 = DMA1_Channel4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority         = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority                                 = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd                                                                 = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       
}

这是I2S配置,DMA传输。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-7-25
在线时间
19 小时
 楼主| 发表于 2019-8-22 17:12:01 | 显示全部楼层
void Tx_bufferTotx_buffer1(void)    //因为用的单声道,所以把接收到的声道数据分离了出来。
{
        int i = 0;
        for(i=0;i<TX1HEADER;i++)
        {
                Tx_buffer1[i] = (Tx_buffer[2*i]<<16) ;
        }

}





void DMA1_Channel4_IRQHandler(void)
{

    //DMA一次通道数据获取搬运完成
    if (DMA_GetITStatus(DMA1_IT_TC4))
    {  
                          DMA_Cmd(DMA1_Channel4, DISABLE);
                          dma1endflag = 1;
        DMA_ClearITPendingBit(DMA1_IT_TC4);
                           DMA_Cmd(DMA1_Channel4, ENABLE);
                        SPI_I2S_ITConfig( SPI2, SPI_I2S_IT_RXNE, ENABLE );//
    }
}

void SPI2_IRQHandler(void)
{
if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET)
{  
  SPI_I2S_ClearITPendingBit( SPI2,SPI_I2S_IT_RXNE );
  SPI_I2S_ITConfig( SPI2, SPI_I2S_IT_RXNE, DISABLE  );//

}
}


void HandleVoiceFre(void)
{
          Tx_bufferTotx_buffer1();                //数据分离                
          cr4_fft_256_stm32(lBufOutArray,Tx_buffer1, NPT);   //傅里叶变换
         GetPowerMag();     //数据取模值
}
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-11-20
在线时间
0 小时
发表于 2020-3-29 16:15:41 | 显示全部楼层
楼主这个问题后来解决了没?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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