- 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:
3
components/libmedian/CMakeLists.txt
Normal file
3
components/libmedian/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
idf_component_register(SRCS "MedianFilter.c"
|
||||
INCLUDE_DIRS "include")
|
||||
|
||||
21
components/libmedian/LICENSE
Normal file
21
components/libmedian/LICENSE
Normal 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.
|
||||
89
components/libmedian/MedianFilter.c
Normal file
89
components/libmedian/MedianFilter.c
Normal 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;
|
||||
}
|
||||
|
||||
2
components/libmedian/component.mk
Normal file
2
components/libmedian/component.mk
Normal file
@@ -0,0 +1,2 @@
|
||||
COMPONENT_SRCDIRS := .
|
||||
# CFLAGS +=
|
||||
39
components/libmedian/include/MedianFilter.h
Normal file
39
components/libmedian/include/MedianFilter.h
Normal 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_
|
||||
28
components/libmedian/median_example.txt
Normal file
28
components/libmedian/median_example.txt
Normal 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;
|
||||
}
|
||||
1074
main/main.c
1074
main/main.c
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user