annotate libao2/firfilter.c @ 3483:f1c6716e7554

FIR filter implementation for surround sound lowpass
author steve
date Thu, 13 Dec 2001 23:36:04 +0000
parents
children cc1c879533ee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3483
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
1
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
2 static double desired_7kHz_lowpass[] = {1.0, 0.0};
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
3 static double weights_7kHz_lowpass[] = {0.1, 0.1};
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
4
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
5 double *calc_coefficients_7kHz_lowpass(int rate)
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
6 {
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
7 double *result = (double *)malloc(32*sizeof(double));
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
8 double bands[4];
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
9
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
10 bands[0] = 0.0; bands[1] = 6800.0/rate;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
11 bands[2] = 8500.0/rate; bands[3] = 0.5;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
12
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
13 remez(result, 32, 2, bands,
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
14 desired_7kHz_lowpass, weights_7kHz_lowpass, BANDPASS);
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
15
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
16 return result;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
17 }
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
18
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
19 #if 0
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
20
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
21 int16_t firfilter(int16_t *buf, int pos, int len, int count, double *coefficients)
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
22 {
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
23 double result = 0.0;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
24
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
25 // Back 32 samples, maybe wrapping in buffer.
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
26 pos = (pos+len-count)%len;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
27 // And do the multiply-accumulate
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
28 while (count--) {
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
29 result += buf[pos++] * *coefficients++; pos %= len;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
30 }
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
31 return result;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
32 }
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
33
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
34 #endif
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
35
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
36 int16_t firfilter(int16_t *buf, int pos, int len, int count, double *coefficients)
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
37 {
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
38 double result = 0.0;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
39 int count1, count2;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
40 int16_t *ptr;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
41
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
42 if (pos >= count) {
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
43 pos -= count;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
44 count1 = count; count2 = 0;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
45 }
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
46 else {
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
47 count2 = pos;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
48 count1 = count - pos;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
49 pos = len - count1;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
50 }
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
51 //fprintf(stderr, "pos=%d, count1=%d, count2=%d\n", pos, count1, count2);
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
52
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
53 // high part of window
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
54 ptr = &buf[pos];
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
55 while (count1--) result += *ptr++ * *coefficients++;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
56 // wrapped part of window
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
57 while (count2--) result += *buf++ * *coefficients++;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
58 return result;
f1c6716e7554 FIR filter implementation for surround sound lowpass
steve
parents:
diff changeset
59 }