天天看點

基于sinc的音頻重采樣(一):原理

我在前面的文章《音頻開源代碼中重采樣算法的評估與選擇 》中說過sinc方法是較好的音頻重采樣方法,缺點是運算量大。https://ccrma.stanford.edu/~jos/resample/ 給出了sinc方法的原理文檔和軟體實作。以前是使用這個算法,沒太關注原理和實作細節。去年(2020年)由于項目的需要群組内同學把這個算法的原理和軟體實作細節搞清楚了。本文先講講sinc方法的原理,後面文章會講講軟體實作的細節。

1,sinc函數和信号的采樣與重建

在數字信号進行中,sinc函數定義為:

基于sinc的音頻重采樣(一):原理

當x = 0時,sinc函數值為1,當x為整數時sinc函數值為0(這些整數點x稱為過零點)。可以畫出sinc函數的波形圖如下:

基于sinc的音頻重采樣(一):原理

可以看出sinc函數是連續無限且關于Y軸對稱的(即sinc函數是偶函數)。

采樣定理說如果模拟信号x(t)包含的最大頻率是Fmax且以Fs> 2Fmax的頻率被采樣,那麼x(t)可以用插值函數:

基于sinc的音頻重采樣(一):原理

從它的樣本重建。這裡的插值函數就是sinc函數。重建後的x(t)可表達為:

基于sinc的音頻重采樣(一):原理

這裡x(n/Fs) = x(nTs) = x(n)是x(t)的采樣點值。Fs是采樣頻率,Ts是采樣間隔,Fs = 1/Ts。

2,重采樣

把數字信号的采樣率從一個頻率轉換為一個另不同頻率的過程稱為重采樣(sampling rate conversion,SRC)。上面采樣定理說過如果信号的帶寬小于采樣率的一半,就可以用插值從樣本重建信号。用新的采樣率采樣這個重建的信号,就可以實作重采樣。

假設以Fx=1/Tx采樣一個連續信号x(t),生成離散信号x(nTx)。使用插值公式:

基于sinc的音頻重采樣(一):原理

可以從樣本x(nTx)生成連續信号y(t)。如果x(t)的帶寬小于Fx/2且

基于sinc的音頻重采樣(一):原理

那麼y(t) = x(t)。為了實作重采樣,隻需要以時間間隔t=mTy對y(t)進行求值即可,Fy=1/Ty是新的采樣率。

基于sinc的音頻重采樣(一):原理

重新組織g(t)的參數:

基于sinc的音頻重采樣(一):原理

mTy/Tx可以分解成整數部分km和分數部分

基于sinc的音頻重采樣(一):原理
基于sinc的音頻重采樣(一):原理

 是以

基于sinc的音頻重采樣(一):原理

令k=km-n,是以 n =km – k, 進而

基于sinc的音頻重采樣(一):原理

考慮到有上下采樣,文檔(https://ccrma.stanford.edu/~jos/resample/)給出插值函數為:

基于sinc的音頻重采樣(一):原理

其中Fx為原采樣率,Fy為新采樣率。

令  A= min(1, Fy / Fx), B = min(Fx, Fy), ρ = Fy / Fx = Tx / Ty, 則g(t)可表示為

基于sinc的音頻重采樣(一):原理

是以                                                                   

基于sinc的音頻重采樣(一):原理

在上式中,x和y信号離散化後,在x信号和y信号中的Tx,Ty可以去掉了。式子就變成了如下:                                                                                                       

基于sinc的音頻重采樣(一):原理

上式中BTx在Fx,Fy已知的情況下是個常數。

令D=BTx,上式就變成了:

基于sinc的音頻重采樣(一):原理

當上采樣時B=Fx,則D=FxTx=1,A=1,是以式子重寫為:

基于sinc的音頻重采樣(一):原理

 當下采樣時B=Fy, 則D= FyTx = ρ    A= ρ,是以式子重寫為:

基于sinc的音頻重采樣(一):原理

 從上面的式子可以看出,新的采樣率下的值是原采樣率下的值和相對應的sinc函數的值的乘累加。由于sinc函數是連續且無限的,真正實作時是無法做到的,是以這兒通過截斷sinc函數并離散化,來獲得近似信号。在文檔(https://ccrma.stanford.edu/~jos/resample/)中,使用Kaiser window加窗截斷,通過線性插值采樣後的樣本來模拟脈沖響應的連續性,獲得很好的效果。

至此基于sinc方法的重采樣原理就講完了,即新的采樣率下的值是原采樣率下的值和相對應的sinc函數的乘累加。如果此時去看相關的代碼實作,很大可能是一頭霧水,下篇将講怎麼基于原理去做軟體實作以及實作中的一些細節。

基于sinc的音頻重采樣(一):原理