はじめに
信号処理や制御工学では実用上、ディジタル計算機で実現するために連続時間信号をAD変換して離散領域で演算した後、DA変換して連続系である制御対象に入力する。よって手を加える前の物理系に於いて入力と制御対象の間に0次ホールド回路と演算回路が挟まった形になる。本記事では0次ホールド回路を通過した正弦波の周波数スペクトラムについて考察する。
背景
技術書の中には上述の問題をステップ入力に対するラプラス変換の積分と時間遅れとして表してゲインや位相を考えているものもあるが、これは厳密には正しくない。なぜなら、0次ホールド回路に正弦波を入れた際、通過した信号は細かいステップの集まりであり、元の正弦波に近いものの、完全な正弦波ではないからである。「ゲイン」や「位相変化」を厳密に定義できない。厳密には、Fourier変換してスペクトラムについて考える必要がある。とはいえ、無限に続く減衰しない信号のFourier変換は通常の関数の意味では存在しないし(超関数になる)、現実の測定器は窓関数で時間制限した信号のFourier変換を近似的に計算している。そこで本記事では窓関数付きのFourier変換の結果ついて考察する。
  \[
    % general purpose
    \newcommand{\ctext}[1]{\raise0.2ex\hbox{\textcircled{\scriptsize{#1}}}}
    % mathematics
      % general purpose
      \DeclarePairedDelimiterX{\parens}[1]{\lparen}{\rparen}{#1}
      \DeclarePairedDelimiterX{\braces}[1]{\lbrace}{\rbrace}{#1}
      \DeclarePairedDelimiterX{\bracks}[1]{\lbrack}{\rbrack}{#1}
      \DeclarePairedDelimiterX{\verts}[1]{|}{|}{#1}
      \DeclarePairedDelimiterX{\Verts}[1]{\|}{\|}{#1}
      \newcommand{\as}{{\quad\textrm{as}\quad}}
      \newcommand{\st}{{\textrm{ s.t. }}}
      \DeclarePairedDelimiterX{\setComprehension}[2]{\lbrace}{\rbrace}{#1\,\delimsize\vert\,#2}
      \newcommand{\naturalNumbers}{\mathbb{N}}
      \newcommand{\integers}{\mathbb{Z}}
      \newcommand{\rationalNumbers}{\mathbb{Q}}
      \newcommand{\realNumbers}{\mathbb{R}}
      \newcommand{\complexNumbers}{\mathbb{C}}
      \newcommand{\field}{\mathbb{F}}
      \newcommand{\func}[2]{{#1}\parens*{#2}}
      \newcommand*{\argmax}{\operatorname*{arg~max}}
      \newcommand*{\argmin}{\operatorname*{arg~min}}
      % set theory
      \newcommand{\range}[2]{\braces*{#1,\dotsc,#2}}
      \providecommand{\complement}{}\renewcommand{\complement}{\mathrm{c}}
      \newcommand{\ind}[2]{\mathbbm{1}_{#1}\parens*{#2}}
      \newcommand{\indII}[1]{\mathbbm{1}\braces*{#1}}
      % number theory
      \newcommand{\abs}[1]{\verts*{#1}}
      \newcommand{\combi}[2]{{_{#1}\mathrm{C}_{#2}}}
      \newcommand{\perm}[2]{{_{#1}\mathrm{P}_{#2}}}
      \newcommand{\GaloisField}[1]{\mathrm{GF}\parens*{#1}}
      % real analysis
      \newcommand{\NapierE}{\mathrm{e}}
      \newcommand{\sgn}[1]{\operatorname{sgn}\parens*{#1}}
      \newcommand*{\rect}{\operatorname{rect}}
      \newcommand{\cl}[1]{\operatorname{cl}#1}
      \newcommand{\Img}[1]{\operatorname{Img}\parens*{#1}}
      \newcommand{\dom}[1]{\operatorname{dom}\parens*{#1}}
      \newcommand{\norm}[1]{\Verts*{#1}}
      \newcommand{\floor}[1]{\left\lfloor#1\right\rfloor}
      \newcommand{\ceil}[1]{\left\lceil#1\right\rceil}
      \newcommand{\expo}[1]{\exp\parens*{#1}}
      \newcommand{\sinc}{\operatorname{sinc}}
      \newcommand{\nsinc}{\operatorname{nsinc}}
      \newcommand{\GammaFunc}[1]{\Gamma\parens*{#1}}
      \newcommand*{\erf}{\operatorname{erf}}
          % inverse trigonometric functions
          \newcommand{\asin}[1]{\operatorname{Sin}^{-1}{#1}}
          \newcommand{\acos}[1]{\operatorname{Cos}^{-1}{#1}}
          \newcommand{\atan}[1]{\operatorname{{Tan}^{-1}}{#1}}
          \newcommand{\atanEx}[2]{\atan{\parens*{#1,#2}}}
          % convolution
          \newcommand{\cycConv}[2]{{#1}\underset{\text{cyc}}{*}{#2}}
          % derivative
          \newcommand{\deriv}[3]{\frac{\operatorname{d}^{#3}#1}{\operatorname{d}{#2}^{#3}}}
          \newcommand{\derivLong}[3]{\frac{\operatorname{d}^{#3}}{\operatorname{d}{#2}^{#3}}#1}
          \newcommand{\partDeriv}[3]{\frac{\operatorname{\partial}^{#3}#1}{\operatorname{\partial}{#2}^{#3}}}
          \newcommand{\partDerivLong}[3]{\frac{\operatorname{\partial}^{#3}}{\operatorname{\partial}{#2}^{#3}}#1}
          \newcommand{\partDerivIIHetero}[3]{\frac{\operatorname{\partial}^2#1}{\partial#2\operatorname{\partial}#3}}
          \newcommand{\partDerivIIHeteroLong}[3]{{\frac{\operatorname{\partial}^2}{\partial#2\operatorname{\partial}#3}#1}}
          % integral
          \newcommand{\integrate}[5]{\int_{#1}^{#2}{#3}{\mathrm{d}^{#4}}#5}
          \newcommand{\LebInteg}[4]{\int_{#1} {#2} {#3}\parens*{\mathrm{d}#4}}
      % complex analysis
      \newcommand{\conj}[1]{\overline{#1}}
      \providecommand{\Re}{}\renewcommand{\Re}[1]{{\operatorname{Re}{\parens*{#1}}}}
      \providecommand{\Im}{}\renewcommand{\Im}[1]{{\operatorname{Im}{\parens*{#1}}}}
      \newcommand{\Arg}{\operatorname{Arg}}
      \newcommand{\Log}{\operatorname{Log}}
          % Laplace transform
          \newcommand{\LPLC}[1]{\operatorname{\mathcal{L}}\parens*{#1}}
          \newcommand{\ILPLC}[1]{\operatorname{\mathcal{L}}^{-1}\parens*{#1}}
          % Discrete Fourier Transform
          \newcommand{\DFT}[1]{\mathrm{DFT}\parens*{#1}}
          % Z transform
          \newcommand{\ZTrans}[1]{\operatorname{\mathcal{Z}}\parens*{#1}}
          \newcommand{\IZTrans}[1]{\operatorname{\mathcal{Z}}^{-1}\parens*{#1}}
      % linear algebra
      \newcommand{\bm}[1]{{\boldsymbol{#1}}}
      \newcommand{\matEntry}[3]{#1\bracks*{#2}\bracks*{#3}}
      \newcommand{\matPart}[5]{\matEntry{#1}{#2:#3}{#4:#5}}
      \newcommand{\diag}[1]{\operatorname{diag}\parens*{#1}}
      \newcommand{\tr}[1]{\operatorname{tr}{\parens*{#1}}}
      \newcommand{\inprod}[2]{\left\langle#1,#2\right\rangle}
      \newcommand{\HadamardProd}{\odot}
      \newcommand{\HadamardDiv}{\oslash}
      \newcommand{\Span}[1]{\operatorname{span}\bracks*{#1}}
      \newcommand{\Ker}[1]{\operatorname{Ker}\parens*{#1}}
      \newcommand{\rank}[1]{\operatorname{rank}\parens*{#1}}
        % vector
        % unit vector
        \newcommand{\vix}{\bm{i}_x}
        \newcommand{\viy}{\bm{i}_y}
        \newcommand{\viz}{\bm{i}_z}
      % graph theory
      \newcommand{\neighborhood}{\mathcal{N}}
    % probability theory
    \newcommand{\PDF}[2]{\operatorname{PDF}\bracks*{#1,\;#2}}
    \newcommand{\Ber}[1]{\operatorname{Ber}\parens*{#1}}
    \newcommand{\Beta}[2]{\operatorname{Beta}\parens*{#1,#2}}
    \newcommand{\ExpDist}[1]{\operatorname{ExpDist}\parens*{#1}}
    \newcommand{\ErlangDist}[2]{\operatorname{ErlangDist}\parens*{#1,#2}}
    \newcommand{\PoissonDist}[1]{\operatorname{PoissonDist}\parens*{#1}}
    \newcommand{\GammaDist}[2]{\operatorname{Gamma}\parens*{#1,#2}}
    \newcommand{\cind}[2]{\ind{#1\left| #2\right.}}	% conditional indicator function
    \providecommand{\Pr}{}\renewcommand{\Pr}[1]{\operatorname{Pr}\parens*{#1}}
    \DeclarePairedDelimiterX{\cPrParens}[2]{(}{)}{#1\,\delimsize\vert\,#2}
    \newcommand{\cPr}[2]{\operatorname{Pr}\cPrParens{#1}{#2}}
    \newcommand{\E}[2]{\operatorname{E}_{#1}\bracks*{#2}}
    \newcommand{\cE}[3]{\E{#1}{\left.#2\right|#3}}
    \newcommand{\Var}[2]{\operatorname{Var}_{#1}\bracks*{#2}}
    \newcommand{\Cov}[2]{\operatorname{Cov}\bracks*{#1,#2}}
    \newcommand{\CovMat}[1]{\operatorname{Cov}\bracks*{#1}}
    % signal processing
      % Discrete Time Fourier Transform
      \newcommand{\DTFT}[1]{\mathrm{DTFT}\parens*{#1}}
      \newcommand{\IDTFT}[1]{\mathrm{IDTFT}\parens*{#1}}
    % computer science
      % programming
      \newcommand{\plpl}{\mathrel{++}}
      \newcommand{\pleq}{\mathrel{+}=}
      \newcommand{\asteq}{\mathrel{*}=}
    \]
導出
    \[
        \newcommand{\Tsamp}{T_\text{s}}
        \newcommand{\xd}{x_\text{d}}
        \newcommand{\Xd}{X_\text{d}}
     \]
$f_0>0$とし、連続時間の複素正弦波信号$x:t\in\realNumbers\mapsto\exp(i 2\pi f_0 t)$を考える。サンプリング周期を$\Tsamp>0$とする。この周期で$x$を0次ホールドした信号を$\xd:t\in\realNumbers\mapsto x(\floor{t/\Tsamp}\Tsamp)$とする。次の図は$x$と$\xd$の実部を示したものである。
 元の信号とその0次ホールド
元の信号とその0次ホールド 
上の図より、$\xd$の基本周波数成分(周波数成分に於ける$f_0$に対応する成分)が$x$のそれより遅れることが予想される。このことを矩形窓を通した、周波数表示されたFourier変換で考察する。$N\in\naturalNumbers$とし、窓の幅を$T=N\Tsamp$とする。窓の幅を$\Tsamp$の整数倍に選んでいるが、非整数倍の場合でも幅を十分に大きくとれば小数部分に対応する区間の積分の$1/T$倍は無視できるほど小さくなり、最も近い整数倍の幅を用いた結果と殆ど一致する。$x$の窓付きFourier変換を窓の幅で規格化したものは次式である。
\[ X(f) = \frac{1}{T} \integrate{0}{T}{x(t)\exp(-i 2\pi f t)}{}{t} = \frac{1}{i 2\pi(f-f_0)T}\left(1-\exp\left(-i 2\pi(f-f_0)T\right)\right) \]
$\xd$の窓付きFourier変換は次式である。
\[
    \begin{align*}
        \Xd(f) &= \frac{1}{T}\integrate{0}{T}{\xd(t)\exp(-i 2\pi f t)}{}{t} = \frac{1}{T}\sum_{k=0}^{N-1}\integrate{k\Tsamp}{(k+1)\Tsamp}{\xd(t)\exp(-i 2\pi f t)}{}{t} \\
        &= \frac{1}{T}\sum_{k=0}^{N-1}\exp(i 2\pi f_0 k\Tsamp)\integrate{k\Tsamp}{(k+1)\Tsamp}{\exp(-i 2\pi f t)}{}{t} \\
        &= \frac{1}{T}\sum_{k=0}^{N-1}\exp(i 2\pi f_0 k\Tsamp)\frac{1}{i 2\pi f}\exp(-i 2\pi f k\Tsamp)\left(1-\exp(-i 2\pi f \Tsamp)\right) \\
        &= \frac{1-\exp(-i 2\pi f\Tsamp)}{i 2\pi f}\frac{1}{T}\underbrace{\sum_{k=0}^{N-1}\exp(i 2\pi(f_0-f)k\Tsamp)}_{\text{(A)}} \\
        &= \frac{1-\exp(-i 2\pi f\Tsamp)}{i 2\pi f}\frac{1}{N\Tsamp}\exp(i\pi(f_0-f)(N-1)\Tsamp)\frac{\sin\pi(f-f_0)N\Tsamp}{\sin\pi(f-f_0)\Tsamp}
    \end{align*}
\]
最後の式を導くために、(A)に等比数列の和の公式を適用し、分母・分子それぞれ$\sin$が生じるように複素指数関数を括り出して整理した。
$\xd$中の、周波数が$f_0$である成分の振幅と位相を調べる。$f\to f_0$の極限に関して次式が成り立つ。
\[ \lim_{f\to f_0} \Xd(f) = \frac{1-\exp(-i 2\pi f_0\Tsamp)}{i 2\pi f_0\Tsamp} \]
これより、上式に相当する振幅と位相の変化が生じる。サンプリングが十分に高速、すなわち$f_0\Tsamp\ll 1$であるとき上式は1に近づくので、振幅と位相の変化は無くなってゆく。
次に、高調波領域を調べる。$|\Xd(f)|$は$1/\Tsamp$周期関数と$1/|f|$の積であるので、$|f|<\Tsamp/2$の部分の縮小コピーが高周波領域に於いて$1/\Tsamp$毎に現れる。これが高調波成分である。
数値例
今、$f_0=10,\;\Tsamp=10^{-2},\;N=200$とする。$f=f_0$に於ける振幅と位相は$|\Xd(f_0)| \approx 0.9836,\quad \angle \Xd(f_0) \approx \ang{-18.00}$となる。次の図は$f_0$近傍でのエネルギー・スペクトラム密度 $X,\Xd$を示したものである。
 元の周波数の近傍での ESD
元の周波数の近傍での ESD 
低周波領域では両者が良く一致していることがわかる。
次に高調波を見る。次の図はサンプリング周波数の3倍の範囲まで$X,\Xd$を示したものである。次の図は$x$と$\xd$の実部を示したものである。
サンプリング周波数の整数倍の位置に高調波が生じていることが判る。
以上の数値例を計算したMathematicaノートブックをここで公開している。