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