版权声明:转载请注明出处,谢谢配合 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