サンプリング周波数変換

サンプリング周波数変換(サンプリングしゅうはすうへんかん、: sampling-frequency conversion)または標本化周波数変換(ひょうほんかしゅうはすうへんかん)は、サンプリングされた信号に対するリサンプリングの1つで、あるサンプリング周波数でサンプリングされた信号を別のサンプリング周波数でサンプリングされた信号に変換する処理である。通常はデジタル信号間の変換だが、サンプリングされていればアナログ信号でもかまわない。

サンプリングレート変換(サンプリングレートへんかん、: sampling-rate conversion)などともいう。単にレート変換(レートへんかん、: rate conversion)ということもあるが、これはビットレート変換と紛らわしい。

サンプリング周波数を上げる変換をアップサンプリング (upsampling)、下げる変換をダウンサンプリング (downsampling) という。ただしこれらの語は、後述のとおり、サンプリング周波数変換の構成要素を指すこともある。

用途

  • サンプリング周波数が異なる音声規格間の変換
  • オーバーサンプリング(A/DD/A変換を直接せずに、高サンプリング周波数の信号をはさむこと)
  • スーパーサンプリング(信号の加工を高サンプリング周波数でおこなうこと)
  • データサイズの節約

基本原理

サンプリング周波数 f 1 {\displaystyle f_{1}} から f 2 {\displaystyle f_{2}} への変換を考える。

変換前の、サンプリング周波数 f 1 {\displaystyle f_{1}} でサンプリングされた信号の波形は、時間領域で見ると、サンプリング間隔 1 / f 1 {\displaystyle 1/f_{1}} で並んだΔ関数(実際上はパルス)の連なりである。周波数領域で見ると、周波数 f 1 / 2 {\displaystyle f_{1}/2} 以上の帯域では本来の成分は失われ、代わりに偽信号(エイリアス)が現れている。

サンプリング周波数変換では、サンプリング周波数を整数倍に上げる補間またはインタポレーション (interpolation) と、整数分の1に下げる間引きまたはデシメーション (decimation) が、基本的な構成要素となる。

整数倍の上方サンプリング変換 (Upsampling by an integer factor)

変換前のサンプリング周波数が f 1 {\displaystyle f_{1}} 、変換後のサンプリング周波数が f 2 {\displaystyle f_{2}} で、 f 1 {\displaystyle f_{1}} < f 2 {\displaystyle f_{2}} 、かつ、 f 2 {\displaystyle f_{2}} f 1 {\displaystyle f_{1}} の整数倍の時、 サンプリング周波数 f 2 {\displaystyle f_{2}} でサンプリングし直すには、数学的な概念としては、以下の二段階の処理を行うと考える事が出来る。

  1. 拡張 (expansion, 0を追加する)
  2. f 1 / 2 {\displaystyle f_{1}/2} 遮断周波数とするローパスフィルタに通す (補完, Interporation, 0の部分を置き換えることになる)

まず、第一段階として、変換前の各サンプルの後に f 2 / f 1 1 {\displaystyle f_{2}/f_{1}-1} 個の0を追加する。この処理を拡張 (expansion) という[要検証 – ノート]

しかし、拡張しただけでは、波形はギザギザのままである。これは折り返しノイズを拾っているということである。そこで、第二段階として、アンチエイリアシングとして、拡張後に、変換前のナイキスト周波数 f 1 / 2 {\displaystyle f_{1}/2} 遮断周波数とする低域通過フィルタ (LPF) に通す。この処理を補完 (interpolation) と呼び、使用したLPFを補間フィルタ (インタポレーションフィルタ) という。

なお、この処理を補間と呼ぶ理由は、結果として、元のサンプルの間の値を求めているからである。

整数分の1の下方サンプリング変換 (Downsampling by an integer factor)

逆に、変換前のサンプリング周波数が f 1 {\displaystyle f_{1}} 、変換後のサンプリング周波数が f 2 {\displaystyle f_{2}} で、 f 1 {\displaystyle f_{1}} > f 2 {\displaystyle f_{2}} 、かつ、 f 2 {\displaystyle f_{2}} f 1 {\displaystyle f_{1}} の「整数分の1」の時、 サンプリング周波数 f 2 {\displaystyle f_{2}} でサンプリングし直すことは、変換前のサンプルを1個取り出すごとにその後の f 2 / f 1 1 {\displaystyle f_{2}/f_{1}-1} 個は捨てるということである。この処理を間引き (decimation) という。

ただし、間引きしただけでは、折り返しひずみが発生してしまう。これは通常のサンプリングで発生するのと同じ問題なので、通常のアンチエイリアシングどおり、間引き前に、変換後のナイキスト周波数 f 2 / 2 {\displaystyle f_{2}/2} 遮断周波数とするLPFに通す。このLPFを間引きフィルタまたはデシメーションフィルタという。

以上を振り返ってみると、以下の二段階の処理を行っていたと考える事が出来る。

  1. f 2 / 2 {\displaystyle f_{2}/2} 遮断周波数とするローパスフィルタに通す
  2. 間引く

一般のサンプリング周波数変換

変換が整数倍でも整数分の1でもないときは、 f 1 {\displaystyle f_{1}} f 2 {\displaystyle f_{2}} 最小公倍数 f w o r k = L C M ( f 1 , f 2 ) {\displaystyle f_{\mathrm {work} }=\mathrm {LCM} (f_{1},f_{2})} を中間段階のサンプリング周波数とする。つまり、まずサンプリング周波数 f 1 {\displaystyle f_{1}} f w o r k {\displaystyle f_{\mathrm {work} }} で補間し、次に f w o r k {\displaystyle f_{\mathrm {work} }} f 2 {\displaystyle f_{2}} に間引きする。

ただしこれでは、信号を補間フィルタと間引きフィルタに連続して通すことになるが、両方とも実態はLPFなので計算量の無駄である。実際は、遮断周波数が低いほう、つまり、低い方のナイキスト周波数 min ( f 1 , f 2 ) / 2 {\displaystyle \min(f_{1},f_{2})/2} を遮断周波数とするLPFに1回だけ通せばいい。

f 1 {\displaystyle f_{1}} f 2 {\displaystyle f_{2}} が簡単な整数比であるときは、これでうまくいく。しかし、たとえばデジタルオーディオにて需要が多い 44.1 kHz 系と 32 kHz 系間の変換では、最小公倍数が巨大な値(44.1 kHz と 32 kHz では 14.112 MHz、44.1 kHz と 48 kHz では 7.056 MHz)になるため、計算量を省略するテクニックが使われる。

高速フーリエ変換法

高速フーリエ変換法では、サンプル数 N {\displaystyle N} の原信号に対して高速フーリエ変換と逆変換を行うことで、サンプリング周波数の変換を行う。

この方法では、まず原信号のサンプル列 x {\displaystyle {\boldsymbol {x}}} の高速フーリエ変換によって、周波数領域における N {\displaystyle N} 個のデータ点 F {\displaystyle {\boldsymbol {F}}} を得る。 変換先のサンプル数を M {\displaystyle M} とし、アップサンプリングを行う場合は、 F {\displaystyle {\boldsymbol {F}}} の左右の端 (周波数最大部分) に長さ M N {\displaystyle M-N} 0 {\displaystyle {\boldsymbol {0}}} を挿入し、 F {\displaystyle {\boldsymbol {F}}} のサイズを M {\displaystyle M} にまで拡張する。一方ダウンサンプリングを行う場合は、 F {\displaystyle {\boldsymbol {F}}} の左右の端 (周波数最大部分) から N M {\displaystyle N-M} 個のデータ点を削除する。 結果として得られた長さ M {\displaystyle M} のデータ点に対して高速逆フーリエ変換をすれば、サンプル数を M {\displaystyle M} に変換できる。

畳み込み積分を使った方法

フーリエ変換で、2つの関数f(t), g(t) の積 f(t)g(t) をフーリエ変換すると、結果は、F(w), G(w)の畳み込み積分になる性質がある。

F ( w ) = F [ f ] {\displaystyle F(w)={\mathcal {F}}\left[f\right]}
G ( w ) = F [ g ] {\displaystyle G(w)={\mathcal {F}}\left[g\right]}
F [ f g ] = ( F G ) ( w ) {\displaystyle {\mathcal {F}}\left[f\cdot g\right]=(F*G)(w)}

但し、 F [ f ] {\displaystyle {\mathcal {F}}\left[f\right]} の [] 記号は、汎関数を表している。

ここで、連続関数に対する畳み込み積分の定義は、

( f g ) ( t ) = f ( t )   g ( t t ) d t {\displaystyle (f*g)(t)=\int f(t')\ g(t-t')\,dt'}
( F G ) ( w ) = F ( w )   G ( w w ) d w {\displaystyle (F*G)(w)=\int F(w')\ G(w-w')\,dw'}

離散的な場合の畳み込み積分の定義は、

( f g ) [ m ] = n f [ n ] g [ m n ] {\displaystyle (f*g)[m]=\sum _{n}{f[n]\,g[m-n]}}

ただし、上式の [] 記号は、離散的な関数の整数値引数を表している。

対称性により、逆に、F(w), G(w)の積 F(w)G(w) を逆フーリエ変換すると、結果は、f(t), g(t)の畳み込み積分になる:

F 1 [ F G ] = ( f g ) ( t ) {\displaystyle {\mathcal {F}}^{-1}\left[F\cdot G\right]=(f*g)(t)}

この性質を利用すれば、f(t), g(t)の畳み込み積分で一気にサンプリングレート変換を行うことが可能である。 この場合、f(t)を変換前のPCM波形とすれば、F(w)は、音声のスペクトラムに相当するようなフーリエ変換となる。 F(w)の高周波成分をカットするため、G(w)をLPFに相当する関数とする。 理想的なLPFとしては、G(w)を「矩形関数(Rectangular function)」とする方法が有るが、G(w)が矩形関数の時、g(t)は、sinc 関数になるので、LPFを通した後のPCM波形は、f(t)とsinc関数g(t)の畳み込み積分となる。

矩形関数(Rectangular function) G(w) :

G ( w ) = { 1 , | w | < b 0 , | w | > b {\displaystyle G(w)={\begin{cases}1,&|w|<b\\0,&|w|>b\end{cases}}}

g ( t ) = 1 2 π G ( w )   e i w t d w = 1 2 π i t 2 i sin ( b t ) = 2 π sin ( b t ) t {\displaystyle g(t)={\frac {1}{\sqrt {2\pi }}}\int _{-\infty }^{\infty }G(w)\ e^{iwt}dw={\frac {1}{{\sqrt {2\pi }}it}}2i\sin(bt)={\sqrt {\frac {2}{\pi }}}{\frac {\sin(bt)}{t}}}

考え方としては、f(t)は、f[n]のような離散的で飛び飛びの場所しかデータがないが、sinc 関数であるところの g(t)は連続関数なので、あらゆる時刻 t の関数値を読み出すことが出来る。だから、f[n]とg(t)の畳み込み積分で、f[n]には存在していない場所のデータまで補完したかのようにデータを読み出すことが出来るようになる。それを利用すれば、上方サンプリング変換でも、下方サンプリング変換でも同様の考え方で処理できる。

ビットマップ画像

ビットマップ画像など2次元データ(および3次元以上のデータ)に対してサンプリング周波数変換をするには、各次元に対し順次、1次元のサンプリング周波数変換を施せばいい。ただし音声信号と違い、LPFは対称でなければならない。

ビットマップ画像をdpiを保ったままサンプリング周波数変換すると、画像は拡大・縮小される。