Conversion discrète de cosinus à l'aide de chainer.links.Linear

J'ai fait une note parce qu'elle n'est pas sortie quand je l'ai googlé. J'ai créé une transformation en cosinus discrète (DCT) en utilisant la classe chainer.links.Linear.

La transformation discrète en cosinus est un parent de la transformation de Fourier rapide (FFT) et a la même signification que l'extraction de la partie réelle de la FFT. (L'explication détaillée dépend de l'explication des autres)

J'ai confirmé que l'utilisation de la fonction suivante DCT (wave) renvoie le même résultat que scipy.fftpack.dct (wave). Les modules sont importés conformément au Tutoriel Chainer.

DCT.py


def DCT(wave):
    num_base = np.size(wave.data[0,:])
    lDCT = L.Linear(num_base,num_base)
    for n in range(num_base):
        for k in range(num_base):
            lDCT.W.data[k,n] = 2*np.cos(np.pi*k*(2*n+1)/(2*num_base))
    lDCT.b.data[:] = 0.0
    return lDCT(wave)

Le point dans lequel je suis entré est -Format variable pour passer à linéaire -Passez comme deux dimensions comme np.array ([[vecteur d'entrée]]) C'est le but. Vous pouvez (devriez) créer une fonction de chaîne ou d'erreur à l'aide de DCT. (Pas encore utilisé)

(Ajout: 4 février 2016) J'ai également fait une transformation cosinus discrète inverse (Inverse DCT, IDCT). Depuis Scipy Documents, scipy.fftpack.dct (wave) est de type 2 par défaut. Retour. Dans ce cas, Type3 doit être utilisé pour la conversion inverse, l'implémentation est donc la suivante.

IDCT.py


def IDCT(wave):
    num_base = np.size(wave.data[0,:])
    lIDCT = L.Linear(num_base,num_base)
    for n in range(num_base):
        for k in range(num_base):
            if(n==0):
                lIDCT.W.data[k,n] = 0.0
            else:
                lIDCT.W.data[k,n] = 2*np.cos(np.pi*(k+0.5)*n/num_base)
    lIDCT.b.data[:] = wave.data[0,0]
    return lIDCT(wave)

La mise en garde de cet IDCT est qu'il ne peut pas être utilisé pour le traitement par lots (!). J'aurais aimé qu'il y ait une meilleure mise en œuvre. ..

Recommended Posts

Conversion discrète de cosinus à l'aide de chainer.links.Linear
Méthode de suppression du bruit utilisant la conversion en ondelettes
Propriétés de la transformée de Fourier discrète
Reconnaissance d'objet circulaire à l'aide de la transformation de Huff