クロックノイズ

クロックノイズ

更新日: 2021-03-31

クロックノイズ #

CMOS出力の発振器が出力する信号の高調波成分ノイズを考える。

フーリエ級数展開 #

周期が$T$の関数$f(x)$を考える。この時$f(x)$は

$$ f(x) = \frac{1}{2}a_0 + \sum_{n=1}^{\infty}a_n\cos(nx) + \sum_{n=1}^{\infty}b_n\sin(nx) $$

となる。それぞれの係数は

$$ a_0 = \frac{2}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}} f(x) dx $$

$$ a_n = \frac{2}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}} f(x)\cos(nx) dx $$

$$ b_n = \frac{2}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}} f(x)\sin(nx) dx $$

である。

矩形波のフーリエ級数展開 #

CPUのクロック源に使用される発振器の出力は通常CMOS出力となっている(アナログ回路等、ノイズを気にする箇所ではクリップドサイン出力)。この波形をフーリエ級数展開してみる。計算の都合上少しシフトした波形で考える。CMOS出力波形は矩形波であるので、この波形と数式を示す。

$$ f(x) = \begin{cases} -1 \hspace{3mm} & (2n-1)\pi \lt x \leq 2n \pi \\ 1 & 2n \pi \lt x \leq (2n+1)\pi \end{cases} $$

先述の公式に当てはめると

$$ \begin{align} a_0 &= 0 \\ a_n &= 0 \\ b_n &= \frac{2}{n\pi}(1-(-1)^n) \end{align} $$

となる。したがってフーリエ級数展開は

$$ f(x) = \sum^{\infty}_{n=1} \frac{4}{(2n-1)\pi}\sin((2n-1)x) $$

となる。

グラフで表すと下記のようになる。

参考コード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import matplotlib.pyplot as plt
import numpy as np
import math
from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Yu Gothic', 'Meirio']

x = np.arange(-6, 6, 0.1)
f = []
fsum = [0] * len(x)
for n in range(10):
    n = n+1
    fx = 4/((2*n-1)*math.pi)*np.sin((2*n-1)*x)
    f.append(fx)
    fsum = fsum + fx

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, fsum, label="合成波")
for i, f in enumerate(f):
    ax.plot(x, f, label="{}次高調波".format(i*2+1))
ax.set_xticks(np.arange(-2*math.pi, 2*math.pi, math.pi))
ax.legend()
ax.grid(which="both")

従って、周波数の高調波は奇数倍()のみに現れる。

comments powered by Disqus