#00 準備・基礎編―MATLAB & Simulinkでオーディオエフェクト


はじめに

高校のプログラミングの授業で自由課題が出され,私はMATLABでオーディオエフェクトを作ることにした.レポートの代わりにQiita記事を提出することが許されたので,ここにまとめることにする.

対象読者

基本的に自分と同じレベルの人が読めることを目標に書いている.具体的には以下の条件を満たす人を対象とする.

  • MATLAB Simulinkを触ったことがない.
  • 音声処理初心者
  • プログラミング自体の経験はある(関数,配列,forループ程度)

注意

本記事ではMATLABコード自体の詳細な説明はしない.MATLABの文法は直観的なので,読めば何となく理解できるはずである.注意すべき文法には言及する.

また,本記事では「オーディオエフェクトを形にする」ことを第一目標とする.したがって効率化などは考慮しない.

開発環境

開発環境は以下の通りである.

  • MATLAB 2020a
  • Simulink 10.1
  • Signal Processing Toolbox 8.4
  • Audio Toolbox 2.2

基本操作

ここでは基本操作を説明する.

Simulinkを開く


MATLABのメニューバーにSimulinkがある.これを押してSimulinkを立ち上げる.

テンプレートを開く


Audio Toolboxの欄にBasic Audio Playerというテンプレートがある.これを開く.

ブロックの追加

テンプレートを開くと以下のような画面が評される.見て分かる通り,左のブロックは音源(入力)を表し,右のブロックはスピーカー(出力)を表す.

メニューバーのライブラリブラウザーから,新たなブロックを追加することができる.試しに,Audio ToolboxSpectrum Analyzerを追加する.検索窓を活用すると素早く見つけることができる.

ライブラリブラウザからドラッグアンドドロップすることで,ブロックを追加できる.ブロックを追加したら,音源とスピーカーをつないでいる矢印上で右クリックし,新たな矢印を伸ばして,それをスペクトラムアナライザに接続する.スペクトラムアナライザはダブルクリックで表示できる.メニューバーにある実行ボタンを押せば音源の再生が開始され,スペクトラムアナライザで音源が可視化される.

基本的なブロック

ここで,基本的なブロックをいくつか挙げておく.

  • Gain:信号の強さを変える
  • Constant:定数を出力する
  • Time Scope:オシロスコープを表示する
  • Spectrum Analyzer:スペクトラムアナライザを表示する

Dashboardブロックによるリアルタイムでのパラメータ調整

モデル内のパラメータをリアルタイムで操作するには,Dashboardブロックが有効である.Dashboardブロックは以下のようなものである.

ここでは,Dashboardブロックを用いてリアルタイムで音量を調節するものを作る.まずは以下のようにブロックを配置する.

次に,Dashboardブロックの一つである,Knobブロックを追加する.

Knobブロック上にマウスカーソルを合わせると,接続ボタンが表示される.これをクリックした後,Gainブロックをクリックし,1秒程度待つと,以下のような画面が現れる.この〇印をクリックし,画面右上の✖印を押せばDashboardと変数との接続が完了する.

パラメータの範囲はブロック パラメータウィンドウで調整できる.これはKnobブロックをダブルクリックして開ける.ブロック パラメータウィンドウでは最大値・最小値の他に,スケールタイプを線形・対数の二つから選ぶこともできる.

Knobブロックは実行時にマウスで操作できる.

MATLAB Function ブロック

Simulinkには豊富なブロックが用意されているが,自分でプログラムを書く必要もいずれ生じる.そのような場合には,MATLAB Function ブロックが有効である.MATLAB Function ブロックでは,MATLABのコードを記述することで自由に処理を行える.ここでは,MATLAB Function ブロックを用いてデシベル単位のGainブロックを作る.

デシベルとは何か

デシベルとは振幅の比を対数を用いて扱いやすくしたものである.デシベル$L$は振幅の比$r$を用いて以下のように表される.
$$
L = 20\,\mbox{log}_{10}r
$$

デシベルから振幅の比を求める.

上記の式を変形し,デシベルの値から振幅の比を求めると,以下のようになる.
$$
r=10^{\frac{L}{20}}
$$

MATLAB Functionブロックで上記の式を再現

デシベルから振幅の比を求める式が得られたので,これを実際にMATLAB Functionブロックで再現する.まずは以下のようにブロックをつなぐ.

次に,MATLAB Functionブロックをダブルクリックしてエディタを開く.初期の状態では以下のようなコードが書かれている.

function y = fcn(u)

y = u;

このコードでは,uが入力で,yが出力である.Gainブロックでは,入力信号とGainの値の二つの引数が必要である.したががってdB値を表す変数Lを追加する.さらに,前述の式でプログラムを書き換える.

function y = fcn(u,L)   %変数L [dB]を追加
    r = 10^(L/20);      %Lを用いて振幅の比を表す
    y = u*r;            %求めた振幅の比を入力信号に乗算し,出力

これを保存すると,以下のように,入力にLが追加されているのが分かる.Lに対して,Conctantブロックから値を送り,Constantブロックの定数をKnobブロックで操作できるようにすると,以下のようなモデルが組める.本記事では,Knobブロックの最小値を-30,最大値を12とする.各ブロックの下の名前を変更するとそれっぽくなる.

これを実行すると以下の動画のように音量を調整できていることが分かる.

終わりに

今回は,MATLAB Simulinkでの音声処理を行うための基礎知識を述べた.次回はDistortionを作成する.

GitHub

以下で完成したオーディオエフェクトを公開している.
https://github.com/qwerty16180339/matlab_audio_effects

参考文献