/* 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 #include "DSP_TeensyAudio_F32.h" AudioInputI2S i2s1; AudioSynthWaveformSine_F32 sine1; // Test signal RadioIQMixer_F32 iqmixer1; AudioFilter90Deg_F32 hilbert1; // NOTE: Use AudioMixer4_F32 *from Tympan* 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); // Pick one of these #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, the 251 does not have // enough samples here to show the full build-up. // hilbert1.begin(hilbert19A, 19); // hilbert1.begin(hilbert121A, 121); hilbert1.begin(hilbert121A, 121); 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; } }