アダマール変換と基底

アダマール変換の定義

F(u,v) &= \frac{1}{n} \sum_{x=0}^{n-1}\sum_{y=0}^{n-1} f(x,y)\cdot (-1)^{q(x,y,u,v)} \\
q(x,y,u,v) &= \sum_{i=0}^{b-1}x_i g_i(u) + y_i g_i (v)\\
g_i(u) &= u_{b-i} + u_{b-i-1}


ただしbはu(およびv)を2進数で表現したときに必要なビット数
たとえば8x8画像だとすると、u(およびv)は8なので、その表現ビット数はb=3(∵3'b111=7)となる。

以下はMatlabでの実装
Matlabのindexは0からじゃなくて1からだけど、上のアダマール変換の定義式では0からインデックスを振らないといけないのでハマった

function show_hadamard_basis
clear;
close all;

m = 8;
N = m*m;
b = 3; % <8> can be expressed with <3> bit

    function F=getBasisF(u,v)
        F = zeros(m,m);
        for yidx=0:m-1
            for xidx=0:m-1
                F(yidx+1,xidx+1) = (-1)^getQ(xidx,yidx,u,v);
            end
        end
        F = 1/m * F;
    end

    function q=getQ(x,y,u,v)
        q = 0;
        for idx=0:b-1
            q = q + Bit(idx,x)*getG(idx,u) + Bit(idx,y)*getG(idx,v);
        end
    end

    function g = getG(i,u)
        g = Bit(b-i,u) + Bit(b-i-1,u);
    end

    function bit = Bit(index,u)
        filter = bitshift(1, index);
        flag = bitand(u,filter);
        if flag ~= 0
            bit = 1;
        else
            bit = 0;
        end
    end

for vidx=0:m-1
    for uidx=0:m-1
        F = getBasisF(uidx,vidx);
        subplot(m,m,m*vidx+uidx+1);
        imagesc(F);
        colormap(gray);
        axis image;
        axis off;
    end
end


end