A14 エコーを作ってみよう

室長:測定にいく前に一回寄り道をするぞ。

助手:なにをするんですか?

室長:エコーを作ってみよう。フィルタの係数が[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5]だとどんな出力になるかな。

助手:最初は1だけなので入力がそのまま出力されます。しばらくゼロがつづいて0.5がくるってことは時間差があって入力を1/2にしたものが元の入力に足されますね。ということは反射が一回あったのと同じですね。反射波をいっぱい作ればそれっぽいエコーを作っていけるということですね。

室長:うむ。本当は反射するたびに高域が減衰するようにしないとリアルにならないがな。試しにこんなデータを作って聴いてみよう。octaveのコマンドラインで

a=zeros(1,32768);
b=1;
n=1;
while(n <= 32768 )
  a(n)=b*b;
  b=b*0.973;
  n=n+int32(1000*b);
endwhile
a=a*db2a(-20);
plot(a);
a=a.';
save -ascii coefftest a;

fig1 助手:tap数32768に合わせてbrutefirの設定ファイルを作って44.1kで再生してみます。

bruteconfig3.txt

float_bits: 64;
filter_length: 32768;

coeff "test1" {
  filename: "./coefftest";
};

input "lin","rin" {
  device: "file" { path: "/dev/stdin"; };
};

output "lout","rout" {
  device: "alsa" { device: "plughw"; };
  dither: true;
};

filter "ltest" {
  from_inputs: "lin";
  to_outputs: "lout";
  coeff: "test1";
};

filter "rtest" {
  from_inputs: "rin";
  to_outputs: "rout";
  coeff: "test1";
};

コマンドラインで

sox test1.wav -t .s16 - | brutefir  bruteconfig3.txt

室長:どうじゃ?

助手:風呂場の中みたいですね。

室長:部屋のインパルスレスポンスを測定してそれをフィルタの係数にすれば人工的に部屋の残響を付け加える事ができるぞ。

2012年12月18日