波形のピッチを変えるフィルタのアイデア
内容
音の発生時間をほとんど変えずにピッチだけ変更する。フィルタ作成のアイデア
解説
入力から出力までの大まかな流れを以下のように考える。
- 音源
- >窓関数(サイズ=2048*補正値, 移動量)
- >ピッチ変更処理
- >Blackman関数
- >逆窓関数(サイズ=2048, 移動量)
- >出力
窓関数
まず人の聴覚のおおよそ20~20kHzぐらいの音が聞こえるらしい。
そのため大体20Hz以下のデータを加工し、Blackman関数を通してから合成すれば、あまりノイズが気にならない…多分。
音声データはおおよそ44.1kHz or 48kHzなので2000サンプルぐらい取ればギリギリ20Hzぐらいにはなる。
なので出力はそれぐらいのサイズを目指す。
入力サイズはそれに補正を加える。具体的には以下の値を掛ける。
再生速度=2 * (音程の変更量 / 12)
移動量は適当に決める。大きいとうなりのような音がすることがある。
ピッチ変更処理
時間方向に1/再生速度に縮めるだけ。
Blackman関数
そのままBlackman関数を掛ける
逆窓関数
窓関数で分割したデータを結合する
内部に十分なメモリを持っておいて、データを受け取り合算し移動量だけシフトをひたすら繰り返す。
はみ出した部分が合成終了したデータなので、それを使う。
その他
実際にはピッチの変更処理時のサンプルの初期位置の補正などいろいろ工夫がいる
宣伝
音をいろいろ弄れる感じのやつをちびちび作ってます。
github.com