寂寞難挨,不妨用Matlab示個愛
編輯:學妹
你的生活中是不是經常出現這樣的場景:
小師妹
師兄,可不可以幫我調一下程序呀~
可以,發過來吧
大師兄
小師妹
pso_control.m
5
分
鍾
後
pso_control.m
大師兄
接下來的劇情是這樣發展的:小師妹打開程序一運行,bug全部解除。同時程序結束後響起一段美妙的音樂(月亮代表我的心matlab版,此處用女神鄧麗君歌曲取代下啦)。
月亮代表我的心
香港之戀
鄧麗君
00:00/03:35
原來大師兄在小師妹原程序的結尾額外調用了一個「浪漫子程序」,從此,小師妹便深深地迷戀上了會調代碼又不失浪漫的大師兄……
我知道劇情有點狗血,本篇推文的目的其實是來分享技術的——如何在Matlab中製作一首樂曲,當然,你可以用它來撩妹,來把漢,來示愛,來求婚……
技術攻略
Matlab對廣大理工科學生來說相信都不陌生,這裡Matlab製作樂曲主要用到sound(X,fs)函數,該函數可以將一個輸入的正弦函數X轉化成相應的聲音信號。
其中fs表示採樣率,由於人耳能夠聽到的聲音範圍是20~20000Hz。根據採樣定理fs只需要大於40000即可,本人採樣率的設置採用了MP3的標準,即fs=44.1k.
如輸入正弦信號X=A*sin(2*pi*w*t)
信號幅值A——聲音的大小,這裡不需要關心
信號頻率w——聲音的高低,即音調
信號時長t ——聲音的長短
舉個栗子
假如我們知道鋼琴上的C4、A4鍵,即中音do、la(簡譜中的1、6),頻率為261.63Hz、440Hz,分別輸入
利用sound函數可得到時長0.1s的do音和時長0.05s的la音,兩個音的函數圖像分別為
一首樂曲可以看成是由不同音調的音按不同時長排列組合而成,而
音調——正弦波的頻率
時長——正弦波的長度
於是我們用不同頻率,不同長度的正弦波拼接,便可得到「婉轉悠揚」的曲子了。
將上面兩段函數拼接
可聽到兩個不同的音連續發出,其圖像為
看起來so easy,我們只需要將一首樂曲的每個音的音調和時長找出,對應地轉化為特定頻率和長度的正弦波片段,再拼接到一起,就ok啦。
這一點並不難辦,只要稍微懂點簡譜的人就能做到,不懂也沒關係,花個五分鐘基本就能學會。下面有幾點注意事項。
音調頻率
根據樂理中的「十二平均律」,由以下公式可計算中音do re mi fa sol la xi 的頻率,其p值分別為60 62 64 65 67 69 71,相應高音和低音的頻率計算時在中音的p值上分別加減12.
音符時長
依據下表,只需要確定全音符的時長,就可按比例算出二分音符、四分音符、八分音符的時長。不同樂曲節奏快慢不同,所以全音符並無標準時長,本例中全音符時長取為3s.
去除雜音
以上方法製作的音樂,由於相鄰音符間相位不連續而產生高頻分量,聽取時相鄰音符間會有「啪」的雜音。
利用包絡進行修正(這裡用了指數包絡),使不同音符連接處信號的幅度為零。修正後兩個相鄰音符的圖像如下
有了以上工作,最後一步便是將音樂曲譜一一對應成正弦波信號,並完成拼接。本文開頭的音頻是根據以下曲譜在Matlab中製作完成。
本篇攻略完,歡迎廣大讀者來信交流。
書籍推薦
《質化研究必備工具——NVivo10之圖解與應用》
作者:劉世閔


※博士後也是實習生?聊聊博士那些辛酸的事兒
※當漫畫遇上未來簡史:你們這些愚蠢的人類
TAG:學術中國 |
※Matlab對深度學習工具包DeepLearnToolbox的例子實現
※我和Matlab(一)
※windows7下配置caffe+matlab2016 無GPU
※7天掌握數模常用演算法應用與Matlab編程
※matlab的快捷方式與使用技巧
※BP神經網路模型:Matlab
※全面對比 MATLAB、Julia、Python,誰在科學計算中更勝一籌?
※用matlab繪製指數衰減信號及其相關性質
※數學建模演算法應用與Matlab編程
※排序並記錄排序前的索引(類似matlab sort函數)
※MATLAB-Python-Julia速查表
※MathWorks 為 MATLAB 添加新的預測性維護產品
※NVH-CAE工程師:掌握了MATLAB和Python,我還是離不開VBA
※掌握MATLAB基礎,其實並不難!
※MATLAB常用演算法與應用實例分享來襲!
※MATLAB都能用來做什麼?
※人生苦短,不如學學MATLAB
※快速掌握MATLAB應用,從這一步開始
※掌握MATLAB使用技巧,從這一步做起!
※MATLAB演算法與框架資料分享來襲