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");
}
|