精度转换(16位量化转32位量化)

这个本质量化位数的转换;并不是精度转换;注意有些系统上float是8字节的;这里使用的是4字节32位
转载来自:https://github.com/pinkydodo/AudioUnitMac/blob/master/AudioUnitMac/AudioRecordAndPlay.mm
1
//////////////////////////////////////////////////////////////////////////////////////////////////////// 2 ///把float32格式的音频数据,转换为int16格式的 3 void tdav_codec_float_to_int16 (void *pInput, void* pOutput, uint8_t* pu1SampleSz, uint32_t* pu4TotalSz, bool bFloat) 4 { 5 int16_t i2SampleNumTotal = *pu4TotalSz / *pu1SampleSz; // 6 int16_t *pi2Buf = (int16_t *)pOutput; 7 if (!pInput || !pOutput) { 8 return; 9 } 10 11 if (bFloat && *pu1SampleSz == 4) { 12 float* pf4Buf = (float*)pInput; 13 for (int i = 0; i < i2SampleNumTotal; i++) { 14 pi2Buf[i] = (int16_t)(pf4Buf[i] * 32767 ); // float -> int16 只要是不超过能表示的最临界数值,就行,超了类型所表示的最大值就会破音
15 } 16 *pu4TotalSz /= 2; // transfer to int16 byte size 17 *pu1SampleSz /= 2; 18 } 19 if (!bFloat && *pu1SampleSz == 2) { 20 memcpy (pOutput, pInput, *pu4TotalSz); 21 } 22 return; 23 } 24 25 ///把int16格式的音频数据,转换为float格式的 26 void tdav_codec_int16_to_float (void *pInput, void* pOutput, uint8_t* pu1SampleSz, uint32_t* pu4TotalSz, bool bInt16) 27 { 28 int16_t i2SampleNumTotal = *pu4TotalSz / *pu1SampleSz; 29 float *pf4Buf = (float *)pOutput; 30 if (!pInput || !pOutput) { 31 return; 32 } 33 34 if ( bInt16 && *pu1SampleSz == 2) { 35 int16_t* pi2Buf = (int16_t*)pInput; 36 for (int i = 0; i < i2SampleNumTotal; i++) { 37 pf4Buf[i] = (float)pi2Buf[i] / 32768 ; // int16 -> float 38 } 39 *pu4TotalSz *= 2; // transfer to int16 byte size 40 *pu1SampleSz *= 2; 41 } 42 if (!bInt16 && *pu1SampleSz == 4) { //如果是float,直接拷贝 43 memcpy (pOutput, pInput, *pu4TotalSz); 44 } 45 return; 46 }

 

posted on 2021-10-26 14:06  邗影  阅读(729)  评论(0)    收藏  举报

导航