optek_echo_reverb_configuration.c
5.7 KB
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include "os_config.h"
#include "c_def.h"
#include "debug.h"
#include "oem.h"
#include "app_sdram.h"
#include"optek_hifi2_echo_reverb.h"
#ifdef MIC_REVERB
/*mic reverb*/
#define MIC_DELAY_FIFO_SIZE (18 * 64)//64ms
#define MIC_REVERB_SAMPLES 8
#define MAX_TAPS (8+2)
#if 1
#define COMB1_DELAY 783
#define COMB2_DELAY 801
#define COMB3_DELAY 849
#define COMB4_DELAY 897
#define COMB5_DELAY 967
#define COMB6_DELAY 997
#define COMB7_DELAY 1073
#define COMB8_DELAY 1117
#define AFH1_DELAY 371
#define AFH2_DELAY 499
#else
#define COMB1_DELAY 583
#define COMB2_DELAY 601
#define COMB3_DELAY 649
#define COMB4_DELAY 697
#define COMB5_DELAY 767
#define COMB6_DELAY 797
#define COMB7_DELAY 873
#define COMB8_DELAY 917
#define AFH1_DELAY 371
#define AFH2_DELAY 499
#endif
/*gains: 0x08000000 = 1 MAX = 0x80000000-1 */
#define MIC_GAIN (0x08000000)
#define EARLY_GAIN (0x08000000>>4)
#define COMB1_GAIN (0x07b00000)
#define COMB2_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB2_DELAY)
#define COMB3_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB3_DELAY)
#define COMB4_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB4_DELAY)
#define COMB5_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB5_DELAY)
#define COMB6_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB6_DELAY)
#define COMB7_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB7_DELAY)
#define COMB8_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB8_DELAY)
#define AFH1_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*AFH1_DELAY)
#define AFH2_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*AFH2_DELAY)
const int mic_reverb_gains[2+MAX_TAPS] = {
MIC_GAIN,
EARLY_GAIN,
COMB1_GAIN,
COMB2_GAIN,
COMB3_GAIN,
COMB4_GAIN,
COMB5_GAIN,
COMB6_GAIN,
COMB7_GAIN,
COMB8_GAIN,
AFH1_GAIN,
AFH2_GAIN
};
short mic_reverb_delays[MAX_TAPS] = {COMB1_DELAY, COMB2_DELAY, COMB3_DELAY, COMB4_DELAY,COMB5_DELAY, COMB6_DELAY, COMB7_DELAY, COMB8_DELAY, AFH1_DELAY,AFH2_DELAY};
#define OPTEK_DAPP_MAX_REVERB_BAND 4
const int coef_reverb_band[OPTEK_DAPP_MAX_REVERB_BAND*6] = {
#if 0
0x40000000,0x03a92bc0,0x07525780,0x03a92bc0,0xb1fde187,0x1ca6cd7b,
0x40000000,0x03a92bc0,0x07525780,0x03a92bc0,0xb1fde187,0x1ca6cd7b,
#else
0x40000000,0x08cdcd57,0xfeedd47c,0x02700771,0xa383e792,0x26a7c1b3,
0x40000000,0x08cdcd57,0xfeedd47c,0x02700771,0xa383e792,0x26a7c1b3,
0x40000000,0x3fb08ec4,0x80d39383,0x3f7c45d7,0x80d6988c,0x3f2fd9a6,
0x40000000,0x3f8cdd00,0x80e645ff,0x3f8cdd00,0x80e71522,0x3f1a8923,
#endif
};
int reverb_gain = 0x08000000;
void *mic_reverb_obj = NULL;
void optek_mic_set_reverb_gain(void * objmem,int reverb_gain)
{
if (objmem == NULL) return;
DBG_Printf("reverb gain:0x%x\n",(mic_reverb_gains[1]>>11)*(reverb_gain>>16));
optek_mic_set_early_gain(objmem,(mic_reverb_gains[1]>>11)*(reverb_gain>>16));
}
U32 reverb_mem[1024*37/4];
void optek_hifi2_reverb_init(void)
{
int n_mems;
void *mem_alloced;
n_mems = optek_mic_reverb_alloc(MAX_TAPS,mic_reverb_delays,MIC_DELAY_FIFO_SIZE,MIC_REVERB_SAMPLES,OPTEK_DAPP_MAX_REVERB_BAND);
DBG_Printf("reverb n_mems:%d\n",n_mems);
if (n_mems > sizeof(reverb_mem))
{
mic_reverb_obj = 0;
DBG_Printf("reverb memery fatal error\n");
delayms(6000);
return;
}
mem_alloced = (void *)reverb_mem;
mic_reverb_obj = optek_mic_reverb_open (mem_alloced, mic_reverb_gains, mic_reverb_delays, MAX_TAPS,MIC_DELAY_FIFO_SIZE,
MIC_REVERB_SAMPLES, OPTEK_DAPP_MAX_REVERB_BAND, coef_reverb_band);
optek_mic_set_reverb_gain(mic_reverb_obj,reverb_gain);
}
#endif
#ifdef MIC_ECHO
U32 mic_echo_buffer[20000/4];
void *mic_echo_obj = NULL;
#define ECHO_EARLY_GAIN (0x04000000)
#define ECHO_DECAY_GAIN (0x05000000)
#define MAX_ECHO_DELAY 220//ms
#define INIT_ECHO_DELAY 220//ms
#define SAVE_BUFFER FALSE
#define OPTEK_DAPP_MAX_ECHO_BAND 2
const int coef_echo_band[OPTEK_DAPP_MAX_ECHO_BAND*6] = {
#if 1
0x40000000,0x0B57FB85,0x16AFF70A,0x0B57FB85,0xDF712C0A,0x0DEEC20A,
0x40000000,0x0B57FB85,0x16AFF70A,0x0B57FB85,0xDF712C0A,0x0DEEC20A,
#else
/*
0x40000000,0x08cdcd57,0xfeedd47c,0x02700771,0xa383e792,0x26a7c1b3,
0x40000000,0x08cdcd57,0xfeedd47c,0x02700771,0xa383e792,0x26a7c1b3,
0x40000000,0x3fb08ec4,0x80d39383,0x3f7c45d7,0x80d6988c,0x3f2fd9a6,
0x40000000,0x3f8cdd00,0x80e645ff,0x3f8cdd00,0x80e71522,0x3f1a8923,
*/
#endif
};
void optek_mic_set_echo_gain(void * objmem,int echo_gain)
{
if (objmem == NULL) return;
DBG_Printf("echo gain:0x%x\n",(ECHO_EARLY_GAIN>>11)*(echo_gain>>16));
optek_mic_set_echo_early_gain(objmem,(ECHO_EARLY_GAIN>>11)*(echo_gain>>16));
}
U16 echo_delay_ms = 0;
void optek_mic_set_echo_delayms_plus(void)
{
echo_delay_ms += 10;
if (echo_delay_ms > MAX_ECHO_DELAY)
echo_delay_ms = MAX_ECHO_DELAY;
DBG_Printf("delayms:%d",echo_delay_ms);
optek_mic_set_echo_delayms(mic_echo_obj,echo_delay_ms);
}
void optek_mic_set_echo_delayms_minus(void)
{
if (echo_delay_ms >= 10)
echo_delay_ms -= 10;
else
echo_delay_ms = 0;
DBG_Printf("delayms:%d",echo_delay_ms);
optek_mic_set_echo_delayms(mic_echo_obj,echo_delay_ms);
}
void optek_hifi2_echo_init(void)
{
int n_mems;
void *mem_alloced;
optek_mic_echo_init();
n_mems = optek_mic_echo_alloc(MAX_ECHO_DELAY,SAVE_BUFFER,OPTEK_DAPP_MAX_ECHO_BAND);
DBG_Printf("echo n_mems:%d\n",n_mems);
if (n_mems > sizeof(mic_echo_buffer))
{
mic_echo_obj = 0;
DBG_Printf("echo memery not enough\n");
delayms(6000);
return;
}
echo_delay_ms = INIT_ECHO_DELAY;
mem_alloced = (void *)mic_echo_buffer;
mic_echo_obj = optek_mic_echo_open (mem_alloced,ECHO_EARLY_GAIN,ECHO_DECAY_GAIN,MAX_ECHO_DELAY,SAVE_BUFFER,
OPTEK_DAPP_MAX_ECHO_BAND,coef_echo_band);
optek_mic_set_echo_gain(mic_echo_obj,0x08000000);
optek_mic_set_echo_delayms(mic_echo_obj,echo_delay_ms);
}
#endif