前回Vocoderのフィルタを生成するところまでやって、しばらく放置していましたが、さすがに尻切れトンボで終わるのも不甲斐ないので重い腰を上げて更新。
#Envelope Filter
Envelopeとは包絡線のこと。音は粗密波なので、AD変換して電圧値になると+と―の値を繰り返す信号になっているが、Envelopeは元の信号を包み込むような、基本的に正の値の信号。これを楽器音の振幅値として使うことで、音程/ピッチは楽器音だけど、トーンは声音となる。前のページでOctave Filterを作ったのは、このEnvelopeを帯域ごとに切り分けてかけるため。
帯域ごと(ここでは9帯域)に並列にかけるため、1個のEnvelope Filterの回路規模は9倍になって結果に跳ね返ってくる。回路規模はあまり大きくなりすぎないよう注意して設計する。
いくつか試して見ました。
IIR Filterを使ったもの:性能的には問題無いが、IIRフィルタは固定小数点化が面倒だし、発振の可能性あるし色々面倒。
FIR DecimationとFIR Filterの組み合わせ:FIRはIIRに比べて次数が高くなり(回路規模が心配・・・)がちなので、一旦係数無しのFIR Decimationで高域を落としておいて、その後20次のFIR Filterを使った。こうすることで、FIR FilterのTap数(≒FPGA回路リソース)をだいぶ減らせた。安定していて回路リソースも少なく済むのでこれに決定。
シミュレーション結果
図の説明:
上側:FIR Filter 下側:IIR Filter 青:音声信号、黄:Envelope信号
入力した音声信号に対して、Envelopeが取れていることがわかる。
波形を見るときちんと動作しているが、エフェクターの場合この後、官能評価してパラメータの細かいチューニングは必要。Envelope Filterのフィルタ係数の調整は後でまた行う。
その3はこのEnvelope Filterと前回設計したOctave Filterを組み合わせてVocoder全体を作成します。