1. 程式人生 > >用Unity3D內部頻譜分析方法做音樂視覺特效的原理說明

用Unity3D內部頻譜分析方法做音樂視覺特效的原理說明

這裡寫圖片描述

[視訊連線]

先理解幾個名詞和概念:

聲音:一種波動,通過空氣分子有節奏的震動進行傳遞。
聲音訊率Hz:聲音每秒種震動的次數,以赫茲Hz 表示。頻率越高,音高越高。
分貝dB:量度兩個相同單位之數量比例的單位,可表示聲音的強度單位。
人耳可聽到的聲波頻率:每秒振動20次到20000次的範圍內,既20赫茲至20000赫茲之間,。

取樣Sampling:在訊號處理程式中,將連續訊號(例如聲波)降低成離散訊號(一系列樣本資料)。
取樣率Sampling Rate:每秒從連續訊號中提取並組成離散訊號的取樣個數,單位也是赫茲。
快速傅立葉變換FFT:一種演算法,可用來轉換訊號。
窗函式Window Function

:在訊號處理之中,用來降低信噪比的一種演算法。
信噪比:
—噪訊比越高的話,聲音的大音量和小音量的音量差會越大(音質猛爆)。
—噪訊比越低的話,聲音的大音量和小音量的音量差會越小(音質柔和)。

然後我們看一下Unity內建的這條命令:

AudioSource.GetSpectrumData
—public void GetSpectrumData(float[] samples, int channel, FFTWindow window);
samples:將音訊樣本資料傳送至samples陣列,陣列大小必須為2的n次方,最小64,最大8192。
channel:一般設定為0。
window

:轉換訊號所用的窗函式,演算法越複雜,聲音越柔和,但速度更慢。

因此我們先宣告一個浮點陣列:

public float[] spectrumData=new float[8192];

在Update方法裡面使用方法:

thisAudioSource.GetSpectrumData(spectrumData,0,FFTWindow.BlackmanHarris);

那麼這個方法傳送到浮點數組裡的資料是什麼呢?
已知了開始部分的概念,我們可以定義幾個變數:
一系列取樣資料樣本: N
取樣頻率: fs
時間:T

既:T=Nfs

它的倒數稱為頻率解析度Frequency Resolution:d

f=1T=fsN

頻率解析度越高,轉換出來的資料越精確。(下圖,同樣情況下,低頻率解析度與高頻率解析度的比較)
這裡寫圖片描述

這裡寫圖片描述

而我們宣告的浮點數陣列的大小既是GetSpectrumData這個方法的窗函式轉換資料時所用的頻率解析度,而陣列中每個浮點數的值既是譜密度,每單位頻率波攜帶的功率,我們知道了頻率解析度df=8196,那麼每個浮點數,既譜密度dB表示的的是哪個頻率範圍,既音高範圍的功率呢?

目前數字音樂領域的取樣率通常為44100Hz,但通過分析音訊檔案[MV] FIESTAR(피에스타) _ Mirror.mp3的頻譜,可能是因為通過視訊轉音訊的緣故,基本上16000Hz以上的譜密度都非常低了。
這裡寫圖片描述

而在Unity內通過分析spectrumData的數值,spectrumData[5500]左右以後的浮點數值與前面有一個斷崖似的減少,因此可推斷出,GetSpectrumData的取樣的最高頻率是在20000~23000赫茲之間,既音訊檔案23000赫茲以上頻率的資料都被忽略掉了。

如果繼續深入,可研究聲波頻率與音高的關係,將spectrumData特定範圍的浮點數相加即可體現樂曲中各個音高的譜密度,由於人的聽覺系統對音高最為敏感,其視覺效果應該會更加理想。

這裡寫圖片描述

視訊