View difference between Paste ID: dKWyMGbi and MdKS0tvf
SHOW: | | - or go back to the newest paste.
1
# modulo fft
2
from math import *	
3
4
def fft(m, f=[]): #genera fft
5
	result = []	 
6-
    n=2<<(m-1)	
6+
        n=2<<(m-1)	
7
	nesp=0.5
8
	for k in range(1,m+1):
9
		d=n/(2<<(k-1)
10
		nesp=nesp*2
11
		s=0
12
		for i in range(1,nesp+1):
13
			r=s
14
	    	z1=r>>(m-k)
15
			z=0
16
			for q in range(k):
17
				z=(((z1>>q) & 01) | (z<<1)
18
			
19
			w=2*pi*z/(2<<(k-1))
20
			e=cos(w)-sin(w)j
21
			for l in range (d):
22
				r=l+s
23
				r1=r+d
24
				t=e*f[r1]	
25
				f[r1]=f[r]-t
26
				f[r]=f[r]+t
27
			s=s+2*d
28
	#bitReversal(n, m, f=[])		
29
	for x in range(1, n-1):
30
		y=0
31
		for i in range(m):
32
			y=(((x>>i) & 01) | (y<<1))
33
		if x<y : 
34
			t=f[x]
35
			f[x]=f[y]
36
			f[y]=t
37
	#Ampiezze fasi	
38
	nmezzi=n/2	
39
	for i in range(n):
40
		f[i]=f[i]/nmezzi
41
	A[0]=f[0].real
42
	phi[0]=0
43
	for k in range(1, nmezzi+1):
44
		A[k]=sqrt(f[k].real*f[k].real+f[k].imag*f[k].imag])
45
		result.append(A[k])
46
	if f[k].real == 0: 
47
		if f[k].imag>0:
48
			phi[k]=pi
49
 		if f[k].imag==0:
50
			phi[k]=0
51
		if f[k].imag<0:
52
			phi[k]=2*pi-pi/2
53
	if f[k].real>0:
54
		if f[k]>=0:
55
			phi[k]=atan(f[k].imag, f[k].real)
56
		if f[k]<0:
57
			phi[k]=2*pi + atan(f[k].imag, f[k].real)
58
	if f[k].real<0:
59
		phi[k]=atan(f[k].imag, f[k].real)
60
	 return result