對一種自制樂器進行音高修正和音色分析

作者:鄭智 吳炳炎 王偉帆
 

01概述


在本學期的另一門課程《機械製造基礎》中,我們利用3D 打印技術,設計並製造了一種類似單簧管的木管樂器。在這篇小論文中,我們將利用信號與系統課程所學的知識,對該樂器的音色和音高進行分析和修正。文章的主要內容如下:

首先,經過測試,我們發現我們自制的樂器存在一定的音準問題。因此,在第2節中,我們將基於吹奏單音時的錄音,通過DFT、頻譜變換和IDFT,恢復出具有正確音準的時域波形。基於正確的單音時域波形,我們進一步對由該樂器吹奏的一首樂曲的音頻進行了音高修正。在這個過程中,我們發現,頻譜伸縮變換能夠有效將樂器的音域從離散音高延拓到連續音域,並基於此將部分樂器的音高延拓到其音域之外,從而能夠製作部分樂器因爲超出音域而無法吹奏的樂曲。

在主觀感受上,我們自制的樂器的音色比較接近單簧管。同時,我們希望能夠設計一種方法客觀地評價該樂器的音色,並將其和其他木管樂器音色進行比對。在第3節中,我們訓練了1 個能夠提取樂器單音頻譜特徵,並區分4 中木管樂器音色的多層感知機(MLP),使其爲我們自制的樂器的頻譜計算頻譜特徵。實驗結果表明,模型計算的頻譜特徵同樣接近單簧管的頻譜特徵,與我們的主觀判斷一致。
▲ 樂器設計圖

▲ 樂器設計圖

▲ 樂器製作實物

▲ 樂器製作實物

 

02頻譜分析處理


1.頻譜的提取與簡化

(1)樂器單音頻譜

在理想情況下,單音的頻譜可以寫成如下形式:

其中,f0f_0是基頻,也就是人耳感知樂器的聲音頻率。kf0k \cdot f_0是第k節的泛音的頻率;aka_k是對應泛音的幅值,並滿足ak>0a_k > 0;而θk\theta _k是第k階泛音的相角。

由於人的耳朵對於相位不敏感,可以認爲人耳只能夠感知F(f)=k=1+akδ(fkf0)\left| {F\left( f \right)} \right| = \sum\limits_{k = 1}^{ + \infty } {a_k \delta \left( {f - k \cdot f_0 } \right)}。由於頻譜包含了時域波形的全部信息,因此也必然包含了單音的聽覺三要素:音高、音色和響度。可以簡單的認爲,f0f_0決定了音高,頻譜能量kak2\sum\limits_k^{} {a_k^2 }對應響度,而頻譜的形狀對應音色。對於單音頻譜,頻譜的相撞可以有歸一化的泛音峯值序列{ak}/kak2\left\{ {a_k } \right\}/\sqrt {\sum\limits_k^{} {a_k^2 } }完全描述。

在實際情況中,各界的泛音並非理想的δ(f)\delta \left( f \right)函數,而是有一定高度和脈寬的尖峯,如下圖所示:

▲ 長堤#F單音時域和頻域的波形

▲ 長堤#F單音時域和頻域的波形

這種情況下,可以通過以下共識來計算aka_k

其中(fbegink,fendk)\left( {f_{begin_k } ,f_{end_k } } \right)是第k階泛音的頻譜範圍,peakkpeak_k是第k階泛音波峯包含的頻譜點。

(2)時域截取

我們將5 種管樂器(單簧管、雙簧管、英國管、巴松、長笛)及自制樂器的各個單音進行了FFT。因爲每個單音的時域波形在兩端有漸強和減弱,我們希望排除這部分影響,所以對每個單音截取中間的較平整的片段。片段大於1 𝑠,故頻譜分辨率高於1Hz;採樣率𝑓𝑠 = 48000,故最大頻率爲24000 𝐻𝑧。截取片段前後對比如下(示例爲單簧管E):


可見截取後各個峯高度比例大致不變,雖然各個峯變寬,但是類似於噪音的震盪減少了,細微的小尖峯抹去了。

(3)頻譜簡化

於是我們得到了5*10+14個單音的頻譜。但是,儘管每個單音的頻譜僅有約10~25個峯,卻需要數萬個點來表達,十分不經濟,也不方便進一步的處理。所以我們希望對頻譜進行簡化,只記錄各個主要峯的頻率和幅值。

我們選擇只記錄峯值大於最高峯1%的峯;如果兩個峯過於接近,距離小於基頻的1/10,則將兩個峯合併。我們分別記錄了各個峯的峯值和麪積,兩者結果略有不同,雖然我們認爲面積代表各頻率的能量,更爲合理,但後續實驗表明兩者對音色的影響有限,難以分清孰優孰劣。最後將幅值歸一化,使每個頻譜的各峯幅值平方和爲一定值。兩種方法得到的簡化頻譜如下所示(示例爲單簧管E):

▲ 單簧管E音頻譜

▲ 單簧管E音頻譜

2.音符的時域生成

(1)任意時長單音的生成

我們雖然截取了各單音的音頻片段,但是其長度固定,若要得到時長更長的單音,如果簡單地將其複製拼接,在拼接處會有明顯的不連續感,音質很差。對於音頻片段FFT得到的頻譜,如果逆變換IFFT,得到的仍然是原長的音頻;如果對頻譜修改再IFFT,則往往結果爲複數。

得益於簡化頻譜,我們可以直接傅立葉級數求和。我們已擁有各主要頻率的頻率值和幅值,雖然缺少相位,但人耳對相位不敏感,且各頻率之比不是嚴格的倍數關係,相位的影響不大;且後續實驗了各頻率設置隨機相位,得到的音頻無差別。

於是,我們生成得到了各單音的任意時長音頻。與原音頻相比,生成的單音音色有一定改變,但仍可分辨。主要差別在,原頻譜在低頻部分除了峯外也有一定的值,而簡化時忽略,低頻份量減小;生成的音頻缺少管樂器氣息的變化,一成不變,較爲機械;原音頻爲實際錄音,有一定沙啞感,而生成的更爲緻密。(我們在附件中附上了幾個樣本,老師可以親自感受一下哈)

(2)任意頻率單音的生成

有了各音符的頻譜,我們就可通過修改頻譜,來任意改變音符的頻率。一方面,由於自制樂器的頻率略有不準確,可以將其修正到準確的頻率(在附件中附上了修正前後對比)。另一方面,我們可以將製作出本不屬於某種樂器音域的音符,將某種樂器的音域大大拓展。

我們起初設想的是,同一樂器不同音符的頻譜是極爲相似的,可以通過插值得到某兩個已有頻率之間的頻率。後來頻譜分析後發現,即便是同一樂器,不同音符的頻譜也差別很大(如下圖所示),這樣的話插值就意義不大了,所以選擇直接將某一音符的頻譜伸縮變換,得到另一頻率的音符。

3.樂曲生成

我們已經得到了,或者說可以得到5+1種樂器的各個音符,於是想進一步由音符生成樂曲。我們將樂曲的音符依次記錄在txt文件,包含其音高和時長,依此生成樂曲。由頻譜逐個音符生成,原本不包含的音符從其他音符頻譜轉換。

我們用5+1種樂器分別生成了一曲《歡樂頌》,其中一個低音G是超過部分上述樂器的音域的,我們從C生成了這個音符,拓展了樂器的音域,完成了整個歡樂頌。爲了保證音符之間連接處連續,將每個音符與半個週期的sin函數相乘。生成的歡樂頌如下圖(示例爲長笛),樂曲也置於附件中。

▲ 歡樂頌樂曲波形

▲ 歡樂頌樂曲波形

此外,我們還生成《新年好》《小星星》等樂曲。其中,生成的《浮誇》片段橫跨低音A 到高音A,原本用單一管樂器是難以演奏的,我們也用這種方式成功生成。

4.樂曲音高修正

基於2.3 中所述的方法,我們對自制樂器的單音音頻進行處理,得到具有準確音高的單音波形,並基於此對一首由該樂器吹奏的樂曲進行了修正。詳見補充材料。

 

03頻譜特徵提取和分析


根據主觀的聽覺感受,我們自制的樂器音色接近於單簧管音色。這符合我們的預期,因爲該樂器的按鍵系統、音孔排布、發聲裝置都在很大程度上借鑑了單簧管的設計。爲了更加客觀地評價我們自制的樂器的音色,我們試圖使用一種相對客觀的方法來對比自制木管樂器和其他木管樂器的音色。

當前主流音色理論認爲,頻譜能量分佈是決定樂器音色的重要因素[1]。一個最直接的辦法是觀察和比對不同樂器聲音的頻譜特徵。在1 中,我們已經計算了長笛、單簧管、雙簧管、英國管、巴松,以及我們自制的樂器在等5 種樂器在f-g1 範圍內的8~10 個單音的頻譜,並用歸一化的泛音波峯面積序列bk={ak}/kak2b_k = \left\{ {a_k } \right\}/\sqrt {\sum\limits_k^{} {a_k^2 } }來描述頻譜形狀。因此,我們嘗試直接對頻譜進行觀察,並總結出能夠區分出不同音色樂器的特徵和標準。

然而,我們發現,憑人眼觀察實際上很難看出能夠區分不同樂器音色的頻譜特徵,且即使是同一樂器,其不同音高的單音的頻譜形狀也可能存在較大差異。因此,我們嘗試使用一個多層感知機MLP 來提取頻譜特徵,並訓練其區分4 種常見木管樂器(長笛、單簧管、雙簧管、巴松)的音色,最後,用訓練好的MLP 爲我們自制的樂器提取頻譜特徵,計算自制樂器的頻譜特徵和其他樂器的特徵的相似或接近程度,作爲對
自制樂器音色的一種客觀評價。

▲ 多層感知機(MLP)的結構示意圖

▲ 多層感知機(MLP)的結構示意圖

MLP 以頻譜前k 階泛音波峯面積爲輸入(k 的取值在10~20 左右,在後續的試驗中,k=10),得到30 維頻譜特徵向量。激活函數爲ReLU()。損失函數定義如下:


其中,centerkcenter_k表示該批量中屬於第k 類樂器的全部特徵向量的質心。訓練樣本爲4 種樂器,各10 個單音的歸一化泛音波峯面積序列,採用全局梯度下降算法訓練200,輪。用PCA 和t-SNE 算法對訓練好的MLP 提取的4 種木管樂器的頻譜特徵進行可視化,結果如下:

▲ 四種木管樂器的頻譜特徵PCA降維可視化結果

▲ 四種木管樂器的頻譜特徵PCA降維可視化結果

▲ 四種木管樂器的頻譜特徵t-SNE可視化結果

▲ 四種木管樂器的頻譜特徵t-SNE可視化結果

可見,模型基本上能夠區分4種不同樂器的音色。在PCA分析中,bassoon和flute重疊較多,但在t-SNE算法中這2種區域重疊部分較少,可能與PCA的流形學習能力不如t-SNE有關。通過在同一樂器2個相鄰單音之間插值得到的頻譜,或許能夠用於數據增強來提升性能,但考慮該模型已經基本滿足要求,我們不再試圖優化模型性能。

然後,我們嘗試讓這個訓練好的MLP,提取自制樂器的頻譜特徵,可視化結果如下:
▲ MLP提取四種木管樂器的頻譜特徵PCA降維可視化結果

▲ MLP提取四種木管樂器的頻譜特徵PCA降維可視化結果

▲ MLP提取四種木管樂器的頻譜特徵t-SNE降維可視化結果

▲ MLP提取四種木管樂器的頻譜特徵t-SNE降維可視化結果

可見,模型計算的自制樂器的頻譜特徵,和單簧管頻譜特徵有較大重疊,模型認爲我們自制的樂器和單簧管音色最爲接近,與我們的主觀判斷一致。

 

※ 參考文獻

[1]Emily J. Allen, et al. Encoding of Natural Timbre Dimensions in Human Auditory Cortex. Neuroimage, 2018 February 01; 166: 60-70.

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