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/SignalNoise_float/SignalNoise_float.ino

103 lines
3.3 KiB

/* SignalNoise_float.ino Bob Larkin 19 June 2020
*
* Generate White Noise, Pink Noise, Gaussian White Noise and a Sine Wave
* Combine all four in a adding "mixer", send to Codec and to peak/rms.
*
* Following is for all objects enabled (amplitudes non-zero)
* T3.6 Processor load, measured: 10.6%
* T4.0 Processor load, measured: 3.2%
*/
#include "Audio.h"
#include "OpenAudio_ArduinoLibrary.h"
// To work with T4.0 the I2S routine outputs 16-bit integer (I16). Then
// use Audette I16 to F32 convert. Same below for output, in reverse.
AudioInputI2S in1;
AudioSynthNoisePink_F32 pink1;
AudioSynthNoiseWhite_F32 white1;
AudioSynthGaussian_F32 gaussian1;
AudioSynthWaveformSine_F32 sine1;
AudioMixer4_F32 sum1;
AudioConvert_F32toI16 cnvrt1; // Left
AudioConvert_F32toI16 cnvrt2; // Right
AudioOutputI2S i2sOut;
AudioAnalyzePeak_F32 peak1;
AudioAnalyzeRMS_F32 rms1;
AudioControlSGTL5000 codec;
AudioConnection_F32 connect1(pink1, 0, sum1, 0);
AudioConnection_F32 connect2(white1, 0, sum1, 1);
AudioConnection_F32 connect3(gaussian1, 0, sum1, 2);
AudioConnection_F32 connect4(sine1, 0, sum1, 3);
AudioConnection_F32 connect6(sum1, 0, cnvrt1, 0); // Out to the CODEC left
AudioConnection_F32 connect7(sum1, 0, cnvrt2, 0); // and right
AudioConnection_F32 connect8(sum1, 0, peak1, 0);
AudioConnection_F32 connect9(sum1, 0, rms1, 0);
AudioConnection conI16_2(cnvrt1, 0, i2sOut, 0); // DAC L
AudioConnection conI16_3(cnvrt2, 0, i2sOut, 1); // DAC R
// ********* Mini Control Panel *********
// Off/On switches, 0 for off, 1 for on
#define WHITE 0
#define PINK 0
#define GAUSSIAN 1
#define SINE 1
int gainControlDB = -35; // Set gain in dB.
// *****************************************
void setup(void) {
float32_t gain;
AudioMemory(5);
AudioMemory_F32(8);
for (int i=0; i<4; i++) sum1.gain(i, 0.0); // All off
Serial.begin(1); delay(1000);
gain = powf( 10.0f, (gainControlDB/20.0f) );
white1.amplitude(0.5f);
gaussian1.amplitude(0.5f);
sine1.frequency(1000.0f);
sine1.amplitude(0.2f);
codec.enable();
delay(10);
if(PINK) sum1.gain(0, gain);
else sum1.gain(0, 0.0f);
if(WHITE) sum1.gain(1, gain);
else sum1.gain(1, 0.0f);
if(GAUSSIAN) sum1.gain(2, gain);
else sum1.gain(2, 0.0f);
if(SINE) sum1.gain(3, gain);
else sum1.gain(3, 0.0f);
}
void loop(void) {
// Here is where the adjustment of the volume control could go.
// And anything else that needs regular attention, other
// than the audio stream.
if (rms1.available() ) {Serial.print("RMS ="); Serial.println(rms1.read(), 6);}
if (peak1.available() ) {Serial.print("P-P ="); Serial.println(peak1.readPeakToPeak(), 6);}
Serial.print("CPU: Percent Usage, Max: ");
Serial.print(AudioProcessorUsage());
Serial.print(", ");
Serial.print(AudioProcessorUsageMax());
Serial.print(" ");
Serial.print("Int16 Memory: ");
Serial.print(AudioMemoryUsage());
Serial.print(", ");
Serial.print(AudioMemoryUsageMax());
Serial.print(" ");
Serial.print("Float Memory: ");
Serial.print(AudioMemoryUsage_F32());
Serial.print(", ");
Serial.println(AudioMemoryUsageMax_F32());
Serial.println();
delay(1000);
}