コード例 #1
0
ファイル: sample_proc.c プロジェクト: Superkazuya/ASR_Project
//rawbuf full handler, appending data
void EXTI0_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0) == RESET)
    return;
  static int16_t buff[OUT_BUFSIZE] ;
  if(cbuffer.count + OUT_BUFSIZE > MAX_BUF_SIZE)
    while(1);//todo
  if(rawbuf_status == RAWBUF_UNDERRUN)
  {
    SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, DISABLE);
    STM_EVAL_LEDOff(LED3);
    while(1);
  }
  uint16_t tail_length = MAX_BUF_SIZE-cbuffer.tail;
  if(tail_length < OUT_BUFSIZE) //complex case
  {
    if(rawbuf_status == RAWBUF_FULL1)
    {
      PDM_Filter_64_LSB((uint8_t *)raw_buffer1, (uint16_t*)buff, VOLUME, &pdm);
      rawbuf_status &= ~RAWBUF_FULL1;
    }
    else if(rawbuf_status == RAWBUF_FULL2)
    {
      PDM_Filter_64_LSB((uint8_t *)raw_buffer2, (uint16_t*)buff, VOLUME, &pdm);
      rawbuf_status &= ~RAWBUF_FULL2;
    }//underrun ????
    memcpy(buff, cbuffer.data+cbuffer.tail, sizeof(uint16_t)*tail_length);
    memcpy(buff+tail_length, cbuffer.data, sizeof(uint16_t)*(OUT_BUFSIZE-tail_length));
    cbuffer.tail = OUT_BUFSIZE-tail_length;
    cbuffer.count += OUT_BUFSIZE;
#ifdef DEBUG
    if(cbuffer.count > debug_countmax)
      debug_countmax = cbuffer.count;
#endif
  }
  else
  {
    if(rawbuf_status == RAWBUF_FULL1)
    {
      PDM_Filter_64_LSB((uint8_t *)raw_buffer1, (uint16_t*)(cbuffer.data+cbuffer.tail), VOLUME, &pdm);
      rawbuf_status &= ~RAWBUF_FULL1;
    }
    else if(rawbuf_status == RAWBUF_FULL2)
    {
      PDM_Filter_64_LSB((uint8_t *)raw_buffer2, (uint16_t*)(cbuffer.data+cbuffer.tail), VOLUME, &pdm);
      rawbuf_status &= ~RAWBUF_FULL2;
    }//underrun ????
    cbuffer.tail += OUT_BUFSIZE;
    cbuffer.count += OUT_BUFSIZE;

    EXTI_ClearITPendingBit(EXTI_Line0);
  }
}
コード例 #2
0
/**
  * @brief  Converts audio format from PDM to PCM. 
  * @param  PDMBuf: Pointer to data PDM buffer
  * @param  PCMBuf: Pointer to data PCM buffer
  * @retval AUDIO_OK if correct communication, else wrong communication
  */
uint8_t BSP_AUDIO_IN_PDMToPCM(uint16_t *PDMBuf, uint16_t *PCMBuf)
{
  uint16_t AppPDM[INTERNAL_BUFF_SIZE/2];
  uint32_t index = 0; 
  
  /* PDM Demux */
  for(index = 0; index<INTERNAL_BUFF_SIZE/2; index++)
  {
    AppPDM[index] = HTONS(PDMBuf[index]);
  }
  
  for(index = 0; index < DEFAULT_AUDIO_IN_CHANNEL_NBR; index++)
  {
    /* PDM to PCM filter */
    PDM_Filter_64_LSB((uint8_t*)&AppPDM[index], (uint16_t*)&(PCMBuf[index]), AudioInVolume , (PDMFilter_InitStruct *)&Filter[index]);
  }
  
  /* Duplicate samples since a single microphone in mounted on STM32F4-Discovery */
  for(index = 0; index < PCM_OUT_SIZE; index++)
  {
    PCMBuf[(index<<1)+1] = PCMBuf[index<<1];
  }
	
  /* Return AUDIO_OK when all operations are correctly done */
  return AUDIO_OK; 
}
コード例 #3
0
ファイル: microphone.c プロジェクト: timbrom/lightshow
void SPI2_IRQHandler(void)
{  
   u16 volume;
   u16 app;

  /* Check if data are available in SPI Data register */
  if (SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET)
  {
    app = SPI_I2S_ReceiveData(SPI2);
    InternalBuffer[InternalBufferSize++] = HTONS(app);
    
    /* Check to prevent overflow condition */
    if (InternalBufferSize >= INTERNAL_BUFF_SIZE)
    {
      InternalBufferSize = 0;
     
      volume = 50;
      
      PDM_Filter_64_LSB((uint8_t *)InternalBuffer, (uint16_t *)pAudioRecBuf, volume , (PDMFilter_InitStruct *)&Filter);

      if(sample_collected_fp != NULL)
          sample_collected_fp((int16_t*)pAudioRecBuf);
    }
  }
}
コード例 #4
0
void SPI2_IRQHandler(void){
  extern PDMFilter_InitStruct Filter;
  extern uint16_t* AudioRecBuf;
  extern uint16_t* WriteBuf;
  extern uint16_t  PDM_Input_Buffer[];
  extern uint16_t PCM_Output_Buffer[];

  u16 volume;
  u16 app;

  // Check if new data are available in SPI data register
  if (SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET){
    // Read received data and save it in internal table
    app = SPI_I2S_ReceiveData(SPI2);
   // PDM_Input_Buffer[InternalBufferSize++] = (uint8_t)app;
    PDM_Input_Buffer[InternalBufferSize++] = /*(uint8_t)*/HTONS(app);

    counter++;
    // Check to prevent overflow condition
    if (InternalBufferSize >= PDM_Input_Buffer_SIZE){
      InternalBufferSize = 0;

      volume = 50;
      
      PDM_Filter_64_LSB((uint8_t *)PDM_Input_Buffer, (uint16_t *)AudioRecBuf/*PCM_Output_Buffer*/, volume, &Filter);

      Data_Status = 1;
    }
  }
}
/**
  * @brief This function Resumes the audio file stream. 
  * @param PDMBuf: Pointer to data PDM buffer
  * @param PCMBuf: Pointer to data PCM buffer
  * @retval AUDIO_OK if correct communication, else wrong communication
  */
uint8_t BSP_AUDIO_IN_PDMToPCM(uint16_t* PDMBuf, uint16_t* PCMBuf)
{
  uint16_t AppPDM[INTERNAL_BUFF_SIZE/2];
  uint32_t index = 0; 
  
  /* PDM Demux */
  for(index = 0; index<INTERNAL_BUFF_SIZE/2; index++)
  {
    AppPDM[index] = HTONS(PDMBuf[index]);
  }

  for(index = 0; index < DEFAULT_AUDIO_IN_CHANNEL_NBR; index++)
  {
    /* PDM to PCM filter */
    PDM_Filter_64_LSB((uint8_t*)&AppPDM[index], (uint16_t*)&(PCMBuf[index]), AudioInVolume , (PDMFilter_InitStruct *)&Filter[index]);
  }
  return AUDIO_OK; 
}
コード例 #6
0
void AUDIO_MIC_SPI_IRQHANDLER(void)
{
   u16 app;

  /* Check if data are available in SPI Data register */
  if (SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET)
  {
	/* actually, we receiving 64kSamples/s due we dont care about left/right channel. */
    app = SPI_I2S_ReceiveData(SPI2);
#ifdef USE_ST_FILTER
    InternalBuffer[InternalBufferSize++] = HTONS(app);
    InternalBufferSize++;
    /* Check to prevent overflow condition */
    if (InternalBufferSize >= INTERNAL_BUFF_SIZE)
    {
      InternalBufferSize = 0;
      //got 64 samples of 16bit => 16 samples of output
      PDM_Filter_64_LSB((uint8_t *)  InternalBuffer,
    		            (uint16_t *) &pAudioRecBuf_8Khz[PCM_OUT_SIZE*recBuffFillness],
    		            10, (PDMFilter_InitStruct *)&Filter);
      recBuffFillness++;
      if(recBuffFillness >= REC_BUFFERS) {
    	  Data_Status = 1;
    	  recBuffFillness=0;
      }
    }
#else
    //pdm_fir_flt_put(&Filter2, HTONS(app));
    pdm_fir_flt_put(&Filter2, app);
    InternalBufferSize++;
    /* Check to prevent overflow condition */
    if (InternalBufferSize >= INTERNAL_BUFF_SIZE)
    {
      InternalBufferSize = 0;
      pAudioRecBuf_8Khz[recBuffFillness] = pdm_fir_flt_get(&Filter2, 16);
      recBuffFillness++;
      if(recBuffFillness >= REC_BUFFERS * PCM_OUT_SIZE) {
    	  Data_Status = 1;
    	  recBuffFillness=0;
      }
    }
#endif
  }
}