サンプリング周波数変換のソースを表示
←
サンプリング周波数変換
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{出典の明記|date=2023年1月8日 (日) 04:10 (UTC)}} '''サンプリング周波数変換'''(サンプリングしゅうはすうへんかん、{{Lang-en-short|sampling-frequency conversion}})または'''標本化周波数変換'''(ひょうほんかしゅうはすうへんかん)は、[[標本化|サンプリング]]された信号に対する[[リサンプリング]]の1つで、ある[[サンプリング周波数]]でサンプリングされた信号を別のサンプリング周波数でサンプリングされた信号に変換する処理である。通常は[[デジタル]]信号間の変換だが、サンプリングされていれば[[アナログ]]信号でもかまわない。 '''サンプリングレート変換'''(サンプリングレートへんかん、{{Lang-en-short|sampling-rate conversion}})などともいう。単に'''レート変換'''(レートへんかん、{{Lang-en-short|rate conversion}})ということもあるが、これは[[ビットレート]]変換と紛らわしい。 サンプリング周波数を上げる変換を'''アップサンプリング''' (upsampling)、下げる変換を'''ダウンサンプリング''' (downsampling) という。ただしこれらの語は、後述のとおり、サンプリング周波数変換の構成要素を指すこともある。 ==用途== *サンプリング周波数が異なる音声規格間の変換 *[[オーバーサンプリング]]([[アナログ-デジタル変換回路|A/D]]、[[デジタル-アナログ変換回路|D/A変換]]を直接せずに、高サンプリング周波数の信号をはさむこと) *[[スーパーサンプリング]](信号の加工を高サンプリング周波数でおこなうこと) *データサイズの節約 ==基本原理== サンプリング周波数 <math>f_1</math> から <math>f_2</math> への変換を考える。 変換前の、サンプリング周波数 <math>f_1</math> でサンプリングされた信号の波形は、[[時間領域]]で見ると、サンプリング間隔 <math>1 / f_1</math> で並んだ[[Δ関数]](実際上は[[パルス]])の連なりである。[[周波数領域]]で見ると、周波数 <math>f_1 / 2</math> 以上の帯域では本来の成分は失われ、代わりに[[折り返し雑音|偽信号]](エイリアス)が現れている。 サンプリング周波数変換では、サンプリング周波数を[[整数]]倍に上げる[[補間]]または'''インタポレーション''' (interpolation) と、整数分の1に下げる'''間引き'''または'''デシメーション''' (decimation) が、基本的な構成要素となる。 ===整数倍の上方サンプリング変換 (Upsampling by an integer factor)=== 変換前のサンプリング周波数が<math>f_1</math>、変換後のサンプリング周波数が<math>f_2</math>で、 <math>f_1</math> < <math>f_2</math>、かつ、<math>f_2</math> が <math>f_1</math> の整数倍の時、 サンプリング周波数 <math>f_2</math> でサンプリングし直すには、数学的な概念としては、以下の二段階の処理を行うと考える事が出来る。 # 拡張 (expansion, 0を追加する) # <math>f_1 / 2</math> を[[遮断周波数]]とするローパスフィルタに通す (補完, Interporation, 0の部分を置き換えることになる) まず、第一段階として、変換前の各サンプルの後に <math>f_2 / f_1 - 1</math> 個の{{要検証範囲|0を追加する。この処理を'''拡張 (expansion)''' という|date=2016年9月}}。 しかし、拡張しただけでは、波形はギザギザのままである。これは折り返しノイズを拾っているということである。そこで、第二段階として、[[アンチエイリアシング]]として、拡張後に、変換前の[[ナイキスト周波数]] <math>f_1 / 2</math> を[[遮断周波数]]とする[[ローパスフィルタ|低域通過フィルタ]] (LPF) に通す。この処理を補完 (interpolation) と呼び、使用したLPFを補間フィルタ (インタポレーションフィルタ) という。 なお、この処理を補間と呼ぶ理由は、結果として、元のサンプルの間の値を求めているからである。 ===整数分の1の下方サンプリング変換 (Downsampling by an integer factor)=== 逆に、変換前のサンプリング周波数が<math>f_1</math>、変換後のサンプリング周波数が<math>f_2</math>で、 <math>f_1</math> > <math>f_2</math>、かつ、<math>f_2</math> が <math>f_1</math> の「整数分の1」の時、 サンプリング周波数 <math>f_2</math> でサンプリングし直すことは、変換前のサンプルを1個取り出すごとにその後の <math>f_2 / f_1 - 1</math> 個は捨てるということである。この処理を'''間引き (decimation)''' という。 ただし、間引きしただけでは、折り返しひずみが発生してしまう。これは通常のサンプリングで発生するのと同じ問題なので、通常のアンチエイリアシングどおり、間引き前に、変換後のナイキスト周波数 <math>f_2 / 2</math> を[[遮断周波数]]とするLPFに通す。このLPFを間引きフィルタまたはデシメーションフィルタという。 以上を振り返ってみると、以下の二段階の処理を行っていたと考える事が出来る。 # <math>f_2 / 2</math> を[[遮断周波数]]とする[[ローパスフィルタ]]に通す # 間引く === 一般のサンプリング周波数変換 === 変換が整数倍でも整数分の1でもないときは、<math>f_1</math> と <math>f_2</math> の[[最小公倍数]] <math>f_\mathrm{work} = \mathrm{LCM}(f_1, f_2) </math> を中間段階のサンプリング周波数とする。つまり、まずサンプリング周波数 <math>f_1</math> を <math>f_\mathrm{work}</math> で補間し、次に <math>f_\mathrm{work}</math> を <math>f_2</math> に間引きする。 ただしこれでは、信号を補間フィルタと間引きフィルタに連続して通すことになるが、両方とも実態はLPFなので計算量の無駄である。実際は、遮断周波数が低いほう、つまり、低い方のナイキスト周波数 <math>\min(f_1, f_2) / 2</math> を遮断周波数とするLPFに1回だけ通せばいい。 <math>f_1</math> と <math>f_2</math> が簡単な[[整数比]]であるときは、これでうまくいく。しかし、たとえば[[デジタルオーディオ]]にて需要が多い 44.1 kHz 系と 32 kHz 系間の変換では、最小公倍数が巨大な値(44.1 kHz と 32 kHz では 14.112 MHz、44.1 kHz と 48 kHz では 7.056 MHz)になるため、計算量を省略するテクニックが使われる。 == 高速フーリエ変換法 == 高速フーリエ変換法では、サンプル数 <math>N</math> の原信号に対して[[高速フーリエ変換]]と逆変換を行うことで、サンプリング周波数の変換を行う。 この方法では、まず原信号のサンプル列 <math>\boldsymbol{x}</math> の高速フーリエ変換によって、周波数領域における <math>N</math> 個のデータ点 <math>\boldsymbol{F}</math> を得る。 変換先のサンプル数を <math>M</math> とし、アップサンプリングを行う場合は、<math>\boldsymbol{F}</math> の左右の端 (周波数最大部分) に長さ <math>M-N</math> の <math>\boldsymbol{0}</math> を挿入し、<math>\boldsymbol{F}</math> のサイズを <math>M</math> にまで拡張する。一方ダウンサンプリングを行う場合は、<math>\boldsymbol{F}</math> の左右の端 (周波数最大部分) から <math>N-M</math> 個のデータ点を削除する。 結果として得られた長さ <math>M</math> のデータ点に対して高速逆フーリエ変換をすれば、サンプル数を <math>M</math> に変換できる。 == 畳み込み積分を使った方法 == フーリエ変換で、2つの関数f(t), g(t) の積 f(t)g(t) をフーリエ変換すると、結果は、F(w), G(w)の畳み込み積分になる性質がある。 :<math>F(w) = \mathcal{F}\left[f\right]</math> :<math>G(w) = \mathcal{F}\left[g\right]</math> :<math>\mathcal{F} \left[f \cdot g \right] = (F * G)(w)</math> 但し、<math>\mathcal{F}\left[f\right]</math>の [] 記号は、汎関数を表している。 ここで、連続関数に対する畳み込み積分の定義は、 :<math>(f * g)(t) = \int f(t') \ g(t - t')\, d t'</math> :<math>(F * G)(w) = \int F(w') \ G(w - w')\, d w'</math> 離散的な場合の畳み込み積分の定義は、 :<math>(f * g)[m] = \sum_n {f[n] \, g[m - n]}</math> ただし、上式の [] 記号は、離散的な関数の整数値引数を表している。 対称性により、逆に、F(w), G(w)の積 F(w)G(w) を逆フーリエ変換すると、結果は、f(t), g(t)の畳み込み積分になる: :<math>\mathcal{F}^{-1} \left[F \cdot G \right] = (f * g)(t)</math> この性質を利用すれば、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) : {{Indent|<math> G(w) = \begin{cases} 1, & |w| < b \\ 0, & |w| > b \end{cases} </math>}} :<math> g(t)=\frac{1}{\sqrt{2 \pi}} \int_{-\infty}^{\infty} G(w) \ e^{iwt} d w = \frac{1}{\sqrt{2 \pi} it} 2i \sin(bt) =\sqrt{\frac{2}{\pi}} \frac{\sin(bt)}{t} </math> 考え方としては、f(t)は、f[n]のような離散的で飛び飛びの場所しかデータがないが、sinc 関数であるところの g(t)は連続関数なので、あらゆる時刻 t の関数値を読み出すことが出来る。だから、f[n]とg(t)の畳み込み積分で、f[n]には存在していない場所のデータまで補完したかのようにデータを読み出すことが出来るようになる。それを利用すれば、上方サンプリング変換でも、下方サンプリング変換でも同様の考え方で処理できる。 ==ビットマップ画像== [[ビットマップ画像]]など2[[次元]]データ(および3次元以上のデータ)に対してサンプリング周波数変換をするには、各次元に対し順次、1次元のサンプリング周波数変換を施せばいい。ただし音声信号と違い、LPFは対称でなければならない。 ビットマップ画像を[[dpi]]を保ったままサンプリング周波数変換すると、画像は拡大・縮小される。 {{DEFAULTSORT:さんふりんくしゆうはすうへんかん}} [[Category:標本化]]
このページで使用されているテンプレート:
テンプレート:Indent
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:出典の明記
(
ソースを閲覧
)
テンプレート:要検証範囲
(
ソースを閲覧
)
サンプリング周波数変換
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報