- optimize buffer sizes for latency and synchronization and i2s

- drop ADF pipeline stuff related to playback, this introduced too much non deterministic delay
- add fast median calculation component
- increase LWIP buffers
This commit is contained in:
Carlos
2021-04-22 18:15:21 +02:00
Unverified
parent 8fbe932bea
commit 20c062b9ab
9 changed files with 1038 additions and 237 deletions

View File

@@ -0,0 +1,3 @@
idf_component_register(SRCS "MedianFilter.c"
INCLUDE_DIRS "include")

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Alexandru Bogdan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,89 @@
/*
* MedianFilter.c
*
* Created on: May 19, 2018
* Author: alexandru.bogdan
*/
#include "MedianFilter.h"
int MEDIANFILTER_Init(sMedianFilter_t *medianFilter)
{
if(medianFilter && medianFilter->medianBuffer &&
(medianFilter->numNodes % 2) && (medianFilter->numNodes > 1))
{
//initialize buffer nodes
for(unsigned int i = 0; i < medianFilter->numNodes; i++)
{
medianFilter->medianBuffer[i].value = 0;
medianFilter->medianBuffer[i].nextAge = &medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes];
medianFilter->medianBuffer[i].nextValue = &medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes];
medianFilter->medianBuffer[(i + 1) % medianFilter->numNodes].prevValue = &medianFilter->medianBuffer[i];
}
//initialize heads
medianFilter->ageHead = medianFilter->medianBuffer;
medianFilter->valueHead = medianFilter->medianBuffer;
medianFilter->medianHead = &medianFilter->medianBuffer[medianFilter->numNodes / 2];
return 0;
}
return -1;
}
int MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int sample)
{
unsigned int i;
sMedianNode_t *newNode, *it;
if(medianFilter->ageHead == medianFilter->valueHead)
{ //if oldest node is also the smallest node, increment value head
medianFilter->valueHead = medianFilter->valueHead->nextValue;
}
if((medianFilter->ageHead == medianFilter->medianHead) ||
(medianFilter->ageHead->value > medianFilter->medianHead->value))
{ //prepare for median correction
medianFilter->medianHead = medianFilter->medianHead->prevValue;
}
//replace age head with new sample
newNode = medianFilter->ageHead;
newNode->value = sample;
//remove age head from list
medianFilter->ageHead->nextValue->prevValue = medianFilter->ageHead->prevValue;
medianFilter->ageHead->prevValue->nextValue = medianFilter->ageHead->nextValue;
//increment age head
medianFilter->ageHead = medianFilter->ageHead->nextAge;
//find new node position
it = medianFilter->valueHead; //set iterator as value head
for(i = 0; i < medianFilter->numNodes - 1; i++)
{
if(sample < it->value)
{
if(i == 0)
{ //replace value head if new node is the smallest
medianFilter->valueHead = newNode;
}
break;
}
it = it->nextValue;
}
//insert new node in list
it->prevValue->nextValue = newNode;
newNode->prevValue = it->prevValue;
it->prevValue = newNode;
newNode->nextValue = it;
//adjust median node
if(i >= (medianFilter->numNodes / 2))
{
medianFilter->medianHead = medianFilter->medianHead->nextValue;
}
return medianFilter->medianHead->value;
}

View File

@@ -0,0 +1,2 @@
COMPONENT_SRCDIRS := .
# CFLAGS +=

View File

@@ -0,0 +1,39 @@
/*
* MedianFilter.h
*
* Created on: May 19, 2018
* Author: alexandru.bogdan
*/
#ifndef MEDIANFILTER_H_
#define MEDIANFILTER_H_
#ifdef __cplusplus
extern "C" {
#endif
typedef struct sMedianNode
{
int value; //sample value
struct sMedianNode *nextAge; //pointer to next oldest value
struct sMedianNode *nextValue; //pointer to next smallest value
struct sMedianNode *prevValue; //pointer to previous smallest value
} sMedianNode_t;
typedef struct
{
unsigned int numNodes; //median node buffer length
sMedianNode_t *medianBuffer; //median node buffer
sMedianNode_t *ageHead; //pointer to oldest value
sMedianNode_t *valueHead; //pointer to smallest value
sMedianNode_t *medianHead; //pointer to median value
} sMedianFilter_t;
int MEDIANFILTER_Init(sMedianFilter_t *medianFilter);
int MEDIANFILTER_Insert(sMedianFilter_t *medianFilter, int sample);
#ifdef __cplusplus
}
#endif
#endif // MEDIANFILTER_H_

View File

@@ -0,0 +1,28 @@
#include "MedianFilter.h"
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define NUM_ELEMENTS 7
static sMedianFilter_t medianFilter;
static sMedianNode_t medianBuffer[NUM_ELEMENTS];
int median_example(void)
{
medianFilter.numNodes = NUM_ELEMENTS;
medianFilter.medianBuffer = medianBuffer;
MEDIANFILTER_Init(&medianFilter);
while(1)
{
int newValue = rand() % 10;
int medianValue = MEDIANFILTER_Insert(&medianFilter, newValue);
printf("New value: %d \tMedian value: %d\r\n", newValue, medianValue);
sleep(1);
}
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -646,7 +646,7 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y
# Wi-Fi
#
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=12
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=64
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=128
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y
# CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER is not set
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0
@@ -869,7 +869,7 @@ CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y
CONFIG_LWIP_TCP_MAXRTX=12
CONFIG_LWIP_TCP_SYNMAXRTX=6
CONFIG_LWIP_TCP_MSS=1440
CONFIG_LWIP_TCP_TMR_INTERVAL=250
CONFIG_LWIP_TCP_TMR_INTERVAL=100
CONFIG_LWIP_TCP_MSL=60000
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=18432
CONFIG_LWIP_TCP_WND_DEFAULT=65534

View File

@@ -422,12 +422,10 @@ CONFIG_SPIRAM=y
CONFIG_SPIRAM_BOOT_INIT=y
# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set
# CONFIG_SPIRAM_USE_MEMMAP is not set
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
CONFIG_SPIRAM_USE_MALLOC=y
CONFIG_SPIRAM_USE_CAPS_ALLOC=y
# CONFIG_SPIRAM_USE_MALLOC is not set
CONFIG_SPIRAM_MEMTEST=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384
# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set
CONFIG_SPIRAM_CACHE_WORKAROUND=y
@@ -440,7 +438,6 @@ CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS=y
# end of SPIRAM cache workaround debugging
# CONFIG_SPIRAM_BANKSWITCH_ENABLE is not set
# CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY is not set
# CONFIG_SPIRAM_OCCUPY_HSPI_HOST is not set
CONFIG_SPIRAM_OCCUPY_VSPI_HOST=y
# CONFIG_SPIRAM_OCCUPY_NO_HOST is not set
@@ -649,8 +646,9 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y
# Wi-Fi
#
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=12
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=64
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=128
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y
# CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER is not set
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=12
CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32
@@ -882,6 +880,7 @@ CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
CONFIG_LWIP_TCP_OVERSIZE_MSS=y
# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
# CONFIG_LWIP_WND_SCALE is not set
CONFIG_LWIP_TCP_RTO_TIME=1500
# end of TCP
@@ -1280,7 +1279,7 @@ CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0
CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0
CONFIG_ADC2_DISABLE_DAC=y
CONFIG_SPIRAM_SUPPORT=y
# CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST is not set
CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST=y
CONFIG_TRACEMEM_RESERVE_DRAM=0x0
# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set
CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y