硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5172|回复: 1
收起左侧

[客户分享] 实际测试STM32F407固件库I2S初始化函数I2S_Init生成的采样率误差较大

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2015-4-18 18:58:43 | 显示全部楼层 |阅读模式
测试条件:
1. 实际测试采样率:

#define I2S_AudioFreq_192k               ((uint32_t)192000)

#define I2S_AudioFreq_96k                ((uint32_t)96000)
#define I2S_AudioFreq_48k                ((uint32_t)48000)
#define I2S_AudioFreq_44k                ((uint32_t)44100)
#define I2S_AudioFreq_32k                ((uint32_t)32000)
#define I2S_AudioFreq_22k                ((uint32_t)22050)
#define I2S_AudioFreq_16k                ((uint32_t)16000)
#define I2S_AudioFreq_11k                ((uint32_t)11025)
#define I2S_AudioFreq_8k                 ((uint32_t)8000)


2. 固件库V1.5.0,使用函数I2S_Init测试。
3. 串口打印输出函数,放在函数I2S_Init里面



    {
        uint32_t temp;
        float temp1;
        
        printf("目标采样率 = %d\r\n", I2S_InitStruct->I2S_AudioFreq);
        printf(&quotLLI2SN = %d, PLLI2SR = %d, pllm = %d\r\n", plln, pllr, pllm);
        printf("i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = %d\r\n", i2sclk);
        printf("i2sodd = %d, i2sdiv = %d\r\n", i2sodd, i2sdiv);
        temp =  i2sclk / ((32*2)*((2*i2sdiv)+i2sodd)*4);
        printf("实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = %d\r\n", temp);
        temp1 = abs(temp- I2S_InitStruct->I2S_AudioFreq);
        printf("误差率 = %f%%", temp1/I2S_InitStruct->I2S_AudioFreq*100);
    }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
 楼主| 发表于 2015-4-18 19:19:47 | 显示全部楼层
测试结果1:

目标采样率 = 192000
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 0, i2sdiv = 1
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 187500
误差率 = 2.343750%

测试结果2:

目标采样率 = 96000
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 0, i2sdiv = 2
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 93750
误差率 = 2.343750%



测试结果3:

目标采样率 = 48000
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 0, i2sdiv = 4
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 46875
误差率 = 2.343750%


测试结果4:

目标采样率 = 44100
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 1, i2sdiv = 4
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 41666
误差率 = 5.519274%



测试结果5:

目标采样率 = 32000
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 0, i2sdiv = 6
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 31250
误差率 = 2.343750%


测试结果6:

目标采样率 = 22050
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 1, i2sdiv = 8
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 22058
误差率 = 0.036281%


测试结果7:
目标采样率 = 16000
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 1, i2sdiv = 11
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 16304
误差率 = 1.900000%


测试结果8:
目标采样率 = 11025
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 0, i2sdiv = 17
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 11029
误差率 = 0.036281%


测试结果9:

目标采样率 = 8000
PLLI2SN = 192, PLLI2SR = 2, pllm = 25
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr) = 96000000
i2sodd = 1, i2sdiv = 23
实际采样率= i2sclk / [(32*2)*((2*i2sdiv)+i2sodd)*4)] = 7978
误差率 = 0.275000%
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 18:07 , Processed in 0.035488 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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