天天看点

音频处理基础-数值定点化

定点化

由于成本,功耗等音素,一些DSP和MCU上并没有硬浮点支持,采用软浮点较为耗时,更有甚至不支持浮点计算。 在这些处理器上要实现相关算法,浮点的计算转换到定点域里计算必不可少。

Q

格式的数据是名义上的定点数,它们的存储和计算均按照整数方式进行计算,这样的化就可以使用标准的整数ALU来实现浮点计算。而编程这必须确定整数和小数部分的位数以符合使用场景需要的动态范围和精度。

##浮点转成Q格式

从浮点转成

Qm.n

格式如下:

1.将浮点数乘以2^n

2.四舍五入到整数

##Q格式转成浮点

  1. 乘以2^{-n}

    ##线程编程

    本篇所述线程是指POSIX标准的线程,

pthread库不是Linux系统默认的库,链接程序时需要使用静态库libpthread.a,编译时可以加上-lpthread参数.

在算法工程化这一章节中就提到了并发程序设计思想,并发程序设计的核心思想是利用处理多核特性,让数据处理并发,并发可以使用多进程实现也可以用使用多线程方式实现,在同一个进程中的多个线程可以访问所属进程的资源,如文件描述符,内存等;在多个线程里共享资源时就需要关注资源的一致性(信号,锁,同步)问题.

考虑时下一个比较常见的应用场景,麦克风阵列在做AEC(自动回声消除时),每一路麦克风数据处理极其相似,一路一路处理这种串行处理方式是一种方式,另外还有一种方法是设置多个线程,将每一路的语音数据分配到一个核上,并发执行,这样在四核四路麦克的情况下,实际的处理时间就是一路处理时间,这样系统的实时性就会很好.

当然在单核的情况下更需要多线程设计,举个例子,一个进程执行了定期获取麦克风寻向结果,然后根据获取到的结果进行点灯刷新操作,如果是多线程设计,那么在等待获取寻向结果线程时,这个线程是可以进入休眠的,将cpu让出来给其它线程使用,尽量充分利用cpu资源.

###线程创建

#include <phtread.h>
int pthread_create(pthread_t *restrict tidp,
                const pthread_attr_t *restrict attr,
                void *(*start_rtn)(void*), void *restrict arg);
           
下一篇: pat甲级1001

继续阅读