2021/12/21

ハーフバンド楕円フィルタの実装

 

ハーフバンド楕円フィルタの実装を読む (github.io)

ハーフバンド楕円フィルタは 2 倍のアップサンプリングや 1/2 倍のダウンサンプリングに使える IIR ポリフェイズフィルタの一つです。リンク先の記事では C++ による実装例を掲載しています。

画像はハーフバンド楕円フィルタを使って 0 Hz から 48000 Hz までピッチベンドしたサイン波の信号を 1/2 倍にダウンサンプリングしたテスト結果のスペクトログラムです。

2021/05/04

LFO のテンポシンク

 

LFO のテンポシンクを読む (github.io) 

LFO を滑らかにテンポシンクする方法について調べました。 magnetophon さんによる LFO の同期についての issue が発端となっています。

VST 3 や LV2 プラグインでは、ユーザが指定した同期間隔のほかに、ホストのテンポ (BPM) と再生開始からの経過拍数が取得できます。適当に実装するなら経過拍数を同期間隔で割った余りを使えばいいのですが、使い方によってはポップノイズが出てしまいます。そこで経過拍数の変化を検知して、位相の速度を調整することで滑らかに同期を続ける方法を紹介しています。

画像は LFO の位相が滑らかに新しい同期間隔へと移行する様子を表した図です。

2021/05/09追記: リンク先の記事の C++ 実装のバグを修正。

2021/01/24

ウェーブテーブルのピッチベンド

ウェーブテーブルのピッチベンドを読む (github.io)

Laurent de Soras さんによる The Quest For The Perfect Resampler を参考にして、ウェーブテーブルをピッチベンドしたときにエイリアシングノイズを出さないようにする方法を試しました。 

オクターブごとにウェーブテーブルを用意して、線形補間と2倍のオーバーサンプリングを組み合わせることでエイリアシングノイズは消せました。ただしピッチベンド中にウェーブテーブルが切り替わるとポップノイズが出ます。ポップノイズを抑えたいときは4倍以上にオーバーサンプリングするとよさそうです。

De Soras さんの資料ではミップマップとアップサンプラを組み合わせていますが、フィルタ係数の補間と FIR の畳み込みが重たそうだったので今回は実装していません。

画像の上は今回実装したオーバーサンプリングを行うウェーブテーブルオシレータでのこぎり波を出力したときのスペクトログラムです。下はウェーブテーブルが切り替わるタイミングを示しています。

2021/02/24追記: リンク先の記事を大幅に加筆修正しました。

2021/01/11

ステレオパンニング

ステレオパンニングを読む (github.io)

ステレオ → ステレオパンニングの計算式をいくつか作りました。ステレオ → モノラルパンニングについては Loudness Concepts & Panning Laws を参考にしました。

画像はステレオ → ステレオパンニングのブロック線図です。

2021/01/08

リミッタの実装

リミッタの実装を読む (github.io)

リミッタの実装についてまとめました。「ステップ応答が S 字を描くフィルタ」と「ピークホールドによるエンベロープ」で作った部品を使っています。

今回作ったリミッタは musicdsp.orgLookahead Limiter の記事で紹介されているレシピとほとんど同じです。この記事の翻訳版もあります。レシピにはピークホールドの詳細が書いていなかったので、そこだけ試行錯誤しました。

画像は実装したリミッタの大まかなブロック線図です。

2021/01/06

ダウンサンプリング

ダウンサンプリングを読む (github.io) 

今まで適当にやっていたダウンサンプリングについて調べたことをまとめました。

画像は FIR フィルタのポリフェイズ分解を表したブロック線図です。

ピークホールドによるエンベロープ

 

ピークホールドによるエンベロープを読む (github.io)

リミッタで使うためのピークホールドを使ったエンベロープの実装について調べました。

画像は理想的なピークホールドの出力です。