mirror of
https://github.com/ttrftech/NanoVNA.git
synced 2025-12-06 03:31:59 +01:00
add band pass filter on tlv320aic3204
This commit is contained in:
parent
a563484f38
commit
ab87c813a1
24
dsp.c
24
dsp.c
|
|
@ -8,7 +8,7 @@ int16_t refiq_buf[AUDIO_BUFFER_LEN];
|
||||||
|
|
||||||
int16_t samp_buf[SAMPLE_LEN];
|
int16_t samp_buf[SAMPLE_LEN];
|
||||||
|
|
||||||
|
#if 0
|
||||||
// Bi-Quad IIR Filter state
|
// Bi-Quad IIR Filter state
|
||||||
q15_t bq_state1[4 * 4];
|
q15_t bq_state1[4 * 4];
|
||||||
q15_t bq_state2[4 * 4];
|
q15_t bq_state2[4 * 4];
|
||||||
|
|
@ -22,6 +22,7 @@ q15_t bq_coeffs[] = {
|
||||||
|
|
||||||
arm_biquad_casd_df1_inst_q15 bq1 = { 3, bq_state1, bq_coeffs, 1};
|
arm_biquad_casd_df1_inst_q15 bq1 = { 3, bq_state1, bq_coeffs, 1};
|
||||||
arm_biquad_casd_df1_inst_q15 bq2 = { 3, bq_state2, bq_coeffs, 1};
|
arm_biquad_casd_df1_inst_q15 bq2 = { 3, bq_state2, bq_coeffs, 1};
|
||||||
|
#endif
|
||||||
|
|
||||||
const q15_t hilbert31_coeffs[] = {
|
const q15_t hilbert31_coeffs[] = {
|
||||||
20570, 6125, 2918, 1456, 682, 279, 91, 19
|
20570, 6125, 2918, 1456, 682, 279, 91, 19
|
||||||
|
|
@ -67,6 +68,7 @@ hilbert_transform(void)
|
||||||
src++;
|
src++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* copy last samples as fir state onto buffer */
|
||||||
dst = __SIMD32_CONST(ref_state);
|
dst = __SIMD32_CONST(ref_state);
|
||||||
for (j = 0; j < STATE_LEN / 2; j++) {
|
for (j = 0; j < STATE_LEN / 2; j++) {
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
|
|
@ -109,10 +111,24 @@ void calclate_gamma(float *gamma)
|
||||||
int i;
|
int i;
|
||||||
float rn;
|
float rn;
|
||||||
|
|
||||||
|
int32_t offset_s0 = 0;
|
||||||
|
int32_t offset_r0 = 0;
|
||||||
|
int32_t offset_i0 = 0;
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
int16_t s0 = *s++;
|
offset_s0 += *s++;
|
||||||
int16_t ri = *r++;
|
offset_i0 += *r++;
|
||||||
int16_t rr = *r++;
|
offset_r0 += *r++;
|
||||||
|
}
|
||||||
|
offset_s0 /= len;
|
||||||
|
offset_r0 /= len;
|
||||||
|
offset_i0 /= len;
|
||||||
|
|
||||||
|
r = refiq_buf;
|
||||||
|
s = samp_buf;
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
int16_t s0 = *s++ - offset_s0;
|
||||||
|
int16_t ri = *r++ - offset_i0;
|
||||||
|
int16_t rr = *r++ - offset_r0;
|
||||||
acc_r += (float)(s0 * rr);
|
acc_r += (float)(s0 * rr);
|
||||||
acc_i += (float)(s0 * ri);
|
acc_i += (float)(s0 * ri);
|
||||||
acc_ref += (float)rr*rr + (float)ri*ri;
|
acc_ref += (float)rr*rr + (float)ri*ri;
|
||||||
|
|
|
||||||
|
|
@ -559,7 +559,7 @@ trace_t trace[TRACES_MAX] = {
|
||||||
{ 1, TRC_LOGMAG, 0, RGB565(0,255,255), 0 },
|
{ 1, TRC_LOGMAG, 0, RGB565(0,255,255), 0 },
|
||||||
{ 1, TRC_LOGMAG, 1, RGB565(255,0,40), 0 },
|
{ 1, TRC_LOGMAG, 1, RGB565(255,0,40), 0 },
|
||||||
{ 1, TRC_SMITH, 0, RGB565(0,0,255), 1 },
|
{ 1, TRC_SMITH, 0, RGB565(0,0,255), 1 },
|
||||||
{ 0, TRC_SMITH, 1, RGB565(0,255,0), 1 }
|
{ 1, TRC_PHASE, 1, RGB565(50,255,0), 1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t trace_index[TRACES_MAX][101];
|
uint32_t trace_index[TRACES_MAX][101];
|
||||||
|
|
@ -731,6 +731,7 @@ trace_into_index(int x, int t, int i, float coeff[2])
|
||||||
idx = INDEX(x, y1, i);
|
idx = INDEX(x, y1, i);
|
||||||
break;
|
break;
|
||||||
case TRC_SMITH:
|
case TRC_SMITH:
|
||||||
|
case TRC_ADMIT:
|
||||||
case TRC_POLAR:
|
case TRC_POLAR:
|
||||||
cartesian_scale(coeff[0], coeff[1], &x1, &y1);
|
cartesian_scale(coeff[0], coeff[1], &x1, &y1);
|
||||||
idx = INDEX(x1, y1, i);
|
idx = INDEX(x1, y1, i);
|
||||||
|
|
|
||||||
11
main.c
11
main.c
|
|
@ -46,7 +46,7 @@ static MUTEX_DECL(mutex);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static THD_WORKING_AREA(waThread1, 400);
|
static THD_WORKING_AREA(waThread1, 384);
|
||||||
static THD_FUNCTION(Thread1, arg)
|
static THD_FUNCTION(Thread1, arg)
|
||||||
{
|
{
|
||||||
(void)arg;
|
(void)arg;
|
||||||
|
|
@ -347,7 +347,7 @@ static void cmd_scan(BaseSequentialStream *chp, int argc, char *argv[])
|
||||||
delay += 2;
|
delay += 2;
|
||||||
for (i = 0; i < sweep_points; i++) {
|
for (i = 0; i < sweep_points; i++) {
|
||||||
freq = freq + step;
|
freq = freq + step;
|
||||||
wait_count = delay;
|
wait_count = delay + 1;
|
||||||
while (wait_count)
|
while (wait_count)
|
||||||
;
|
;
|
||||||
//dsp_disabled = TRUE;
|
//dsp_disabled = TRUE;
|
||||||
|
|
@ -371,7 +371,7 @@ void scan_lcd(void)
|
||||||
delay = set_frequency(frequencies[0]);
|
delay = set_frequency(frequencies[0]);
|
||||||
delay += 2;
|
delay += 2;
|
||||||
for (i = 0; i < sweep_points; i++) {
|
for (i = 0; i < sweep_points; i++) {
|
||||||
wait_count = delay;
|
wait_count = delay + 1;
|
||||||
tlv320aic3204_select_in3();
|
tlv320aic3204_select_in3();
|
||||||
while (wait_count)
|
while (wait_count)
|
||||||
;
|
;
|
||||||
|
|
@ -381,7 +381,7 @@ void scan_lcd(void)
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
tlv320aic3204_select_in1();
|
tlv320aic3204_select_in1();
|
||||||
wait_count = 2;
|
wait_count = 2 + 1;
|
||||||
while (wait_count)
|
while (wait_count)
|
||||||
;
|
;
|
||||||
__disable_irq();
|
__disable_irq();
|
||||||
|
|
@ -862,7 +862,7 @@ static void cmd_stat(BaseSequentialStream *chp, int argc, char *argv[])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(400)
|
#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(460)
|
||||||
|
|
||||||
static const ShellCommand commands[] =
|
static const ShellCommand commands[] =
|
||||||
{
|
{
|
||||||
|
|
@ -940,6 +940,7 @@ int main(void)
|
||||||
*/
|
*/
|
||||||
ili9341_init();
|
ili9341_init();
|
||||||
|
|
||||||
|
/* restore config and calibration data from flash memory */
|
||||||
caldata_recall();
|
caldata_recall();
|
||||||
|
|
||||||
set_sweep(freq_start, freq_stop);
|
set_sweep(freq_start, freq_stop);
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ extern void tlv320aic3204_set_volume(int gain);
|
||||||
extern void tlv320aic3204_agc_config(tlv320aic3204_agc_config_t *conf);
|
extern void tlv320aic3204_agc_config(tlv320aic3204_agc_config_t *conf);
|
||||||
extern void tlv320aic3204_select_in1(void);
|
extern void tlv320aic3204_select_in1(void);
|
||||||
extern void tlv320aic3204_select_in3(void);
|
extern void tlv320aic3204_select_in3(void);
|
||||||
|
extern void tlv320aic3204_adc_filter_enable(int enable);
|
||||||
|
|
||||||
extern void ui_init(void);
|
extern void ui_init(void);
|
||||||
extern void ui_process(void);
|
extern void ui_process(void);
|
||||||
|
|
|
||||||
165
tlv320aic3204.c
165
tlv320aic3204.c
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#define wait_ms(ms) chThdSleepMilliseconds(ms)
|
#define wait_ms(ms) chThdSleepMilliseconds(ms)
|
||||||
|
|
||||||
|
void tlv320aic3204_config_adc_filter(void);
|
||||||
|
|
||||||
void tlv320aic3204_init(void)
|
void tlv320aic3204_init(void)
|
||||||
{
|
{
|
||||||
|
|
@ -69,6 +70,9 @@ void tlv320aic3204_init(void)
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
||||||
I2CWrite(AIC3204_ADDR, 0x51, 0xc0); /* Power up Left and Right ADC Channels */
|
I2CWrite(AIC3204_ADDR, 0x51, 0xc0); /* Power up Left and Right ADC Channels */
|
||||||
I2CWrite(AIC3204_ADDR, 0x52, 0x00); /* Unmute Left and Right ADC Digital Volume Control */
|
I2CWrite(AIC3204_ADDR, 0x52, 0x00); /* Unmute Left and Right ADC Digital Volume Control */
|
||||||
|
|
||||||
|
tlv320aic3204_config_adc_filter();
|
||||||
|
tlv320aic3204_adc_filter_enable(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tlv320aic3204_select_in3(void)
|
void tlv320aic3204_select_in3(void)
|
||||||
|
|
@ -87,6 +91,167 @@ void tlv320aic3204_select_in1(void)
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tlv320aic3204_adc_filter_enable(int enable)
|
||||||
|
{
|
||||||
|
if (enable)
|
||||||
|
I2CWrite(AIC3204_ADDR, 0x3d, 0x02); /* Select ADC PRB_R2 */
|
||||||
|
else
|
||||||
|
I2CWrite(AIC3204_ADDR, 0x3d, 0x01); /* Select ADC PRB_R1 */
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* bb, aa = signal.ellip(5, 0.1, 100, (4800.0/24000, 5200.0/24000), 'bandpass') */
|
||||||
|
const uint8_t adc_filter_config[] = {
|
||||||
|
/* len, page, reg, data.... */
|
||||||
|
|
||||||
|
/* left channel C7 - C31 */
|
||||||
|
92, 8, 36,
|
||||||
|
/* Pg8 Reg36-127 */
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0xf5, 0xeb, 0x1c, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x63, 0x04, 0xf8, 0x00,
|
||||||
|
0x82, 0xf3, 0x20, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0xf8, 0xac, 0x58, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x64, 0x26, 0x9e, 0x00,
|
||||||
|
0x83, 0x9c, 0x9a, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0xf5, 0x92, 0x43, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x65, 0xcc, 0x37, 0x00,
|
||||||
|
0x82, 0xd1, 0x6e, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0xf7, 0xd5, 0x05, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x67, 0x48, 0x63, 0x00,
|
||||||
|
0x81, 0x0a, 0xab, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xf4, 0x4c, 0x16, 0x00,
|
||||||
|
8, 9, 8,
|
||||||
|
/* Pg9 Reg 8-15 */
|
||||||
|
0x62, 0xdd, 0xc7, 0x00,
|
||||||
|
0x81, 0x1e, 0xf9, 0x00,
|
||||||
|
|
||||||
|
/* right channel C39 - C63 */
|
||||||
|
84, 9, 44,
|
||||||
|
/* Pg9 Reg 44-127 */
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0xf5, 0xeb, 0x1c, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x63, 0x04, 0xf8, 0x00,
|
||||||
|
0x82, 0xf3, 0x20, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0xf8, 0xac, 0x58, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x64, 0x26, 0x9e, 0x00,
|
||||||
|
0x83, 0x9c, 0x9a, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0xf5, 0x92, 0x43, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x65, 0xcc, 0x37, 0x00,
|
||||||
|
0x82, 0xd1, 0x6e, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0xf7, 0xd5, 0x05, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
0x67, 0x48, 0x63, 0x00,
|
||||||
|
0x81, 0x0a, 0xab, 0x00,
|
||||||
|
0x0b, 0xb3, 0xea, 0x00,
|
||||||
|
|
||||||
|
16, 10, 8,
|
||||||
|
/* Pg10 Reg 8-23 */
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xf4, 0x4c, 0x16, 0x00,
|
||||||
|
0x62, 0xdd, 0xc7, 0x00,
|
||||||
|
0x81, 0x1e, 0xf9, 0x00,
|
||||||
|
0 /* sentinel */
|
||||||
|
};
|
||||||
|
#elsif 0
|
||||||
|
/* bb, aa = signal.ellip(2, 0.1, 100, (4500.0/24000, 5500.0/24000), 'bandpass') */
|
||||||
|
const uint8_t adc_filter_config[] = {
|
||||||
|
/* len, page, reg, data.... */
|
||||||
|
/* left channel C7 - C31 */
|
||||||
|
40, 8, 36,
|
||||||
|
/* Pg8 Reg36-127 */
|
||||||
|
0x02, 0x65, 0xce, 0x00,
|
||||||
|
0x02, 0x65, 0x1b, 0x00,
|
||||||
|
0x02, 0x65, 0xce, 0x00,
|
||||||
|
0x65, 0x27, 0x96, 0x00,
|
||||||
|
0x90, 0x4b, 0xd5, 0x00,
|
||||||
|
0x52, 0x46, 0xbb, 0x00,
|
||||||
|
0xad, 0xb9, 0x96, 0x00,
|
||||||
|
0x52, 0x46, 0xbb, 0x00,
|
||||||
|
0x56, 0x5f, 0xd2, 0x00,
|
||||||
|
0x94, 0x52, 0x41, 0x00,
|
||||||
|
/* right channel C39 - C63 */
|
||||||
|
40, 9, 44,
|
||||||
|
/* Pg9 Reg 44-127 */
|
||||||
|
0x02, 0x65, 0xce, 0x00,
|
||||||
|
0x02, 0x65, 0x1b, 0x00,
|
||||||
|
0x02, 0x65, 0xce, 0x00,
|
||||||
|
0x65, 0x27, 0x96, 0x00,
|
||||||
|
0x90, 0x4b, 0xd5, 0x00,
|
||||||
|
0x52, 0x46, 0xbb, 0x00,
|
||||||
|
0xad, 0xb9, 0x96, 0x00,
|
||||||
|
0x52, 0x46, 0xbb, 0x00,
|
||||||
|
0x56, 0x5f, 0xd2, 0x00,
|
||||||
|
0x94, 0x52, 0x41, 0x00,
|
||||||
|
0 /* sentinel */
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
/* bb, aa = signal.bessel(2, (4500.0/24000, 5500.0/24000), 'bandpass') */
|
||||||
|
const uint8_t adc_filter_config[] = {
|
||||||
|
/* len, page, reg, data.... */
|
||||||
|
/* left channel C7 - C31 */
|
||||||
|
40, 8, 36,
|
||||||
|
/* Pg8 Reg36-127 */
|
||||||
|
0x02, 0x9b, 0xed, 0x00,
|
||||||
|
0x02, 0x9b, 0xed, 0x00,
|
||||||
|
0x02, 0x9b, 0xed, 0x00,
|
||||||
|
0x5d, 0x91, 0x0f, 0x00,
|
||||||
|
0x8e, 0x4b, 0x9a, 0x00,
|
||||||
|
0x18, 0x22, 0x1d, 0x00,
|
||||||
|
0xe7, 0xdd, 0xe3, 0x00,
|
||||||
|
0x18, 0x22, 0x1d, 0x00,
|
||||||
|
0x62, 0xd9, 0x9b, 0x00,
|
||||||
|
0x8d, 0x2c, 0xda, 0x00,
|
||||||
|
|
||||||
|
/* right channel C39 - C63 */
|
||||||
|
40, 9, 44,
|
||||||
|
/* Pg9 Reg 44-127 */
|
||||||
|
0x02, 0x9b, 0xed, 0x00,
|
||||||
|
0x02, 0x9b, 0xed, 0x00,
|
||||||
|
0x02, 0x9b, 0xed, 0x00,
|
||||||
|
0x5d, 0x91, 0x0f, 0x00,
|
||||||
|
0x8e, 0x4b, 0x9a, 0x00,
|
||||||
|
0x18, 0x22, 0x1d, 0x00,
|
||||||
|
0xe7, 0xdd, 0xe3, 0x00,
|
||||||
|
0x18, 0x22, 0x1d, 0x00,
|
||||||
|
0x62, 0xd9, 0x9b, 0x00,
|
||||||
|
0x8d, 0x2c, 0xda, 0x00,
|
||||||
|
0 /* sentinel */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void tlv320aic3204_config_adc_filter(void)
|
||||||
|
{
|
||||||
|
const uint8_t *p = adc_filter_config;
|
||||||
|
|
||||||
|
while (*p != 0) {
|
||||||
|
uint8_t len = *p++;
|
||||||
|
uint8_t page = *p++;
|
||||||
|
uint8_t reg = *p++;
|
||||||
|
I2CWrite(AIC3204_ADDR, 0x00, page);
|
||||||
|
while (len-- > 0)
|
||||||
|
I2CWrite(AIC3204_ADDR, reg++, *p++);
|
||||||
|
}
|
||||||
|
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* page 0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void tlv320aic3204_set_gain(int lgain, int rgain)
|
void tlv320aic3204_set_gain(int lgain, int rgain)
|
||||||
{
|
{
|
||||||
if (lgain < 0)
|
if (lgain < 0)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue