You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
OpenAudio_ArduinoLibrary/examples/TestNoiseBlanker2/TestNoiseBlanker2.ino

123 lines
3.7 KiB

/* TestNoiseBlanker.ino Bob Larkin 20 May 2020
*
* Sine wave plus noise spike test of radioNoiseBlanker_F32
* Feeds input to both 0 and 1 channels (I & Q or L & R).
* The 0 channel controls the noise blanking, but both paths are
* noise-blanked. The function useTwoChannels(true) enables the
* second path. The default case is to use only the 0 path for everything.
*/
#include "AudioStream_F32.h"
#include "OpenAudio_ArduinoLibrary.h"
#include "Arduino.h"
#include "Audio.h"
// ********* CONTROLS *********
// Comment out the next line to use a sine wave plus fake impulse noise
#define INPUT_GWN
// Comment out he next line to input only to the 0 (left) channel
#define TWO_INPUT
//******************************************************************
AudioInputI2S_F32 i2sIn1; // Needed to invole AudioStream_F32
#ifdef INPUT_GWN
AudioSynthGaussian_F32 gwn1;
#else
AudioPlayQueue_F32 playq1;
#endif
radioNoiseBlanker_F32 nb1;
AudioRecordQueue_F32 queue1;
#ifdef INPUT_GWN
AudioConnection_F32 pcord0(gwn1, 0, nb1, 0);
#ifdef TWO_INPUT
AudioConnection_F32 pcord1(gwn1, 0, nb1, 1);
#endif
#else
AudioConnection_F32 pcord0(playq1, 0, nb1, 0);
#ifdef TWO_INPUT
AudioConnection_F32 pcord1(playq1, 0, nb1, 1);
#endif
#endif
// The next two should be identical data outputs. Pick ONLY ONE at a time
// Do not use secon one without TWO_INPUT
AudioConnection_F32 pcord2(nb1, 0, queue1, 0);
//AudioConnection_F32 pcord2(nb1, 1, queue1, 0);
float32_t *pin;
float32_t dt1[128];
float32_t *pq1, *pd1;
int i;
// Fake noise pulses
float32_t pulse[] =
{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.9f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.9f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.9f,
0.9f, 0.9f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.9f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
void setup(void) {
AudioMemory_F32(25);
Serial.begin(300); delay(1000);
Serial.println("*** Test Noise Blanker ***");
#ifdef INPUT_GWN
gwn1.amplitude(0.1);
#endif
// setNoiseBlanker(float threshold, uint16_t nAnticipation, uint16_t nDecay)
nb1.setNoiseBlanker(4.0f, 2, 3);
nb1.showError(1);
#ifdef TWO_INPUT
nb1.useTwoChannel(true); // true enables a path trrough the "1" side
#endif
nb1.enable(true);
#ifndef INPUT_GWN
while(pin == NULL)
pin = playq1.getBuffer();
Serial.println("Input to NB:");
for(int k=0; k<128; k++) { // Signal and noise
pin[k] = pulse[k] + 0.1*sinf(0.6*(float32_t)k);
Serial.println(pin[k], 6);
}
playq1.playBuffer(); // Put 128 data into stream
#endif
queue1.begin();
i = 0;
}
void loop(void) {
// Collect 128 samples and output to Serial
if (queue1.available() >= 1) { // See if it has arrived
pq1 = queue1.readBuffer();
pd1 = &dt1[0];
for(int k=0; k<128; k++) {
*pd1++ = *pq1++;
}
i=1; // data into dt1[]
queue1.freeBuffer();
queue1.end(); // No more data to queue1
}
if(i == 1) {
// Printout 128 samples of the gated signal.
Serial.println("128 NB Output Samples: ");
for (int k=0; k<128; k++) {
Serial.println (dt1[k], 9);
}
i = 2;
}
}