目的
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;
です。
