Arei's blog

開発日誌 10/3


WebSofaサンプルコードが、Coedva+Android環境で問題なく動作した。

/www以下を全部コピーしたらそのまま動いた。素晴らしい。

やっぱりWebGLを直接使うのはやめとこう。

その代わりにThree.jsを利用しようと思う。

C言語ではじめる 音のプログラミング

音声ファイルはいわずもがな、時間で区切られた振幅のデータであることを念頭に。波の表し方には、軸を時間でとるか(時間領域、ある時間の振幅の大きさ)周波数でとるか(周波数領域、ある周波数の強さ)の2つの表し方がある。時間領域 =>周波数領域の変換をフーリエ変換 (FT)その逆を逆フーリエ変換(IFT)が担う。離散の場合はDFT, IDFTで実際にはより高速に計算できる高速フーリエ変換(FFT)が使われる。

ディレイ(やまびこ)のようなもの実現するためにフィルタを利用する。フィルタは、言葉にすればその信号より過去の信号に何かしらの重みつけて足し合わせるもの。この計算を「たたみ込み」いう。y(n)=sigma(m=0 to J) b(m)x(n-m) xは入力、yは出力、nは現時点での時刻の区切り、J回分の過去を参照する。b(m)の数列がフィルタを方向づける。この形のフィルタをFinite Impulse Response 有限インパルス応答フィルタという。

インパルスとは、x(0)=1 x(not 0)=0 な瞬間的な音データで、それをフィルタに入力すると、b(m)がでてくるから。どちらかというと、インパルス応答を計測した結果からフィルタを作れるということ。

なお、y(n)=-sigma(m=0 to I) a(m)y(n-m) + sigma(m=0 to J) b(m)x(n-m) という感じに出力もフィードバックするものをInfinite Impulse Response Filter という。実際は、窓関数という魔法で、うまいこと無限の計算を避けるらしい。

ところで、時間領域のy(n) x(n) b(n) a(n) はフーリエ変換で、 Y(f) X(f) b(f) a(f)と周波数領域に変換できる。これをするとFIRフィルタとIIRフィルタはY(f)=B(f)X(f), Y(f)=-A(f)Y(f) + B(f)X(f) と、ただの乗算で表せる。すごい!出力/入力の比が伝達関数。H(f)の場合が理解しやすい。どの高さの音がどれくらい伝わりやすいのかを表すからだ。

フレーム単位にFIRフィルタを適応するときには、1つ前のフレームを計算に加えること。

ファンファクト: ボーカルキャンセラーというフィルタがある。楽曲はマスタリングの過程で、ボーカルは中央=LR同じ音量、楽器は左右に振って=LR違う音量にする。そこで、LとRの差分を取ることで、ボーカルが消えるという寸法だ。

接触不良をおこした壊れかけのイヤホンが中途半端につながったとき、ボーカルだけ聞こえなくなる現象に見舞われたことがあるだろう。あれはきっと、なんかの拍子にLRが逆位相で混ざって(ここは謎。電子回路わからん)ボーカルキャンセラになったってことだったわけだ!

 


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です