audio mic logger improvement
added min/max of raw samples to the plot. This will help for debugging microphones with strong negative DC offset.
This commit is contained in:
@@ -58,10 +58,12 @@
|
|||||||
#define PLOT_PRINT(x) DEBUGOUT.print(x)
|
#define PLOT_PRINT(x) DEBUGOUT.print(x)
|
||||||
#define PLOT_PRINTLN(x) DEBUGOUT.println(x)
|
#define PLOT_PRINTLN(x) DEBUGOUT.println(x)
|
||||||
#define PLOT_PRINTF(x...) DEBUGOUT.printf(x)
|
#define PLOT_PRINTF(x...) DEBUGOUT.printf(x)
|
||||||
|
#define PLOT_FLUSH() DEBUGOUT.flush()
|
||||||
#else
|
#else
|
||||||
#define PLOT_PRINT(x)
|
#define PLOT_PRINT(x)
|
||||||
#define PLOT_PRINTLN(x)
|
#define PLOT_PRINTLN(x)
|
||||||
#define PLOT_PRINTF(x...)
|
#define PLOT_PRINTF(x...)
|
||||||
|
#define PLOT_FLUSH()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// use audio source class (ESP32 specific)
|
// use audio source class (ESP32 specific)
|
||||||
@@ -141,6 +143,15 @@ static unsigned long timeOfPeak = 0; // time of last sample peak detection.
|
|||||||
static void detectSamplePeak(void); // peak detection function (needs scaled FFT reasults in vReal[])
|
static void detectSamplePeak(void); // peak detection function (needs scaled FFT reasults in vReal[])
|
||||||
static void autoResetPeak(void); // peak auto-reset function
|
static void autoResetPeak(void); // peak auto-reset function
|
||||||
|
|
||||||
|
// shared vars for debugging
|
||||||
|
#ifdef MIC_LOGGER
|
||||||
|
static volatile float micReal_min = 0.0f; // MicIn data min from last batch of samples
|
||||||
|
static volatile float micReal_max = 0.0f; // MicIn data max from last batch of samples
|
||||||
|
#if 0
|
||||||
|
static volatile float micReal_min2 = 0.0f; // MicIn data min from last batch of samples
|
||||||
|
static volatile float micReal_max2 = 0.0f; // MicIn data max from last batch of samples
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
////////////////////
|
////////////////////
|
||||||
// Begin FFT Code //
|
// Begin FFT Code //
|
||||||
@@ -331,6 +342,19 @@ void FFTcode(void * parameter)
|
|||||||
|
|
||||||
xLastWakeTime = xTaskGetTickCount(); // update "last unblocked time" for vTaskDelay
|
xLastWakeTime = xTaskGetTickCount(); // update "last unblocked time" for vTaskDelay
|
||||||
|
|
||||||
|
#ifdef MIC_LOGGER
|
||||||
|
float datMin = 0.0f;
|
||||||
|
float datMax = 0.0f;
|
||||||
|
for (int i=0; i < samplesFFT; i++) {
|
||||||
|
if (i==0) {
|
||||||
|
datMin = datMax = vReal[i];
|
||||||
|
} else {
|
||||||
|
if (datMin > vReal[i]) datMin = vReal[i];
|
||||||
|
if (datMax < vReal[i]) datMax = vReal[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// band pass filter - can reduce noise floor by a factor of 50
|
// band pass filter - can reduce noise floor by a factor of 50
|
||||||
// downside: frequencies below 100Hz will be ignored
|
// downside: frequencies below 100Hz will be ignored
|
||||||
if (useBandPassFilter) runMicFilter(samplesFFT, vReal);
|
if (useBandPassFilter) runMicFilter(samplesFFT, vReal);
|
||||||
@@ -347,7 +371,23 @@ void FFTcode(void * parameter)
|
|||||||
// release highest sample to volume reactive effects early - not strictly necessary here - could also be done at the end of the function
|
// release highest sample to volume reactive effects early - not strictly necessary here - could also be done at the end of the function
|
||||||
// early release allows the filters (getSample() and agcAvg()) to work with fresh values - we will have matching gain and noise gate values when we want to process the FFT results.
|
// early release allows the filters (getSample() and agcAvg()) to work with fresh values - we will have matching gain and noise gate values when we want to process the FFT results.
|
||||||
micDataReal = maxSample;
|
micDataReal = maxSample;
|
||||||
|
#ifdef MIC_LOGGER
|
||||||
|
micReal_min = datMin;
|
||||||
|
micReal_max = datMax;
|
||||||
|
#if 0
|
||||||
|
// compute mix/max again after filering - usefull for filter debugging
|
||||||
|
for (int i=0; i < samplesFFT; i++) {
|
||||||
|
if (i==0) {
|
||||||
|
datMin = datMax = vReal[i];
|
||||||
|
} else {
|
||||||
|
if (datMin > vReal[i]) datMin = vReal[i];
|
||||||
|
if (datMax < vReal[i]) datMax = vReal[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
micReal_min2 = datMin;
|
||||||
|
micReal_max2 = datMax;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
// run FFT (takes 3-5ms on ESP32)
|
// run FFT (takes 3-5ms on ESP32)
|
||||||
//if (fabsf(sampleAvg) > 0.25f) { // noise gate open
|
//if (fabsf(sampleAvg) > 0.25f) { // noise gate open
|
||||||
if (fabsf(volumeSmth) > 0.25f) { // noise gate open
|
if (fabsf(volumeSmth) > 0.25f) { // noise gate open
|
||||||
@@ -772,10 +812,15 @@ class AudioReactive : public Usermod {
|
|||||||
if (disableSoundProcessing && (!udpSyncConnected || ((audioSyncEnabled & 0x02) == 0))) return; // no audio availeable
|
if (disableSoundProcessing && (!udpSyncConnected || ((audioSyncEnabled & 0x02) == 0))) return; // no audio availeable
|
||||||
#ifdef MIC_LOGGER
|
#ifdef MIC_LOGGER
|
||||||
// Debugging functions for audio input and sound processing. Comment out the values you want to see
|
// Debugging functions for audio input and sound processing. Comment out the values you want to see
|
||||||
|
PLOT_PRINT("micMin:"); PLOT_PRINT(micReal_min); PLOT_PRINT("\t");
|
||||||
|
PLOT_PRINT("micMax:"); PLOT_PRINT(micReal_max); PLOT_PRINT("\t");
|
||||||
|
//PLOT_PRINT("micDC:"); PLOT_PRINT((micReal_min + micReal_max)/2.0f);PLOT_PRINT("\t");
|
||||||
PLOT_PRINT("micReal:"); PLOT_PRINT(micDataReal); PLOT_PRINT("\t");
|
PLOT_PRINT("micReal:"); PLOT_PRINT(micDataReal); PLOT_PRINT("\t");
|
||||||
PLOT_PRINT("volumeSmth:"); PLOT_PRINT(volumeSmth); PLOT_PRINT("\t");
|
PLOT_PRINT("volumeSmth:"); PLOT_PRINT(volumeSmth); PLOT_PRINT("\t");
|
||||||
//PLOT_PRINT("volumeRaw:"); PLOT_PRINT(volumeRaw); PLOT_PRINT("\t");
|
//PLOT_PRINT("volumeRaw:"); PLOT_PRINT(volumeRaw); PLOT_PRINT("\t");
|
||||||
PLOT_PRINT("DC_Level:"); PLOT_PRINT(micLev); PLOT_PRINT("\t");
|
PLOT_PRINT("DC_Level:"); PLOT_PRINT(micLev); PLOT_PRINT("\t");
|
||||||
|
// //PLOT_PRINT("filtmicMin:"); PLOT_PRINT(micReal_min2); PLOT_PRINT("\t");
|
||||||
|
// //PLOT_PRINT("filtmicMax:"); PLOT_PRINT(micReal_max2); PLOT_PRINT("\t");
|
||||||
//PLOT_PRINT("sampleAgc:"); PLOT_PRINT(sampleAgc); PLOT_PRINT("\t");
|
//PLOT_PRINT("sampleAgc:"); PLOT_PRINT(sampleAgc); PLOT_PRINT("\t");
|
||||||
//PLOT_PRINT("sampleAvg:"); PLOT_PRINT(sampleAvg); PLOT_PRINT("\t");
|
//PLOT_PRINT("sampleAvg:"); PLOT_PRINT(sampleAvg); PLOT_PRINT("\t");
|
||||||
//PLOT_PRINT("sampleReal:"); PLOT_PRINT(sampleReal); PLOT_PRINT("\t");
|
//PLOT_PRINT("sampleReal:"); PLOT_PRINT(sampleReal); PLOT_PRINT("\t");
|
||||||
@@ -785,6 +830,7 @@ class AudioReactive : public Usermod {
|
|||||||
//PLOT_PRINT("samplePeak:"); PLOT_PRINT((samplePeak!=0) ? 128:0); PLOT_PRINT("\t");
|
//PLOT_PRINT("samplePeak:"); PLOT_PRINT((samplePeak!=0) ? 128:0); PLOT_PRINT("\t");
|
||||||
//PLOT_PRINT("multAgc:"); PLOT_PRINT(multAgc, 4); PLOT_PRINT("\t");
|
//PLOT_PRINT("multAgc:"); PLOT_PRINT(multAgc, 4); PLOT_PRINT("\t");
|
||||||
PLOT_PRINTLN();
|
PLOT_PRINTLN();
|
||||||
|
PLOT_FLUSH();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FFT_SAMPLING_LOG
|
#ifdef FFT_SAMPLING_LOG
|
||||||
|
|||||||
Reference in New Issue
Block a user