落胆がらくた街

Dr.Rootはサポート終了製品です。

Split-Radix型大浦FFTの一部をC#に移植した

qiita.com

Qiitaクソ便利だしもうプログラム関連の記事はあっちで書くわ 何がはてなじゃw

~~~

Qiitaでは一切関係ない話題だから書かなかったけど、大浦FFTもFFTWも基本的には「いかに高精度で、次に速く」を原則として作られてる。ので、例えばDTMで使うVSTプラグインみたいな、「まぁ概ねスペクトルの概形が見られればOK」っていうシチュエーション、すなわち「いかに速く軽く、次に高精度で」を原則とした場合まだイジれそうな気がする。

具体的には、FFTはサンプルをN個突っ込んで、サンプルレートの半分を更にNで割った分だけ周波数分解能が得られるわけだが、パラメトリックイコライザなんかでとりあえずローをばっさり切るべーみたいな時に果たして何千という分解能はいるのかという感じ。だから「8192個のサンプルを突っ込むんだけど、求める係数は1つ飛ばし」とかでもいいんじゃね的な。

なんでこんなこと考えてるのかというと、CubaseからStudio Oneに移行したら、Cubaseにあったデフォルト付属のパライコがなくなっちゃったのだ。あのチャンネルストリップに最初から刺さってるやつ。
んでスタ1には一応ProEQって結構高性能なEQが付属しとるんだけど、もっともっと手軽に使えるEQの需要ってあるんじゃないかと思った所。
例えばミックス処理なんかで、大抵のトラックにはローカットを食らわせつつ特定の周波数帯をピークEQでどついたり削ったりするってのがよくある話だと思うんだけど、それやるのにそんな高級なEQいちいち挿したくない。んで探すと意外とフリーでシンプルなパライコ無いんだよな。なんかどれもコレも性能重視というか。性能は雑魚くていいから馬鹿みたいに軽い奴誰か教えてください。

~~~

もいっこ思ったんだけど、FFTというかオーディオのバッファリングでよく使われるのがリングバッファだ。リング状の配列にぐるぐるデータを突っ込んでいく。で、FFTをかけるときは、例えばサイズ8のリングバッファを4つずつFFTかけるみたいな時、最初はa0からa3をFFT、次はa1からa4、次はa2~a5…みたいにちょっとずつずらしながらFFTをかけたい…なんていうのが思いつく。ところが大浦FFTはin-place演算なので、FFTをかけたら元のデータは無くなってしまう。ましてやこの「ずらしながら法」の場合、ハミング窓も一緒になってずれていくので、こうなると一々FFTをかけたい部分だけリングバッファからコピーしないといけない計算になる。こりゃー無駄だ。

っていうのを何とかしたかったんだけど、素のFFTアルゴリズムを自前で書いてリングバッファと窓関数を対応させたやつよりも、一々バッファをコピーしてから大浦FFTかけるほうが速度出たからもう寝るわw