root / ETSN / MyDFT_2.py @ 271
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)) |