Interface 2013/11から連載が始まった「実験で入門!音声合成のメカニズム」をSageを使ってお復習いしていきます。
この説明は、私のブログの lbed/LM4F120 Launchpadで音声合成 と連携しています。 こちらも参考にしてください。
フーリエ級数は、周期的に繰り返される信号をSinとCosで表現したものです。
基本周期$T_0$として、周期信号を式で表すと次のようになります。 $$ f(t) = a_0 + \sum_{k=1}^\infty \left( a_k cos \frac{2 \pi k}{T_0} t + b_k sin \frac{2 \pi k}{T_0} t \right) $$
Interface 2013/11号では、以下の様な三角波を例題としています。この波形はY軸対称(偶関数)なので、求めるフーリエ係数の$b_k$が0となります。
Sageで三角波を表現する場合には、区分関数(Piecewse)を使用します。 三角波では、区間を-0.5から0と0から0.5の2つに分け、それぞれf1, f2で関数を定義します。
|
基本周期$T_0$とするとフーリエ係数は、以下の様に求めることができます。 $$ \left\{ \begin{eqnarray} a_0 & = & \frac{1}{T_0} \int_{-T_0/2}^{T_0/2} f(t) dt \\ a_k & = & \frac{2}{T_0} \int_{-T_0/2}^{T_0/2} f(t) cos \frac{2 \pi k}{T_0} t dt, k = 1, 2, ... \\ b_k & = & \frac{2}{T_0} \int_{-T_0/2}^{T_0/2} f(t) sin \frac{2 \pi k}{T_0} t dt, k = 1, 2, ... \end{eqnarray} \right. $$
さっそく、数式処理システムのSageを使って三角波のフーリエ級数を求めてみましょう。 残念ながらPiecewiseの関数に直接sin, cosを掛けることができないので、 sin, cosを掛けた区間関数を定義して、それを積分することにします。
以下がSageでの処理です。最後に$a_0, a_1, a_2, a_3, b_1$を出力しています。
この結果は、Interface 2013/11号の式(4)と同じ結果になっているのが確認できました。
$$ \left\{ \begin{aligned} a_k & = & \left \{ \begin{aligned} 0, & k: 偶数 \\ \frac{8}{(k \pi)^2}, & k: 奇数 \\ \end{aligned} \right. \\ b_k & = & 0, k: すべての整数 \end{aligned} \right. $$
0 8/pi^2 0 8/9/pi^2 0 0 8/pi^2 0 8/9/pi^2 0 |
求めた$a_k$を使ってkの値を1, 5, 19と変えた結果をプロットしてみます。
|
Piecewiseには、フーリエ級数を計算する機能が備わっています。 先のfkに相当する関数がfourier_series_partial_sumです。
fourier_series_partial_sumの使い方は、以下の様に使います。
g.fourier_series_partial_sum(N, L)ここで、Nは計算する次数、Lは区間の長さL(区間は、-LからLです)で、fourier_series_partial_sumの返す値は、以下の式で表されます。 $$ f(x) \sim \frac{a_0}{2} + \sum_{n=1}^N [a_n\cos(\frac{n\pi x}{L}) + b_n\sin(\frac{n\pi x}{L})] $$
それでは、同じ問題をfourier_series_partial_sumで計算してみましょう。
|
|
計算結果をプロットしてみます。N=100とするとほとんど三角波になっています。
|
Sageでフーリエ級数から波形を合成し、音として再生するために、scikits.audiolabをインポートします。
|
最初に「ア」のオリジナル波形をプロットします。
|
フーリエ係数から波形を合成関数synthesisは、ほとんどCのsynthesisの実装と同じです。
|
Interface 2013/11に出ている「ア」のフーリエ係数を使ってMAXの15次まで計算して合成した波形をプロットします。 オリジナルと遜色のないレベルまで再現できているのが分かります。
|
Sageのインタラクティブモードを使って次数を変えて「ア」を合成してみましょう。
Click to the left again to hide and once more to show the dynamic interactive window |
「ア」の波形を上手く合成できているのが、確認できましたので音として再生してみましょう。 ここでは、PySoundFileを使って8KHzの1チャンネルwavファイル形式で保存し、 それをブラウザーの機能を使って再生します。
合成された「ア」は少し短すぎるので、5回繰り返した波形sourcesを使います。
|
合成波形をwav形式で保存する関数として、recordSoundを定義します。 以降、この関数を使って合成波形を再生することにします。
|
録音結果をクリックすると合成した波形が音として再生されます。ブラウザーによっては、 自動的に再生できないもののありますので、その時には右クリックでファイルをダウンロードしてから再生してください。
|