OpenCores
URL https://opencores.org/ocsvn/tcp_socket/tcp_socket/trunk

Subversion Repositories tcp_socket

[/] [tcp_socket/] [trunk/] [chips2/] [examples/] [fft.c] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 jondawson
/* fft.c */
2
/* Jonathan P Dawson */
3
/* 2013-12-23 */
4
 
5
#include "math.h"
6
 
7
/*globals*/
8
const int n = 1024;
9
const int m = 10;
10
float twiddle_step_real[m];
11
float twiddle_step_imaginary[m];
12
 
13
 
14
/*calculate twiddle factors and store them*/
15
void calculate_twiddles(){
16
    unsigned stage, subdft_size, span;
17
    for(stage=1; stage<=m; stage++){
18
        subdft_size = 1 << stage;
19
        span = subdft_size >> 1;
20
        twiddle_step_real[stage] = cos(M_PI/span);
21
        twiddle_step_imaginary[stage] = -sin(M_PI/span);
22
    }
23
}
24
 
25
/*bit reverse*/
26
unsigned bit_reverse(unsigned forward){
27
    unsigned reversed=0;
28
    unsigned i;
29
    for(i=0; i<m; i++){
30
        reversed <<= 1;
31
        reversed |= forward & 1;
32
        forward >>= 1;
33
    }
34
    return reversed;
35
}
36
 
37
/*calculate fft*/
38
void fft(float reals[], float imaginaries[]){
39
 
40
    int stage, subdft_size, span, i, ip, j;
41
    float sr, si, temp_real, temp_imaginary, imaginary_twiddle, real_twiddle;
42
 
43
    //read data into array
44
    for(i=0; i<n; i++){
45
        ip = bit_reverse(i);
46
        if(i < ip){
47
            temp_real = reals[i];
48
            temp_imaginary = imaginaries[i];
49
            reals[i] = reals[ip];
50
            imaginaries[i] = imaginaries[ip];
51
            reals[ip] = temp_real;
52
            imaginaries[ip] = temp_imaginary;
53
        }
54
    }
55
 
56
    //butterfly multiplies
57
    for(stage=1; stage<=m; stage++){
58
        report(stage);
59
        subdft_size = 1 << stage;
60
        span = subdft_size >> 1;
61
 
62
        //initialize trigonometric recurrence
63
 
64
        real_twiddle=1.0;
65
        imaginary_twiddle=0.0;
66
 
67
        sr = twiddle_step_real[stage];
68
        si = twiddle_step_imaginary[stage];
69
 
70
        for(j=0; j<span; j++){
71
            for(i=j; i<n; i+=subdft_size){
72
                ip=i+span;
73
 
74
                temp_real      = reals[ip]*real_twiddle      - imaginaries[ip]*imaginary_twiddle;
75
                temp_imaginary = reals[ip]*imaginary_twiddle + imaginaries[ip]*real_twiddle;
76
 
77
                reals[ip]       = reals[i]-temp_real;
78
                imaginaries[ip] = imaginaries[i]-temp_imaginary;
79
 
80
                reals[i]       = reals[i]+temp_real;
81
                imaginaries[i] = imaginaries[i]+temp_imaginary;
82
            }
83
            //trigonometric recreal_twiddlerence
84
            temp_real=real_twiddle;
85
            real_twiddle      = temp_real*sr - imaginary_twiddle*si;
86
            imaginary_twiddle = temp_real*si + imaginary_twiddle*sr;
87
        }
88
    }
89
}
90
 
91
void main(){
92
    float reals[n];
93
    float imaginaries[n];
94
    unsigned i;
95
 
96
    /* pre-calculate sine and cosine*/
97
    calculate_twiddles();
98
 
99
    /* generate a 64 sample cos wave */
100
    for(i=0; i<n; i++){
101
        reals[i] = 0.0;
102
        imaginaries[i] = 0.0;
103
    }
104
    for(i=0; i<=64; i++){
105
        reals[i] = sin(2.0 * M_PI * (i/64.0));
106
    }
107
 
108
    /* output time domain signal to a file */
109
    for(i=0; i<n; i++){
110
        file_write(reals[i], "x_re");
111
        file_write(imaginaries[i], "x_im");
112
    }
113
 
114
    /* transform into frequency domain */
115
    fft(reals, imaginaries);
116
 
117
    /* output frequency domain signal to a file */
118
    for(i=0; i<n; i++){
119
        file_write(reals[i], "fft_x_re");
120
        file_write(imaginaries[i], "fft_x_im");
121
    }
122
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.