音频之采样率、采样位宽、采样率转换(线性插值法)

版权声明:转载请注明出处,谢谢配合 https://blog.csdn.net/qq_33750826/article/details/80244784

一、采用率

参考资料 :百度百科
例如:16000Hz 表示1s中在连续信号中采集16000次,每一次叫做一个采样点。

二、采样位宽(位数)

参考资料:百度百科
例如:16bit 表示每一个采样点采集2个bit的数据,也就是2个字节。

三、音频数据大小计算

例如:
采样率为16k,采用位宽为16bit,单声道,在1分钟中采集数据的大小为多少?
16000*2*60/1024/1024~=1.83MB

四、采样率转换

线性插值:百度百科
例如:8k转16k。

4.1 分析:
前面说了采样率表示每秒采多少个采样点,那么8k就是1s采8000次,而16k表示1s采集16000次,8k转换成16k,就需要在每次采的时候增加一个采样点,以达到和16k的效果。

4.2 引发思考:
那么如何在每次采的时候增加一个采样点,已达到和16k同样的效果呢?

4.3 解决思考:
在每个音频数据前面增加一个数据,那么这个数据如何计算呢?线程插值去计算,例如下面一串音频数据:
10 20 30 40 90 67
那么通过线性差值如何计算插值呢?
例如第一个插值:(10-0)/2 +0=5
例如第一个插值:(20-10)/2 +10=15
.....
通过如上我们可以得出8k转16k的公式入下:

void convert8_16k(k_int16 *psi_buff, k_int16* psi_outbuf,k_uint32 ui_samples){

    k_uint32 i,j = 2;
    k_uint16 us_step = 0;
    us_step = ((psi_buff[0] - s_sample_prev)) / 2; //
    psi_outbuf[0] = s_sample_prev + us_step;
    psi_outbuf[1] = psi_buff[0]; //us_data_pre + (us_step*3)

    for(i=1;i<ui_samples;i++){
        us_step = (psi_buff[i] - psi_buff[i-1]) / 2;
        psi_outbuf[j] =  psi_buff[i-1]+us_step;
        psi_outbuf[j+1] =  psi_buff[i];
        j+=2;
    }
    s_sample_prev = psi_buff[i-1];
}

其他相关采样率转换:github

猜你喜欢

转载自blog.csdn.net/qq_33750826/article/details/80244784