aboutsummaryrefslogtreecommitdiffstats
path: root/fir1/simple_fir.c
blob: 8f48569ac2153752459bd98ffbbc9842955c1394 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>

double sinc(double x) {
    if (x>-1.0E-5 && x < 1.0E-5) return (1.0);
    return sin(x)/x;
}

int main() {

	const int buf_N=200;
	//int N1 = N/2;
    
    int i=0;
    double h[buf_N],w[buf_N];
    int filter_N=20;
    int even = filter_N ? 0: 1;
    int filter_N1=filter_N/2;
    int filter_FS_hz=10000;
    int filter_FC_hz=2000;
    double omega_c=1.0*filter_FC_hz/filter_FS_hz;
    double arg;
    double dN;

    //nullify all coefficients
    for (i=0;i<filter_N;i++) {
        h[i] = 0.0;
        w[i] = 0.0;
    }

    //sinc the
    for (i=0;i<filter_N;i++) {
        arg = (double)i-(double)(filter_N-1)/2.0;
        h[i] = omega_c * sinc(omega_c*arg*M_PI);
    }


    if (even) filter_N1+=1;

    #if 1
    //rectangular window
    
    for (i=0;i<filter_N1;i++) {
        w[i] = 1.0;
    }
    #endif

    #if 0
    //hamming window
    for (i=0;i<filter_N1;i++) {
        arg = (double)i-(double)(filter_N-1)/2.0;
        w[i] = 0.54+0.46*cos(2*M_PI*arg/filter_N);

    }
    #endif

    #if 0
    //hanning window
    for (i=0;i<filter_N1;i++) {
        arg = (double)i-(double)(filter_N-1)/2.0;
        w[i] = 0.5+(1-0.5)*cos(2*M_PI*arg/filter_N);

    }
    #endif

    #if 0
    //blackman window
    for (i=0;i<filter_N1;i++) {
        arg = (double)i-(double)(filter_N-1)/2.0;
        w[i] = 0.42
        +0.50*cos(2*M_PI*arg/(filter_N-1))
        +0.08*cos(4*M_PI*arg/(filter_N-1));

    }
    #endif

    //flip window
    for (i=0;i<filter_N1;i++) {
        w[filter_N-i-1] = w[i];
    }

    //convolution
    for (i=0;i<filter_N;i++) {
        h[i] = h[i]*w[i];
    }

    
    //print coefficients
    printf("h=[\n");
    for (i=0;i<filter_N;i++) {
        printf("%f\n",h[i]);
    }
    printf("];\n");

}