1、关于尽量减少除法的使用
2、当涉及到矩阵乘和卷积等运算时,是使用接口还是使用循环的问题。
比如一个sinc滤波器的实现,可以有下面两种方式:
方式一:将卷积拆分为乘和加,每次只取101个数做乘加计算,当in_data_len值较大(如16000)时,比直接用卷积对所有值计算要少很多运算量。
void sinc_filter_dot(int16_t *p_in_i16, uint32_t in_data_len, float *p_out_float, float* in_data_buf, sinc_filter_type_e filter_type)
{
int sinc_stride = 32;
float dot_result = 0;
uint16_t out_index = 0;
#if 1//IS_PRINT_STATIC
rt_tick_t start_rt = rt_tick_get();
#endif
for (int i_stride = 0; i_stride < DATA_SIZE_PER_SINC; i_stride++)
{
for (uint32_t j = 0; j < SINC_FILTER_LEN; j++) //每次只需要取101个数做乘加
{
in_data_buf[j] = (float)1.0 * p_in_i16[i_stride*sinc_stride + (SINC_FILTER_LEN-1 - j)];
// printf("j:%d\n", j);