Sine wave, mic 1+2 tests, audio buf size reduced

- sine wave with freq modulation
- Sound select 7,8: mic 1,2
- audio buf size reduced to reduce delay from mic to headphone
master
unicod 1 week ago
parent 19bf2b0766
commit 57dab2bb0f

@ -70,7 +70,7 @@ uint32_t I2S2TxDmaBuf[I2S2_TXDMA_BUF_SAMPLE_CNT][2] = {0};
#define AUDIO_TX_CHAN_CNT 2 // Audio channel count for sending on RS485 bus
#define AUDIO_BUF_SAMPLE_CNT 1024 // Audio buffer size in samples (per channel)
#define AUDIO_BUF_SAMPLE_CNT 256 // Audio buffer size in samples (per channel)
int16_t AudioChanBuf[AUDIO_BUF_SAMPLE_CNT]; // Audio sample buffer for each channel, filled by audio ADC task and consumed by RS485 bus task. Each sample is 16-bit signed integer.
uint16_t AudioWrPos = 0; // Write position in audio buffer (in samples)
@ -233,12 +233,16 @@ void Fill_I2S_Buffer(uint32_t *buf, uint32_t start_sample, uint32_t sample_count
switch (ChSel) {
case 0:
case 1:
case 2: {
static uint16_t Phase = 0;
pcmsample = Wave_Sin[Phase] / 4; // sine waveform
uint16_t phase_inc = (ChSel == 0) ? 4 : ((ChSel == 1) ? 8 : 16); // different frequency for different channel selection
Phase = (Phase + phase_inc) % ARRAY_COUNT(Wave_Sin);
case 1: {
static uint32_t Phase = 0;
static uint32_t PhaseInc = 4UL << 14; // phase increment in 8.8 fixed point (4 means 4 samples per cycle, i.e. 1kHz at 32kHz sample rate)
static int16_t IncDir = 1; // phase increment direction for modulation: -1 or +1
pcmsample = Wave_Sin[Phase >> 14]; // sine waveform
pcmsample = pcmsample / 4; // reduce amplitude
Phase = (Phase + PhaseInc) % (ARRAY_COUNT(Wave_Sin) << 14); // phase accumulator with wrap-around
if (ChSel) PhaseInc += IncDir; // modulate frequency by changing phase increment
if (PhaseInc < ( 4UL << 14)) IncDir = 1; // minimum frequency limit (4 samples per cycle)
if (PhaseInc > (16UL << 14)) IncDir = -1;
}break;
case 3:
case 4:
@ -254,7 +258,8 @@ void Fill_I2S_Buffer(uint32_t *buf, uint32_t start_sample, uint32_t sample_count
if (SoundIdx >= ARRAY_COUNT(Sound_DE)) SoundIdx = 0;
pcmsample = s << 8; // 8-bit PCM in MSB
}break;
case 7: {
case 7:
case 8: {
if (AudioDatCnt < (AUDIO_BUF_SAMPLE_CNT * 1 / 4)) { // too few samples in input buffer
if (doubling == 0) doubling = 10;
}
@ -341,7 +346,7 @@ void Proc_I2S_Buffer(uint32_t *buf, uint32_t start_sample, uint32_t sample_count
uint32_t pos = (start_sample + i) * 2; // Stereo: L,R
int16_t left = buf[pos + 0] >> 16; // convert back to 16-bit sample from 32-bit left justified
int16_t right = buf[pos + 1] >> 16; // convert back to 16-bit sample from 32-bit left justified
int16_t sample = right;
int16_t sample = (ChSel == 7) ? left : right;
if (AudioDatCnt < AUDIO_BUF_SAMPLE_CNT-1) {
AudioDatCnt++;
AudioWrPos++; // increment position

Loading…
Cancel
Save