1. 程式人生 > >基於sinc的音訊重取樣(一):原理

基於sinc的音訊重取樣(一):原理

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

 

1,sinc函式和訊號的取樣與重建

在數字訊號處理中,sinc函式定義為:

                                                                                                                          

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

                                                                               

 

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

取樣定理說如果模擬訊號x(t)包含的最大頻率是Fmax且以Fs> 2Fmax的頻率被取樣,那麼x(t)可以用插值函式:

                                                                                                                           

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

                                                                                                                   

這裡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)。使用插值公式:

                                                                                                                

可以從樣本x(nTx)生成連續訊號y(t)。如果x(t)的頻寬小於Fx/2且

                                                                                                               

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

                                                                                                      

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

                                                                                                    

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

 

                                                                                                             

 所以

                                                                                            

令k=km-n,所以 n =km – k, 從而

                                                                                                  

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

                                                                                                          

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

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

                                                                                                                       

所以                                                                   

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

                                                                                                     

上式中BTx在FxFy已知的情況下是個常數

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

                                                                                                        

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

                                                                                                            

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

                                                                                                       

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

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

&n