目的
soxのequalizerのヘルプに書かれている [q|o|h|k] の意味がわからないので、調べてみます。
$ sox --help-effect equalizer sox: SoX v14.4.2 Effect usage: equalizer frequency width[q|o|h|k] gain幅の単位であることは読み取れます。
調査に使ったコード
調査には https://git.code.sf.net/p/sox/code を利用しました。 コミットのハッシュ値は 2f6b3fec2dddfbb869a9f7de3110c9aaa31517c9 (Date: Wed Aug 1 23:45:59 2018 -0400) でした。
結果
hはHz、qはHzの逆数に操作する周波数を掛けた値であることがわかりました。また、oはオクターブっぽく、kはよくわからないこともわかりました。
記載箇所
equalizerは src/biquads.c に記述されています。 オプションの解析部分を追っていくと、
q = width_Q o = width_bw_oct h = width_bw_Hz k = width_bw_kHzであることがわかります。 このファイル内に、これらを使っている箇所があります。
static int start(sox_effect_t * effp)
{
...
if (p->width) switch (p->width_type) {
case width_slope:
alpha = sin(w0)/2 * sqrt((A + 1/A)*(1/p->width - 1) + 2);
break;
case width_Q:
alpha = sin(w0)/(2*p->width);
break;
case width_bw_oct:
alpha = sin(w0)*sinh(log(2.)/2 * p->width * w0/sin(w0));
break;
case width_bw_Hz:
alpha = sin(w0)/(2*p->fc/p->width);
break;
case width_bw_kHz: assert(0); /* Shouldn't get here */
case width_bw_old:
alpha = tan(M_PI * p->width / effp->in_signal.rate);
break;
}
...
width_Qはwidth_bw_Hzとは逆に動いているので、qを大きくすると幅が狭くなるようです。
width_bw_kHzについては、assert(0)では止まらないので、はwidth_bw_old扱いになるようです。
全然kHzではありませんね。
参考までに、pの型はbiquad_tで、定義は、src/biquad.h より、
typedef struct {
double gain; /* For EQ filters */
double fc; /* Centre/corner/cutoff frequency */
double width; /* Filter width; interpreted as per width_type */
width_t width_type;
filter_t filter_type;
double b0, b1, b2; /* Filter coefficients */
double a0, a1, a2; /* Filter coefficients */
sox_sample_t i1, i2; /* Filter memory */
double o1, o2; /* Filter memory */
} biquad_t;
です。