C++,python,热爱算法和机器学习
全部博文(1214)
分类:
2012-01-02 16:54:51
這到底是拿來做甚麼的呢?這其實是用來遮蔽 (mask) 環境中的聲音的。當妳需要專心工作,而周遭總是有繁雜的聲音時,就可以選用這兩種聲音來加以遮蔽。一般來說,通常的情況下妳可以選用白色噪音,而粉紅色噪 音則是特別針對說話聲的遮蔽材料。為什麼可以這樣做?請聽我慢慢解釋。
首先有一個很重要的觀念要釐清:響音心理學 (Psychoacoustic) 上的噪音 (Noise) 跟通常並不相同。在響音心理學中,任何妳所不想聽到的聲音都算噪音;而在一般聲學上,噪音則有特定的種類。因此我們會利用一般聲學上的噪音,作為響音心理學上的遮蔽音 (Masker) ,讓妳聽不到那些妳不想聽到的聲音(響音心理學上的噪音)。
人們所不想聽到的聲音有很多種,針對不同的(響音心理學上的)噪音,又可以選用不同的遮蔽音,以達最大效率。一般所使用的遮蔽音,也就是聲學上的噪音;按照聲學慣例,人們習慣。這個表示方法是借用光譜,把人耳所能聽到的頻率範圍 20Hz ~ 20kHz 套上顏色, 20Hz 頻率低,相對來說波長比較長,所以對應到紅色;然後依序是妳所熟知的橙、黃、綠、藍、靛,而 20kHz 那一端頻率較高,對應到的就是波長較短的紫色;接著把聲音訊號透過快速傅立葉轉換 () 在這個聲譜上顯示成頻譜圖 (Spectrum) 。
如果在每一個頻率上,聲音的能量都均等的話,就好像是所有的顏色都具備的光──也就是白色光,因此這樣的聲音會被稱做白色噪音。因為白色噪音在每一個頻率上的能量均等,所以也成為最被廣泛運用的遮蔽音──既然妳不知道想遮蔽掉的噪音分佈在哪些頻率,索性就遮蔽所有的頻率。下圖是我用 所產生出來的白色噪音 (white-audition.wav, 長一分鐘整) 進行 FFT 的結果:
妳可以看到,這個聲音在各個頻率的能量都是一樣高的。
然而白色噪音在每個頻率的能量都一樣強,所以要製造特定音強的白色噪音時,所會消耗的總能量就會比較大。如果妳能夠得知所要遮蔽的聲音的特性,就可以選用不同的遮蔽音,這樣就可以用較少的能量,而達到相同的功效。
以人類說話的聲音來說吧。一般描述語音的產生,大概都是援用 Fant 自 1960 起所提出的理論及其後續的研究,使用 來加以解釋,認為聲音是由聲帶振動所產生,經過聲道 () 濾波,最後再加上來自口部的發散作用,纔形成了語音。
考慮聲帶的振動以及口部的發散作用,語音的能量在本質上乃是與頻率成反比的。因此最有效遮蔽語音的材料,就是能量與頻率成反比關係的聲音,也就是粉紅色噪音。下圖是我用 Adobe Audition 所產生出來的粉紅色噪音 (pink-audition.wav, 長一分鐘整) 進行 FFT 的結果:
上面這個粉紅色噪音又被稱做頻率反比 (1/f) 噪音,因為它的能量分佈與頻率成反比,或者說是每一個八度音程 () 能量就衰退 3 dB 。其實在臨床聽力學上另外還有專門的語音噪音,是用於遮蔽語音的;不過在產生上,還是以粉紅色噪音最為經濟也最為常用。
經過上述的介紹,妳大概對於這種遮蔽音的使用,也有了一些瞭解了。除了我們一開始提過的 Noise.app 之外,其實在 Windows 上也有類似的產品,像是由 所發售的 。
SoundMasker 的功能比 Noise 多了一些:在它的畫面左邊除了白色噪音與粉紅色噪音外,還有咖啡色噪音 () 、藍色噪音 (Blue Noise) 以及其他預先定義好的噪音種類;妳可以同時混用多種不同的噪音,利用中央的控制棒分別指定不同的音量,並且在右邊還可以選擇不同的低通濾波器 () 。妳可以把搭配出來的選擇儲存成一份設定,也可以把它錄製起來,然後拿到其他裝置裏播放。
看起來很不錯?但是我自己實際試用起來,卻覺得他所產生的遮蔽音就是有那麼一點怪,所以我檢查了一下,發現 SoundMasker 並不真的是以程式亂數產生遮蔽音!在 SoundMasker 的程式目錄中,妳可以找到一些 .wav 的波形檔,像是 White.wav 與 Pink.wav 等,原來它偷偷用了預先錄製好的遮蔽音片段,然後祇是再即時加以混音與濾波而已啊!於是我把這兩個檔案也餵進 Adobe Audition 進行分析。它的白色噪音樣本分析起來如下圖:
這個結果就沒有之前我用 Adobe Audition 所產生出來的好,仔細一點看就可以發現能量的分佈並不平均,而且高頻部分的能量其實比低頻部分的能量略多了一點。
同樣地, SoundMasker 裏的粉紅色噪音分析起來也不大理想:
低頻部分很明顯地不夠理想,可以看出能量略有不足。
雖然 SoundMasker 裏的遮蔽音樣本沒有非常優異,但是其實還不會太差,可是我聽起來的結果真的不大對勁。基於實證的精神,我使用了 SoundMasker 內建的錄音功能,把這兩種遮蔽音分別錄起來,然後加以分析:
首先是白色噪音 (white-soundmasker-rec.wav, 長一分鐘整) :
從圖中我們明顯看到 2000 Hz 至 3000 Hz 部分的能量明顯偏多,然後在 3500 Hz 處以上就完全沒有能量了。這顯然是受到 SoundMasker 的低通濾波器影響所致──沒錯,那個濾波器妳甚至關不掉!
接下來是粉紅色噪音 (pink-soundmasker-rec.wav, 長一分鐘整) :
同樣地,粉紅色噪音也受到了低通濾波器影響,因而不甚理想。
結果就是 SoundMasker 看似功能較多,其實卻是處處受限,尤其對於 4000Hz 以上的環境噪音一點抑制能力也沒有;如果真的單單為了遮蔽背景噪音而花 30 美元要買這套軟體,恐怕實用性上來說還是沒有 Mac OS X 上免費的 Noise.app 理想。(不過這話說得太早了──我還沒有分析過 Noise.app 所產生出來的東西呢!)
更新:我後來拜託 幫我把 Noise.app 產生出來的遮蔽音錄起來,然後也用相同的方法分析。請見底下的說明:
首先是白色噪音 (white-noise.app-rec.wav, 長一分鐘整) :
從圖中我們可以發現這個聲音跟先前用 Adobe Audition 所產生出來的白色噪音可以說是一樣完美的,各個頻率上的聲音能量都很一致,比 SoundMasker 播放出來的好上許多。
接下來是粉紅色噪音 (pink-noise.app-rec.wav, 長一分鐘整) :
咦,這個粉紅色噪音分析之後的結果怪怪的,似乎低於某個頻率的部分各頻率能量均相等,在該頻率以上的部分纔符合粉紅色噪音 1/f 的特性……為了要看得更詳細點,讓我們把縱座標放大來觀察:
從這張圖來看就很清楚了,的確在低於 500Hz 的部分比較像白色噪音──各個頻率的能量均等;而在高於 500Hz 的部分則跟標準的粉紅色噪音無異。
我們可以看到 Noise.app 所輸出的遮蔽音比 SoundMasker 播放的還要理想許多,可是為什麼這個粉紅色噪音會不標準呢?我有想到幾個可能的原因:第一,可能 Noise.app 認為這個樣子的遮蔽音,會比正確的粉紅色噪音來得實用(也就是更能有效率地遮蔽語音混雜的環境噪音);第二個可能就是我們在轉錄 Noise.app 的聲音時,哪裡沒有設定好,使得原本的聲音遭受尖峰消除 (Peak-Clipping) 處理,把大於 -50 dB 的部分都弭平了,纔會變成現在這樣。(但是這樣的話,轉折點 (Knee-point) 剛好在 500Hz 似乎又太巧了點)
不過不管怎麼說,我覺得這麼一比較下來, Noise.app 還是比 SoundMasker 實用多了; SoundMasker 光在花俏的功能上下功夫,卻沒有把根本顧好,有點可惜。要到哪一天, Windows 上纔會有像 Noise.app 這樣輕巧實用的小程式呢?