Perfumeボイスを高位合成/HDLコード生成でZynq実装!その3


Octave FilterとEnvelope Filterの統合

前回設計した帯域分割用のOctave Filterと、包絡線を取るEnvelope Filterを統合して、いよいよVocoderとして動作する状態にする。

シンセサイザー音

シンセサイザー音と声音を掛け合わせるので、Simulinkでシンセ音を作成する。
とりあえず、昔のFMシンセみたいな音で良いので、Audio ToolboxのWave Synthesizerブロックを使って、鋸波(-1から+1までインクリメントを繰り返すだけ)を生成する。このブロックはピアノの音とかでもMATLABに波形データを取り込めば、指定したピッチで出力してくれるので面白い。
なお、このブロックはFPGA実装できないので、後で変更する必要がある。

このブロックをドレミファソラシドの8音用意して、和音を鳴らせるようにして、それぞれのOn/Offスイッチを付けたモデルがこれ。MATLAB/Simulinkはこういったベクターデータを使った処理でも、モデルは1個だけ作ればいいのでとても簡単。

440Hzの基準音であるA3音を鳴らして周波数を確認。

ちなみにドレミファソラシド各音の周波数はこの式で求められる。

Pitch = [60, 62, 64, 65, 67, 69, 71, 72];   % MIDI Note No.
waveFreq = 440*(2.^((Pitch-69)/12))';

鋸波はいい具合に高調波が乗っているのでこれがシンセ音としては良い。

こちらはいわゆるドミソのCコード(C言語じゃなくて和音のC)の時間軸応答とスペクトル。

全コンポーネントの統合

これまで作成したコンポーネントを1つのモデルに統合する。
コンポーネント単位では期待した動作をしていたが、統合してシミュレーションすることで、問題が出てくることもあるので、このモデルでのシミュレーションはとても重要。また、このモデルで初めてVocoderとしての官能評価(ちゃんと音で聴いて評価)も可能になる。また、アルゴリズム自体の統合検証を主目的にしているので、まだ固定小数点化したりHDLコード生成できるようにはなっていない。

トップ階層には、音声データの入出力、シンセ音のOn/Offスイッチなどを配した。

実装対象であるサブシステムの処理内容:Octave Filterを音声データとシンセ音にかける(9ch出力)⇒音声データ側のOctave Filterの出力をEnvelope Filterにそれぞれ9ch分かける⇒Envelope Filterの出力をシンセ音のOctave Filter出力に9chそれぞれ掛ける⇒9chデータをMix(加算)⇒音量調整して終わり。

A3音と音声データを入力にしてVocoderをかけてみると、下図のようにVocoder音は綺麗に440Hzとその倍音という構成のスペクトルになった。
上段の水色波形は音声入力の時間軸とスペクトル、下段赤色波形はVocoder出力の時間軸応答とスペクトル

その4に続く。次回はいよいよ実装かな。