|
|
|
/* ReceiverPart1.ino Bob Larkin 20 April 2020
|
|
|
|
* This is "Hello World" of Radio design. It can
|
|
|
|
* receive a Lower Sideband signal, but that is it.
|
|
|
|
* To test the floating point radio receiver blocks:
|
|
|
|
* AudioFilter90Deg_F32
|
|
|
|
* RadioIQMixer_F32
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "Audio.h"
|
|
|
|
#include "OpenAudio_ArduinoLibrary.h"
|
|
|
|
|
|
|
|
AudioInputI2S i2s1;
|
|
|
|
AudioSynthWaveformSine_F32 sine1; // Test signal
|
|
|
|
RadioIQMixer_F32 iqmixer1;
|
|
|
|
AudioFilter90Deg_F32 hilbert1;
|
|
|
|
AudioMixer4_F32 sum1;
|
|
|
|
AudioRecordQueue_F32 queue1; // The LSB output
|
|
|
|
AudioRecordQueue_F32 queue2; // The test sine wave
|
|
|
|
|
|
|
|
AudioConnection_F32 patchCord0(sine1, 0, iqmixer1, 0);
|
|
|
|
AudioConnection_F32 patchCord2(sine1, 0, iqmixer1, 1);
|
|
|
|
AudioConnection_F32 patchCord4(iqmixer1, 0, hilbert1, 0);
|
|
|
|
AudioConnection_F32 patchCord5(iqmixer1, 1, hilbert1, 1);
|
|
|
|
AudioConnection_F32 patchCord6(hilbert1, 0, sum1, 0);
|
|
|
|
AudioConnection_F32 patchCord7(hilbert1, 1, sum1, 1);
|
|
|
|
AudioConnection_F32 patchCord8(sum1, 0, queue1, 0);
|
|
|
|
AudioConnection_F32 patchCord9(sine1, 0, queue2, 0);
|
|
|
|
|
|
|
|
#include "hilbert19A.h"
|
|
|
|
#include "hilbert121A.h"
|
|
|
|
#include "hilbert251A.h"
|
|
|
|
|
|
|
|
float dt1[128];
|
|
|
|
float dt2[128];
|
|
|
|
float *pq1, *pd1, *pq2, *pd2;
|
|
|
|
int i, k;
|
|
|
|
|
|
|
|
void setup(void) {
|
|
|
|
AudioMemory(5);
|
|
|
|
AudioMemory_F32(10);
|
|
|
|
Serial.begin(300); delay(1000);
|
|
|
|
|
|
|
|
sine1.frequency(14000.0);
|
|
|
|
iqmixer1.frequency(16000.0);
|
|
|
|
// Pick one of the three. Note that the 251 does not have
|
|
|
|
// enough samples here to show the full build-up.
|
|
|
|
// hilbert1.begin(hilbert19A, 19);
|
|
|
|
hilbert1.begin(hilbert121A, 121);
|
|
|
|
// hilbert1.begin(hilbert251A, 251);
|
|
|
|
sum1.gain(0, 1.0); // Leave at 1.0
|
|
|
|
sum1.gain(1, -1.0); // -1 for LSB out
|
|
|
|
iqmixer1.showError(1); // Prints update() errors
|
|
|
|
hilbert1.showError(1);
|
|
|
|
queue1.begin();
|
|
|
|
queue2.begin();
|
|
|
|
i = 0; k=0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void loop(void) {
|
|
|
|
// Collect 128 samples and output to Serial
|
|
|
|
// This "if" will be active for i == 0
|
|
|
|
if (queue1.available() >= 1 && i==0) {
|
|
|
|
pq1 = queue1.readBuffer();
|
|
|
|
pd1 = &dt1[0];
|
|
|
|
pq2 = queue2.readBuffer();
|
|
|
|
pd2 = &dt2[0];
|
|
|
|
for(k=0; k<128; k++) {
|
|
|
|
*pd1++ = *pq1++;
|
|
|
|
*pd2++ = *pq2++;
|
|
|
|
}
|
|
|
|
i=1; // Only collect 1 block
|
|
|
|
Serial.print("Maximum F32 memory usage at loop:");
|
|
|
|
Serial.println( AudioMemoryUsageMax_F32() );
|
|
|
|
queue1.freeBuffer();
|
|
|
|
queue2.freeBuffer();
|
|
|
|
queue1.end(); // No more data to queue1
|
|
|
|
queue2.end(); // No more data to queue2
|
|
|
|
}
|
|
|
|
if(i == 1) {
|
|
|
|
Serial.println("128 Samples: Time (sec), LSB Out, Sine Wave In");
|
|
|
|
for (k=0; k<128; k++) {
|
|
|
|
Serial.print (0.000022667*(float32_t)k, 6); Serial.print (",");
|
|
|
|
Serial.print (dt1[k],7); Serial.print (",");
|
|
|
|
Serial.println (dt2[k],7);
|
|
|
|
}
|
|
|
|
i = 2;
|
|
|
|
}
|
|
|
|
}
|