Speex之三 編譯和移植

2021-06-06 09:14:38 字數 3046 閱讀 1095

3. 編譯和移植

通過自動配置在unix/linux或其它平台支援(如win32/cywin)編譯speex很容易,只需鍵入:

%./configure[options]

%make

%make install

其設定支援是通過speex配置指令碼的:

-prefix=指定speex安裝其本路徑(如 /usr)

-enable-shared/-disable-shared  是否編譯共享庫

-enable-static/-disable-static  是否編譯靜態庫

-disable-wideband 取消speex的寬頻部分(典型的節省空間)

-enable-valgrind  為除錯目的啟用額外valgrind的命中率

-enable-sse  啟用sse指令(只在 x86/浮點)

-enable-fixed-point 編譯speex為無浮點單位(fpu)處理器

-enable-arm4-asm 啟用彙編指定為armv4架構(只在gcc)

-enable-arm5e-asm 啟用彙編指定為armv5e架構(只在gcc)

-enable-fixed-point-debug 只使用除錯定點碼(非常慢)

-enable-epic-48k 啟用乙個專門(不相容)4.8kbps窄帶模式(在1.1.x和1.2beta)

-enable-ti-c55x 啟用支援ti c5x族

-enable-blackfin-asm 啟動彙編指定為blackfin dsp架構

-enable-vorbis-psycho 使編碼器使用vorbis心理學模型。這是非常實驗性,可能在將來會被移除

3.1 平台

speex是眾所周知可在大量架構上編譯和執行的,包括浮點和定點。一般只要架構能夠自然地計算兩個有符號16位數(32位結果)的相乘,和執行足夠的時鐘率,就能夠執行speex。下面是speex知道能執行的架構(可能還可以執行於很多其它架構):

(1)x86 & x86-64

(2)power

(3)sparc

(4)arm

(5)blackfin

(6)coldfire (68k family)

(7)ti c54xx & c55xx

(8)ti c6***

(9)trimedia (experimental)

speex知道可工作的前幾個作業系統包括(它可能可工作於其它很多作業系統上):

(1)linux

(2)uclinux

(3)macos x

(4)bsd

(5)其它 unix/posix 變種

(6)塞班

源**目錄在readme.***檔案裡包括了在一定的架構和作業系統編譯的資訊。

3.2 移植和優化

當在某乙個新的或存在的平台上移植或優化speex時,這裡有一些事要思考。

3.2.1 cpu優化

影響speex的cpu使用很多是因為是否編譯它使用浮點或定點。如果你的cpu/dsp沒有浮點單元(fpu),當編譯使用定點將會更快。如果有fpu,測試哪個版本更快是很重要的。在x86體系,浮點一般會更快,但不總是這樣子。編譯speex作為定點,你需要通過-fixed-point去配置指令碼或者定義巨集fixed_point。作為1.2beta3,它現在可以禁用浮點相容的api,這意味著你的**可以連線乙個沒有浮點的**庫。只要配置-disable-float-api 或者定義disable_float_api巨集。直到vbr功能移植到定點,不然你還需要配置-disable-vbr或定義disable_vbr。

檢查一些dsp構架上的其它重要事情是:

(1)確認快取被設定為回寫模式

(2)如果晶元使用sram代替快取,確認有多少**和資料是存在sram的,而不是ram

如果你準備寫彙編,那下面的函式是經常你首先應該考慮的:

(1)filter_mem16()

(2)iir_mem16()

(3)vq_nbest()

(4)pitch_xcorr()

(5)interp_pitch()

濾波函式filter_mem16()和iir_mem16()是實現直接形式ii轉(df2t)。雖然,架構是基於乘法累加(mac),df2t頻繁地過載加法器,這會使用**非常的慢。在這架構(如 blackfin 和 coldfire), 乙個更好的方法是使用df1實現函式,這是比較容易表示的mac。當那樣做,確認df1執行仍表現得像原來df2t的表現是很重要的。這是很有必要的,因為濾波器是時變的和必須計算精準的相同值(不包括機四捨五入)

3.2.2 記憶體優化

記憶體優化是小嵌入平台主要需要思考的事情.在pc平台,speex已經足夠小了,不值得去做這些事情.這裡有一些方法去降低speex記憶體的使用,從**大小和資料大小方面著手.優化**大小,關鍵首先是刪除你不需要的功能.一些例子可以很容易去禁用你不需要的專案:

(1) 寬頻支援(-disable-wideband)

(2) 支援立體聲(刪除 stereo.c檔案)

(3) vbr支援(-disable-vbr 或 巨集disable_vbr)

(4) 靜態碼本,位元率你使用的是不需要的(*_table.c 檔案)

speex也有一些方法去分配暫時陣列.當使用支援c99屬性的編譯器(自2023年起,微軟編譯器不支援了,但gcc支援),最好這定義var_arrays. 使用c99的變化長度陣列時,最好定義use_alloca已致speex能使用alloc()去分配暫時陣列. 注意在很多系統, alloca()是bug所以它可能不能工作. 如果沒有定義var_arrays和use_alloca,那speex將回落分配乙個很大的暫時空間,並讓它成為自己的內部空間.這解決方案主要的缺點就是太浪費了.它需要為最壞的情況(最壞的位元率、最高的複雜度設定...)分配夠的棧空間,而且預設不共享多個編碼器/解碼器之間的記憶體。如果只剩下手動分配唯一的設定,仍有一些東西能被改善的,通過重寫os_support.h檔案裡面的speex_alloc_scratch()呼叫,它總是可以返回相同的記憶體區域。除些之外,通過重定義nb_enc_stack和nb_dec_stack(或相似寬頻)可以只為已知優勢的方案下分配記憶體。在這種情況,可以為明確的取樣率,位元率和複雜度水平測量記憶體需要的數量。

編譯speex移植

2 解壓 tar zxvf speex 1.2.0.tar.gz 3 配置 cd speex 1.2.0 configure build arm linux gnueabihf host arm linux cc arm buildroot linux gnueabihf 4 編譯 make 在li...

OpenSSH交叉編譯和移植

一 openssl交叉編譯編譯 2 解壓 tar xvzf openssl 1.0.1h.tar.gz 3 進入解壓後的目錄,然後再建立輸出目錄 make install是安裝在該目錄 如mkdir outdir 4 配置 config no asm prefix home testdir open...

工程實踐QT部分之三(移植一)

作為要在開發板上展示的程式,移植可以說是關鍵中的關鍵。網上有很多關於qt移植的技術部落格可以列舉一些,我認為對我有用的 首先是嘗試用qt4.5.3按照下面的步驟做 必要的檔案準備 yum install libx11 dev libxext devlibxtst dev 先用yum search來查...