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 |