Колупаю пример Audio_playback_and_record идущий с STM32F4Discovery и заметил что частота воспроизведения файлов заметно отличается от 44100 в меньшую сторону. Как физически замерить реальную частоту не придумал.
Вот что генерирует утилита STM32F4xx_Clock_Configuration_V1.1.0.xls
PHP код:
|
*-----------------------------------------------------------------------------
* I2S input clock(Hz) | 86000000
* |
* To achieve the following I2S config: |
* - Master clock output (MCKO): OFF |
* - Frame wide : 16bit |
* - Audio sampling freq (KHz) : 44,1 |
* - Error % : 0,0967 |
* - Prescaler Odd factor (ODD): 0 |
* - Linear prescaler (DIV) : 2 |
*-----------------------------------------------------------------------------
|
Не пойму как тут получается частота 44100 да еще и с погрешностью 0,0967.
Согласно даташита если ODD = 0 то real divider value is = I2SDIV *2
86000000/256/(2*2) = 83984,375
Нужно еще делить на 2 канала или на 2 байта так как ширина потока данных 16 бит?
Ну и все равно погрешность получается достаточно большой 44100/41992,1875*100-100 = 5,02%.
А вот как рассчитывается значения делителя в функции I2S_Init
PHP код:
|
tmp = (uint16_t)(((((i2sclk / 256) * 10) / I2S_InitStruct-›I2S_AudioFreq)) + 5);
/* Remove the flatting point */
tmp = tmp / 10;
/* Check the parity of the divider */
i2sodd = (uint16_t)(tmp & (uint16_t)0x0001);
/* Compute the i2sdiv prescaler */
i2sdiv = (uint16_t)((tmp - i2sodd) / 2);
/* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */
i2sodd = (uint16_t) (i2sodd ‹‹ 8);
|
Тут рассчет понятный за исключением того что такое
5 в первой формуле??
В результате получаются те же
i2sdiv = 2
i2sodd = 0
В чем я не прав? Как мне подобрать наименьшую погрешность частоты на выходе учитывая что МК тактируется от внешнего кварца 8МГц?