Statistiques
| Révision :

root / ETSN / MyDFT_2.py @ 299

Historique | Voir | Annoter | Télécharger (2,11 ko)

1 270 equemene
#!/usr/bin/env python3
2 270 equemene
3 270 equemene
import numpy as np
4 270 equemene
import pyopencl as cl
5 270 equemene
6 270 equemene
# Naive Discrete Fourier Transform
7 270 equemene
def MyDFT(x,y):
8 270 equemene
    from numpy import pi,cos,sin
9 270 equemene
    size=x.shape[0]
10 270 equemene
    X=np.zeros(size).astype(np.float32)
11 270 equemene
    Y=np.zeros(size).astype(np.float32)
12 270 equemene
    for i in range(size):
13 270 equemene
        for j in range(size):
14 270 equemene
            X[i]=X[i]+x[j]*cos(2.*pi*i*j/size)-y[j]*sin(2.*pi*i*j/size)
15 270 equemene
            Y[i]=Y[i]+x[j]*sin(2.*pi*i*j/size)+y[j]*cos(2.*pi*i*j/size)
16 270 equemene
    return(X,Y)
17 270 equemene
18 270 equemene
# Numpy Discrete Fourier Transform
19 270 equemene
def NumpyDFT(x,y):
20 270 equemene
    from numpy import pi,cos,sin
21 270 equemene
    size=x.shape[0]
22 270 equemene
    X=np.zeros(size).astype(np.float32)
23 270 equemene
    Y=np.zeros(size).astype(np.float32)
24 270 equemene
    nj=np.multiply(2.0*np.pi/size,np.arange(size)).astype(np.float32)
25 270 equemene
    for i in range(size):
26 270 equemene
        X[i]=np.sum(np.subtract(np.multiply(np.cos(i*nj),x),np.multiply(np.sin(i*nj),y)))
27 270 equemene
        Y[i]=np.sum(np.add(np.multiply(np.sin(i*nj),x),np.multiply(np.cos(i*nj),y)))
28 270 equemene
    return(X,Y)
29 270 equemene
30 270 equemene
import sys
31 270 equemene
import time
32 270 equemene
33 270 equemene
if __name__=='__main__':
34 270 equemene
35 270 equemene
    # Size of input vectors definition based on stdin
36 270 equemene
    import sys
37 270 equemene
    try:
38 270 equemene
        SIZE=int(sys.argv[1])
39 270 equemene
        print("Size of vectors set to %i" % SIZE)
40 270 equemene
    except:
41 271 equemene
        SIZE=256
42 270 equemene
        print("Size of vectors set to default size %i" % SIZE)
43 270 equemene
44 270 equemene
    a_np = np.ones(SIZE).astype(np.float32)
45 270 equemene
    b_np = np.ones(SIZE).astype(np.float32)
46 270 equemene
47 271 equemene
    C_np = np.zeros(SIZE).astype(np.float32)
48 271 equemene
    D_np = np.zeros(SIZE).astype(np.float32)
49 271 equemene
    C_np[0] = np.float32(SIZE)
50 271 equemene
    D_np[0] = np.float32(SIZE)
51 271 equemene
52 270 equemene
    # Native & Naive Implementation
53 270 equemene
    print("Performing naive implementation")
54 270 equemene
    TimeIn=time.time()
55 270 equemene
    c_np,d_np=MyDFT(a_np,b_np)
56 270 equemene
    NativeElapsed=time.time()-TimeIn
57 270 equemene
    NativeRate=int(SIZE/NativeElapsed)
58 270 equemene
    print("NativeRate: %i" % NativeRate)
59 271 equemene
    print("Precision: ",np.linalg.norm(c_np-C_np),np.linalg.norm(d_np-D_np))
60 270 equemene
61 270 equemene
    # Native & Numpy Implementation
62 270 equemene
    print("Performing Numpy implementation")
63 270 equemene
    TimeIn=time.time()
64 270 equemene
    e_np,f_np=NumpyDFT(a_np,b_np)
65 270 equemene
    NumpyElapsed=time.time()-TimeIn
66 270 equemene
    NumpyRate=int(SIZE/NumpyElapsed)
67 270 equemene
    print("NumpyRate: %i" % NumpyRate)
68 271 equemene
    print("Precision: ",np.linalg.norm(e_np-C_np),np.linalg.norm(f_np-D_np))