EQ(イコライザー) Nyquistで自作

SM57,58を補正するためにEQは必須

マイクをSM57,SM58にしたら、中低域盛り上がりの不自然な音になってしまった。単一指向性ダイナミックマイクなのでマイクと音源の距離で周波数特性が変化する。近づくと200Hzを頂点にガンガンと盛り上がる近接効果がある。本来低域ほど盛り上がるのだが、SM57,58の低音は意図的にカットされているため200Hzがピークになるようだ。

下図はSHURE BETA58Aの周波数特性だが、近接効果によってどれぐらい低域が盛り上がるかが分かる。SM58の近接効果の資料が見つからなかったのでBETA58Aを参考にしている。たぶん似たようなもんだと思う。

高域においては、下図のように10kHz以上の高域ががくんと落ちている。これも補正しないと不自然なこもった音になってしまう。

ちなみに下はSM57の周波数特性。SM58とはかなり違う。高域はかなり上まで出ている。低域の落ち方はSM58よりもシャープで、近接効果の出方も違っているように感じた。音も締まった印象がある。当然補正も違ってくる。

マイクと音源の距離を調整することで、ある程度の自然な感じにはできるものの、そもそもフラットな特性にはならない。そこでEQ(イコライザー)が必要になってくる。

Audacity Equalization
Audacityをインストールすると標準で入っているEQを試してみる。Audacityの標準エフェクトはVSTに比べ高速に処理ができる。しかし高機能でグラフィカルで今風だが好みじゃなかった。カーブをいじるというのは細かく補正ができる反面、手軽さはない。調整に時間ばかりかかってしまう。再現も難しいし。やたらと設定ファイルを保存するというのも・・・ でも性能はFIRタイプでかなりよいです。

えい自作してしまえ

デジタルフィルターの勉強とフーリエ変換をおさらいしてJavaで作ろうかと思ったけど、もっとお手軽なNyquistというものがAudacityでは扱えたので、これを試してみた。

AudacityのプラグインとしてはVSTとNyquistが使える。VSTはDTMの世界では標準的だが、Nyquistはほとんど知られていない音声処理の言語。AudacityはNyquistも一部利用して作られているので親和性は高い。逆にVSTは問題ばかり。とにかく処理スピードが遅すぎ。AudacityならやっぱりNyquistでしょ。

Nyquistはスクリプト言語
メモ帳でスクリプトをLisp言語で書くだけで利用できる。簡単なものなら素人でも作れてしまう。お手軽プログラミング。でも中身は強力。やる気になればいろいろ出来そうだ。マニュアル(英語)はここ。
http://www.audacity-forum.de/download/edgar/nyquist/nyquist-doc/manual/home.html

今回Lispの勉強と、マニュアルを少し読む程度で、内部の関数を呼び出す程度の簡単なプログラムは実現できた。さらに、突っ込んでいろいろ作ろうかと思ったが、マニュアルだけでは意味不明だったり、うまく動かなかったりした。どうも細かなことをしようとするとJavaよりも大変だということが判明・・・もうやめた。そもそもLispの括弧地獄がどうも・・・ 必要なEQだけ作って終わり。結果として内部関数を呼び出すだけだったのでスクリプトはあっという間に完成。マニュアル読んだ意味がほとんどないという結果に・・・

EQの性能はかなりよさそう。波形の合成分解で実験するとかなりの精度で元通りになる。あとAudacityだからVSTに比べて圧倒的に処理スピードが速い。音が遅れることもない。Nyquistのマニュアルを見るとbiquadの2次のIIRフィルタのようなので、位相の問題は出そうだが、極端な設定でも気になるようなことはない。

スクリプト
メモ帳で以下の内容を書いて、ファイル名を「namagi_eq.ny」にして保存。このファイルをAudacityのフォルダ内のPlug-Insに入れるだけで利用できる。

;nyquist plug-in
;version 1
;type process
;name "NAMAGI EQ SM58"
;action "Performing NAMAGI EQ SM58..."
;info "for SM58 by NAMAGI PRODUCTS"

;control gainHi "GAIN HI" real "dB" 0.0 0 15.0
;control hzHi "FREQ HI" real "Hz" 13000.0 10000.0 20000.0 
;control widthHi "Q HI" real "Octaves" 1.8 0.1 3.0 

;control gainLo "GAIN LO" real "dB" -2.0 -12.0 0
;control hzLo "FREQ LO" real "Hz" 200.0 20.0 500.0 
;control widthLo "Q LO" real "Octaves" 1.8 0.1 3.0 

(eq-band 
(eq-band 
s 
hzLo gainLo widthLo)
hzHi gainHi widthHi)

Audacityを起動してEffectから上記を実行すると以下のGUIが表示される。スライドバーも利用できるようになる。お手軽だ。

いろいろ考えてシンプルに2バンドのパラメトリックイコライザーとなった。SM58の近接効果で盛り上がった200Hzを下げることと、10kHz以上の高域がガクンと下がっているので、それを上げるのが役目。マイクとの距離に応じて調整すればフラットな印象になる。

高域をブーストすると、わざとらしさが若干出るので、高域の抜けの悪さはSM58の性能とあきらめて、200Hzを若干下げる程度でおしまいにしている。設定は上画像のような控えめなもの。Qは広めの1.8にしている。こうすることで1kHz以下をなだらかなカーブで調整できるようになる。

フラットの基準
フラットの判断は難しい。測定とか大げさなことも面倒なので、SHUREの資料を参考にしつつ、エレクトレットコンデンサマイクのWM-61Aで録音した音と比較しながらフラットを推定。WM-61Aは下の資料の通り限りなくフラットだし、無指向性なので、周波数特性は素直だと思えたからだ。聴き比べながら、同じような周波数特性と思えたところをフラットと仮定している。かなりアバウト。

今回のスクリプトは拍子抜けするぐらい簡単でつまらなかったので、せっかく勉強したデジタルフィルターやらフーリエ変換などを駆使してオリジナルEQをJavaで作るかもしれない。かなり変わったアルゴリズムも思いついたので実験してみようかな。処理としてはタップ数かなり多目のリアルタイム処理しないFIRかな。音処理ってリアルタイムを放棄したとたんに、理想的な処理に近づくと思う。まだ勉強中なので断定はできないが。

sound programming 目次