C / STM32-.wav 파일에서 데이터 읽기 및 복사

앙투안

플래시 RAM 메모리에서 .wav 파일을 복사하려고합니다.

#define AUDIO_BUFFER_SIZE          (1024 * 8)       /* Size (in bytes) of the buffer containing the PCM samples */

uint8_t                  Buffer[AUDIO_BUFFER_SIZE];    // Buffer containig the PCM samples to play

...

      /* Fill in the buffer with new data */
  if (f_read(&File, (uint8_t   *)Buffer, AUDIO_BUFFER_SIZE, &bytesRead) != FR_OK)
  {
    Error_Handler();
  }

  if (counter==1){
      HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
      //uint8_t string[20]="Hello, world!";
      //f_write(&OutFile, Buffer, (UINT)sizeof(Buffer),&bytesRead);
      for(int i = 0; i <= sizeof(Buffer); i++){
          f_printf(&OutFile, "%d\n",Buffer[i]);
          osDelay(10);
      }
      counter++;
  }
  else{
      HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
      f_close(&OutFile);
  }

이렇게하면 다음과 같은 값이있는 파일이 생성됩니다 (이 스크린 샷의 오른쪽 부분). 출력 파일

스크린 샷의 왼쪽 부분에서 볼 수있는 올바른 값을 어떻게 얻을 수 있습니까?

문안 인사

MikeCAT

값에 따라 샘플은 서명 된 16 비트 리틀 엔디안 형식으로 인코딩 된 것처럼 보입니다.

형식을 디코딩하려면 다음과 같이 할 수 있습니다 (형식 지정자가 f_printf표준과 같다고 가정 printf).

// 2 bytes per sample, also use < instead of <=
for(int i = 0; i < sizeof(Buffer); i += 2){
    int value = Buffer[i] | (Buffer[i + 1] << 8); // merge the 2 bytes into one integer
    if (value >= 0x8000) value -= 0x10000; // because the samples are signed
    f_printf(&OutFile, "%.4f\n", value / (double)0x8000); // divide with the maximum value
    osDelay(10);
}

를 통해 부동 소수점 숫자를 인쇄 할 수없는 경우 다음 f_printf을 수행하여 반올림하여 인쇄 할 수 있습니다.

  1. 10000소수점 뒤에 4 자리가 있으므로 곱하기
  2. 2를 곱하고 0x8000값의 부호에 따라 더하기 또는 빼기 (나눗셈에 사용되는 값)
  3. 로 나누다 0x8000 * 2
  4. 소수점 앞뒤의 값을 인쇄합니다.
// 2 bytes per sample, also use < instead of <=
for(int i = 0; i < sizeof(Buffer); i += 2){
    int v;
    int value = Buffer[i] | (Buffer[i + 1] << 8); // merge the 2 bytes into one integer
    if (value >= 0x8000) value -= 0x10000; // because the samples are signed
    // divide with the maximum value
    v = ((value * 10000) * 2 + (value >= 0 ? 0x8000 : -0x8000)) / (0x8000 * 2);
    f_printf(&OutFile, "%s%d.%04d\n",
      v < 0 && v / 10000 == 0 ? "-" : "", // sign (because typical integers don't have -0)
      v / 10000, // value before the decimal point
      (v < 0 ? -v : v) % 10000); // value after the decimal point
    osDelay(10);
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관