ウォルシュ・アダマール変換

ウォルシュ・アダマール変換で フーリエ級数と同様のシミュレーション を実施します.
ウォルシュ・アダマール変換は高速フーリエ変換と同様に2のべきのデータ数を入力とし, 矩形の直交基底による
変換です. ここでは変換そのものを体感しましょう.

原信の選択

定数 頂点
2頂点 3頂点
台形 傾斜
ランダム

ウォルシュ・アダマール変換の実行


DC(0th)
1st 2nd
3rd 4th

スペクトルの合成

0 ⇒

解説

本プログラムでは8点のウォルシュ・アダマール変換を実行します. フーリエ変換と比較するため, 直交基底を
周波数成分で分類してあります. 基本周波数から3倍までの周波数には正弦(sin)波と余弦(cos)波に相当する2つ
の直交基底(赤と緑で表示)としています. フーリエ変換では2つの直交基底により位相を表現できますが,
ウォルシュ・アダマール変換でも同様に考えることができます. 一方, 最高次(4th)では直交基底は1つとなります
が, これは形式的に分類したにすぎません. 本来, 8つの直交基底は互いに直交条件を満たすものであり, 基底間
で補完しあう形式となることがあります.
8点のアダマール行列は(1)です.

\(\large{ H_8= \begin{bmatrix} 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & -1 & -1 & -1 & -1 \\ 1 & 1 & -1 & -1 & -1 & -1 & 1 & 1 \\ 1 & 1 & -1 & -1 & 1 & 1 & -1 & -1 \\ 1 & -1 & -1 & 1 & 1 & -1 & -1 & 1 \\ 1 & -1 & -1 & 1 & -1 & 1 & 1 & -1 \\ 1 & -1 & 1 & -1 & -1 & 1 & -1 & 1 \\ 1 & -1 & 1 & -1 & 1 & -1 & 1 & -1 \\ \end{bmatrix} } \qquad (1)\)

\(n×n\)のアダマール行列の要素\(H_n\left(r, c\right)\)は(2)により算出します.

\(\large{H_n\left(r, c\right)=\left(-1\right)^{d\left(r, c\right)}} \qquad (2)\)
\(\large{r, c}\): 行, 列のインデックス

\(\large{d\left(r, c\right)= \displaystyle \sum_{k=0}^{p-1} b\left(k, r\right)f\left(k, c\right)}\) \(\large{\left(p=\log_{2} n\right)}\)
\(\large{f\left(k, c\right)= \begin{eqnarray} \left\{ \begin{array}{l} b\left(p-1, c\right) \qquad \qquad \qquad \qquad \qquad (k=0) \\ b\left(p-k, c\right) + b\left(p-k-1, c\right) \qquad (0 \lt k \lt p) \\ \end{array} \right. \end{eqnarray} }\)

\(\large{b\left(j, i\right)= \left(i \gg j \right) \& 1}\)
\(\large{i \gg j}\): \(i\)を\(j\)回だけ論理右シフト \(\large{\&}\): ビット毎の論理積

原信のデータ系列\(Y\)とすれば, スペクトル系列\(S\)の算出は(3)となります.

\(\large{S=\frac{1}{n}H_n Y} \qquad (3)\)

\(\large{ Y= \begin{bmatrix} y\left(0\right) \\ y\left(1\right) \\ y\left(2\right) \\ \vdots \\ y\left(n-1\right) \\ \end{bmatrix} }\) \(\large{ S= \begin{bmatrix} DC(0th) \\ 1st[sin] \\ 1st[cos] \\ \vdots \\ n/2-1th[sin] \\ n/2-1th[cos] \\ n/2th \\ \end{bmatrix} }\)

ここでは, \(\frac{1}{n} H_n\)を変換, \(H_n\)を逆変換とします. \(\frac{1}{n} H_n\)を変換とすることで原信号の信号強度として合成できる
ようになります. なお, 原信号が変換\(\Rightarrow \)逆変換で元に戻るのであれば, 変換と逆変換を入れ換えても問題ありません.
他に, 変換, 逆変換のいずれも\(\frac{1}{\sqrt n} H_n\)とすることもできます.
以上, \(H_n Y\)の算出に乗算は不要です. 加減のみとできるため, スペクトルを高速に算出できます.