天天看點

音頻處理基礎-數值定點化

定點化

由于成本,功耗等音素,一些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

繼續閱讀