手習ひデジタル信号処理(21) 残響生成器その1、櫛型フィルタ、Scilabで見る

Joseph Halfmoon

今回から残響生成器に入ります。その1回目は要素部品、櫛型フィルタ(comb filter)です。勝手ながら要素部品は Scilab 使って個別に「動かして」みるというスタイルであります。今回は、まずブロック図を描いてインパルス応答の波形を観察。次に例の如くにボード線図も描いてと。大分慣れてきた?

勝手に手習ひさせていただいております教科書へのリンクは以下です。

三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理

上記教科書の「6.2 残響生成器」です。音声にエコーかけたりするアレです。

Scilab XCOSでブロックダイアグラムを描いてシミュレーション

お世話になっております Scilab には、XCOSというグラフィカルにブロック図を描き、シミュレーションをかけるツールが含まれています。ぶっちゃけ、MATLABにおける Simulink みたいなものです。使わせていただいているのに何ですが、「似たようなこと」はできるとはいえ、至れり尽くせりのMATLABとは比べちゃいけない気がします(工科系の学校へ行っていたら無料でMATLABのライセンスが使えたり、安く買えたりする筈なので、折角の状況を生かさない手はないような気がします。個人の感想です。)

今回、櫛型フィルタの原型(実使用では遅延器を「もっと沢山」、多分数百個も並べるべき、らしいですが、教科書の例題どおりに10個としています)のブロックダイアグラムをXCOSで描いてみました(冒頭のアイキャッチ画像。)使い方がイマイチ分かりませぬ。多分、もっと簡単にカッコよく描けるんではないかと思います。おいおい慣れていきたいです。

なお、XCOSの部品パレットをみると、やたら機能的に同じようなブロックがあります。今回使用した遅延器ブロックなどもそう。どうも歴史的な背景があって複数併存しているみたいです。その辺の事情は以下のページを見ると多少は分かります。

Xcos deprecated blocks

ブロックダイアグラムそのものは簡単で、遅延器を並べて信号を遅延させ、係数かけてフィードバックするだけです。遅延器の個数はM、係数はg(<1.0の正の数)です。上のブロックダイアグラムで、インパルス応答の波形の入力の仕方がよく分からなかったので、パルスを発生するブロックのパラメータを操作してシミュレーションの頭で一発だけ有限なパルスが入るように調整して使っています。もっとカッコイイ方法ありそうなんですが。

さて、教科書の図12に「櫛型フィルタ」の「インパルス応答」という図があり、如何にも離散的なグラフが載っています。そのようなグラフを描くべし、ということでシミュレーション実行。

CombFilterImpluseResWave
計算結果そのものは間違ってはいないのですが、XCOSの波形表示ブロックは、連続系に向いているようで、時系列に入ってくるデータを「結んで」しまうみたいです。縦棒の先に丸的な表示にしたかったのだけれども。多分データとして出力させて別にグラフを描かせればいろいろできそうではありますが、メンドイのでXCOSの部品のみで行きたいと思います。

伝達関数から振幅特性(ボーデ線図)を求める

第17回で伝達関数 H(z) からボーデ線図を描く技は取得したので、今回もやってみました。伝達関数そのものは、教科書に書いてあるのでそれをそのまま入力しただけですが。ソースはこんな感じ。

// Comb Filter
clc;
clear();
clf();

g=0.8
M=10
Hz = syslin('d', %z^(-M)/(1-g*%z^(-M)))

bode(Hz, 0.01, 1.0)
xtitle("Comb Filter 正規化周波数 Bode Plot(g=0.8, M=10)")

教科書では、実際の周波数0kHzから5kHz(サンプリング周波数が10kHzなのでその半分)に対して、横軸周波数をリニアにとってプロットされています。

しかし、以下のグラフでは、サンプリング周波数を1Hzと正規化した周波数の0.01Hzから0.5Hz(実際には100Hzから5kHz)の範囲に対して、横軸周波数は対数です。Bode線図を描かせるときに軸をリニアにするようなオプションが無いかとまた見たのですが、見つかりませんでした。

CombFilterBodePlot
計算結果そのものは「よさそう」なので、まあいいか。グラフが描けると理解してなくても「出来た」気だけはするからな~、大丈夫か。

手習ひデジタル信号処理(20) 母音音声合成器その5、合成された音を聞く へ戻る

手習ひデジタル信号処理(22) 残響生成器その2、全域通過フィルタ、Scilabで見る