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.
104 lines
3.3 KiB
104 lines
3.3 KiB
5 years ago
|
/* 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);
|
||
|
}
|