[譯文]JOAL教程 第七課 多普勒效應

[譯文]JOAL教程

原文地址:http://jogamp.org/joal-demos/www/devmaster/lesson7.html

原文作者:Athomas Goldberg

譯文:三向板磚

轉載請保留以上信息。


本節課程對應的學習筆記:http://blog.csdn.net/shuzhe66/article/details/40393371


第七課多普勒效應

 

本文是DevMaster.net(http://devmaster.net/)的OpenAL教程對應的JOAL版本。C語言版原文作者爲JesseMaurais


真實世界當中的聲學


我知道,讓大家複習高中學習的物理知識是非常無聊的,但還是遷就一下吧。多普勒效應對於某些人來講是一個非常複雜的概念,但它確實是一個合乎邏輯的過程,當你深究下去後會覺得裏面有些內容很有意思。爲了理解多普勒效應,我們首先需要正確的理解“聲音”到底是什麼。大體上講,聲音是你的大腦對空氣中傳過來的壓縮波所進行的解釋。當空氣受到擾動時會從擾動點開始產生壓縮空氣分子的球狀波動,並從產生點向外擴散。考慮下面的圖:

                                                                                                                     

左圖中紅色的大寫S表示聲源位置,紅色大寫的L代表着你(你已經猜到了),也就是聽衆的位置。聲源與聽衆都未移動。聲源向外不斷髮射着壓縮波,它由藍色圓圈表示。聽衆正準確的聽到聲源所產生的聲音,就像圖中這樣。由於沒有移動,多普勒效應並沒有出現在這個例子中,它僅僅會在由於運動而造成聲波變形的情況下發生。

這裏你可以將圖片想象成一個動畫,聲源不斷產生聲波(也就是圓圈),並隨後由產生點沿半徑方向向外擴散。池塘裏德漣漪是一個與之相似的好例子。當你向平靜的水體投入一枚石子後,它會由落點向外發射一些波紋。無論你信不信,水波與聲波確實具有相同的物理性質。但這與多普勒效應有什麼關係呢?

請看右圖:哦,這裏發生了什麼?聲源開始移動了,這裏由紅色的箭頭來表示。實際上聲源正以一定的速度向聽衆移動。特別注意一下,新產生的波在之前波的內部移動,方向與產生它們的聲源運動路徑相同。這是多普勒效應的關鍵。本質上講,這裏發生的事情就是聲源在其運動路徑上發出多個波,但波自身不會隨着聲源移動,而是從發出點開始向外擴散運動。

那麼,這個效應是如何影響到聽衆的聽覺呢?再來看一下上面的圖,處於聲源與聽衆間的聲波被某種程度地壓縮了,這將使其一起到來而且聽上去就像播放的更快了。這裏討論的是聲音的頻率,聲波間的距離影響着聲音的頻率。當產生聲音的聲源處於移動當中時,會造成頻率的改變。你還會發現在空間中的不同點聲波間的距離也不同。例如,在聲源運動的反方向(之前運動的軌跡)聲波間的距離變得更廣了,這將導致頻率的降低(距離與頻率成反比)。這意味着,聽衆實際聽到的頻率取決於其具體位置。

聽衆的運動同樣會影響到頻率,但這樣的場景太難想象了。如果聲源不動而聽衆向其移動,那麼聽衆聽到的實際頻率與剛纔討論的聲源移動例子結果相同。

如果這些讓你感到困惑,不妨看看下面兩幅圖:

                                                  

這兩幅圖以正弦波的形式表現出兩個不同的聲音。先來看第一個,將它的波峯想象成聲音實例。波形的最高點對應於之前兩圖中的藍色圓圈,波谷則對應於藍色圓圈之間的距離。第二個圖代表了壓縮波。當你比較兩圖時可以發現明顯的不同。在相同大小的空間中,第二幅圖顯然容納了更多的波。換種說法,它們出現的更多,更具規律性,而且更加頻繁。
給想知道更多的人的一點附加信息:波速代表着聲音的速度。如果聲源速度大於波速,它將突破音障。


OpenAL中的聲學


好了,現在你已經理解了上面那篇關於多普勒效應的長篇大論,或者你跳過了它,已經完全理解多普勒效應而僅僅想知道它是如何對OpenAl渲染管線起到作用的。我認爲開始這一部分的最好方式是直接引用OpenAL文檔中的話:


                                     “多普勒效應的影響取與決介質中聲源與聽衆的的速度,以及聲音在介質中的對應傳播速度” ——第三章第七節。


我們可以把它理解爲有三種因素決定了聽衆最終聽到的聲源頻率。它們是聲源速度、聽衆速度以及定義好了的波速。當我們提及“介質”時,是指聽衆與聲源同時“處在”的材料。舉例來講,水中的聲音與空氣中的聲音聽上去差異很大。空氣與水就是不同介質的典型代表。聲音聽起來如此不同的原因在於不同介質的分子密度不同。就像我們之前所說的,聲音僅僅是空氣中分子的運動。分子密度高的介質其聲音出現明顯不同,原因在於其分子間的接觸更爲緊密,而這,將使聲音的傳播更加容易。另一個相反的例子,想象一下太空,這裏的分子密度極低,實際上只有零零散散的分子(主要是氫),這就解釋了太空中無法聽見聲音這一現象。

好了,回到我們的話題,OpenAL從本源上幫助我們計算多普勒效應,所以我們僅需提供一些參數來影響計算結果即可。這裏我們所做的也許並不是逼真的渲染,而是希望擴大或縮小多普勒效應所帶來的影響。計算公式是這樣的:

      shift = DOPPLER_FACTOR * freq * (DOPPLER_VELOCITY - l.velocity) / (DOPPLER_VELOCITY + s.velocity)

使用大寫字母表示常數。“l”與“s”表示聽終於聲源。“freq”表示未發生頻移的波,而“shift”表示頻移後的波。術語“頻移”恰當的關聯了改變的頻率,我們從現在開始將使用它。最終頻率的改變將會由OpenAL採樣並應用到所有受影響的音頻流中。

我們早已學會使用‘AL_VELOCITY’作爲‘alListenerfv’及‘alSourcefv’函數的參數來定義聲源與聽衆的速度,當加載文件時‘freq’參數由緩衝區屬性直接獲得。一下函數則用來設置上面公式的常量:

public void alDopplerFactor(float factor);
public void alDopplerVelocity(float velocity);

對於‘alDopplerFactor’函數來講,任何非負數都被接受。送入任何負數將導致錯誤標記置爲‘AL_INVALID_VALUE’並忽略操作。0是一個合法的參數,這樣將會關閉多普勒效應並可能帶來性能的提升(但並不怎麼理想)。多普勒因子對等式帶來的直接影響非常大,1.0並不會改變等式,0到1的數值將會降低多普勒效應所帶來的影響,而大於1的任何數將會擴大影響。


對於‘alDopplerVelocity’來講,任何正數將被接受。送入0或負數均會導致錯誤標記置爲‘AL_INVALID_VALUE’並忽略操作。多普勒速度從本質上將應該是聲音的速度,這一參數好比設定聲音在介質中的速度。OpenAL並沒有介質的概念,但這個參數將給出與介質相同的影響。OpenAL中同樣沒有單位的概念(公里、英里、秒差距[長度單位,約和3.26光年——譯註]等),所以請記住設置的這些常數與你之前在應用中定義的長度單位相關。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章