Experimental implementation of the adaptive filter of "Interface" magazine in 2016-2017

Dependencies:   amakusa mbed-dsp mbed shimabara ukifune unzen_nucleo_f746

Fork of skeleton_unzen_nucleo_f746 by seiichi horie

ハードウェアおよびソフトウェアはskelton_unzen_nucleo_f746を基本にしています。

Committer:
shorie
Date:
Tue Jan 31 14:19:16 2017 +0000
Revision:
17:728ffc633179
Parent:
13:b33cb5925113
Child:
18:b9b1116f8768
VFO is now working.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shorie 1:98ddcbbe10ba 1 #include "mbed.h"
shorie 1:98ddcbbe10ba 2
shorie 9:7f521a0b397c 3 // Note : Do not touch the "unzen dependent" part. No need to read.
shorie 9:7f521a0b397c 4 // Modify the "project dependent" part.
shorie 9:7f521a0b397c 5 // Also, Modify the SignalProcessing class.
shorie 6:486b1cb03e61 6
shorie 6:486b1cb03e61 7
shorie 6:486b1cb03e61 8 /************************** unzen dependent constants. ************************/
shorie 6:486b1cb03e61 9 #define CODEC_I2C_ADDR 0x38 // Address of the ADAU-1361A
shorie 6:486b1cb03e61 10
shorie 6:486b1cb03e61 11
shorie 6:486b1cb03e61 12 /*========================= Project Dependent Constants ======================*/
shorie 6:486b1cb03e61 13 #define BLOCKSIZE 16 // number of the sample to be processed at once.
shorie 6:486b1cb03e61 14 #define FS shimabara::Fs_48 // Fs can be Fs_32, Fs_441, Fs_48, Fs_96
shorie 6:486b1cb03e61 15
shorie 6:486b1cb03e61 16
shorie 6:486b1cb03e61 17 /************************** unzen dependent include. **************************/
shorie 0:a837eeab3ca6 18 #include "unzen.h" // audio framework include file
shorie 1:98ddcbbe10ba 19 #include "umb_adau1361a.h" // audio codec contoler include file
shorie 3:1b420050bdda 20 #include "amakusa.h" // audio signal processing class library.
shorie 8:d8d1776e865b 21 #include "ukifune.h" // UI board support routines
shorie 8:d8d1776e865b 22 #include "signal_processing.h" // Implementaion of user signal processing.
shorie 2:d5028a37f17b 23
shorie 3:1b420050bdda 24
shorie 6:486b1cb03e61 25 /************************* Unzen Dependent Global Variables *******************/
shorie 6:486b1cb03e61 26 // I2C is essential to talk with ADAU1361
shorie 8:d8d1776e865b 27 static I2C i2c(D14, D15);
shorie 6:486b1cb03e61 28 // create an audio codec contoler
shorie 8:d8d1776e865b 29 static shimabara::UMB_ADAU1361A codec(FS, i2c, CODEC_I2C_ADDR );
shorie 6:486b1cb03e61 30 // create an audio framework by singlton pattern
shorie 8:d8d1776e865b 31 static unzen::Framework audio;
shorie 6:486b1cb03e61 32 // create a pointer to the signal processing object.
shorie 8:d8d1776e865b 33 static SignalProcessing * process;
shorie 6:486b1cb03e61 34
shorie 6:486b1cb03e61 35
shorie 6:486b1cb03e61 36 /************************* Unzen Dependent Function Prototype *****************/
shorie 6:486b1cb03e61 37 // for system usage. Do not care.
shorie 6:486b1cb03e61 38 void initialize_system(void);
shorie 0:a837eeab3ca6 39
shorie 2:d5028a37f17b 40
shorie 7:e86c645231ff 41 /*========================= Main program. ====================================*/
shorie 0:a837eeab3ca6 42 int main()
shorie 0:a837eeab3ca6 43 {
shorie 11:7d8740437e6a 44 uint32_t pushing, releasing, holding;
shorie 17:728ffc633179 45
shorie 17:728ffc633179 46 // VFO style
shorie 17:728ffc633179 47 wave_style style = triangle;
shorie 11:7d8740437e6a 48
shorie 6:486b1cb03e61 49 // start audio. Do not touch
shorie 6:486b1cb03e61 50 initialize_system();
shorie 17:728ffc633179 51
shorie 17:728ffc633179 52 process->set_vfo_frequency( 440 );
shorie 17:728ffc633179 53 process->set_vfo_wave_style( style );
shorie 17:728ffc633179 54 ukifune::turn_led_off( ukifune::led1_1 );
shorie 17:728ffc633179 55 ukifune::turn_led_on( ukifune::led1_2 );
shorie 0:a837eeab3ca6 56
shorie 6:486b1cb03e61 57 // main loop. Signal processing is done in background.
shorie 6:486b1cb03e61 58 while(1)
shorie 6:486b1cb03e61 59 { // place your foreground program here.
shorie 12:2b121255e2d1 60
shorie 12:2b121255e2d1 61 // get volume from UI panel, then apply it to signal processing.
shorie 17:728ffc633179 62 process->set_volume( ukifune::get_volume(0) );
shorie 17:728ffc633179 63 process->set_vfo_duty_cycle( ukifune::get_volume(1) );
shorie 2:d5028a37f17b 64
shorie 11:7d8740437e6a 65 // sample usage of button switch detection
shorie 11:7d8740437e6a 66 ukifune::get_button_state( pushing, releasing, holding);
shorie 11:7d8740437e6a 67
shorie 11:7d8740437e6a 68 // pushing detection demo
shorie 11:7d8740437e6a 69 if ( pushing & (1 << ukifune::swm1 ) ) // is SWM1 switch pusshing down?
shorie 17:728ffc633179 70 if ( style == triangle )
shorie 17:728ffc633179 71 {
shorie 17:728ffc633179 72 style = square;
shorie 17:728ffc633179 73 process->set_vfo_wave_style( style );
shorie 17:728ffc633179 74 ukifune::turn_led_on( ukifune::led1_1 );
shorie 17:728ffc633179 75 ukifune::turn_led_off( ukifune::led1_2 );
shorie 17:728ffc633179 76 }
shorie 17:728ffc633179 77 else
shorie 17:728ffc633179 78 {
shorie 17:728ffc633179 79 style = triangle;
shorie 17:728ffc633179 80 process->set_vfo_wave_style( style );
shorie 17:728ffc633179 81 ukifune::turn_led_off( ukifune::led1_1 );
shorie 17:728ffc633179 82 ukifune::turn_led_on( ukifune::led1_2 );
shorie 17:728ffc633179 83 }
shorie 17:728ffc633179 84
shorie 11:7d8740437e6a 85
shorie 11:7d8740437e6a 86
shorie 11:7d8740437e6a 87
shorie 6:486b1cb03e61 88 // you have to call tick() every 20mS-50mS if you need get_volume()
shorie 6:486b1cb03e61 89 wait(0.05);
shorie 6:486b1cb03e61 90 ukifune::tick();
shorie 6:486b1cb03e61 91 }
shorie 7:e86c645231ff 92 } // End of main
shorie 7:e86c645231ff 93
shorie 7:e86c645231ff 94
shorie 8:d8d1776e865b 95 /************************* Unzen Dependent Callbacks **************************/
shorie 7:e86c645231ff 96 // customer signal processing initialization call back.
shorie 7:e86c645231ff 97 void init_callback(
shorie 7:e86c645231ff 98 unsigned int block_size // block size [sample]
shorie 7:e86c645231ff 99 )
shorie 7:e86c645231ff 100 {
shorie 7:e86c645231ff 101 // place initialization code here
shorie 7:e86c645231ff 102 process = new SignalProcessing( block_size );
shorie 7:e86c645231ff 103 } // end of init_callback
shorie 7:e86c645231ff 104
shorie 7:e86c645231ff 105
shorie 7:e86c645231ff 106 // customer signal processing call back.
shorie 7:e86c645231ff 107 void process_callback(
shorie 7:e86c645231ff 108 float rx_left_buffer[], // array of the left input samples
shorie 7:e86c645231ff 109 float rx_right_buffer[], // array of the right input samples
shorie 7:e86c645231ff 110 float tx_left_buffer[], // place to write the left output samples
shorie 13:b33cb5925113 111 float tx_right_buffer[], // place to write the right output samples
shorie 7:e86c645231ff 112 unsigned int block_size // block size [sample]
shorie 7:e86c645231ff 113 )
shorie 7:e86c645231ff 114 {
shorie 7:e86c645231ff 115 // place signal processing code here
shorie 7:e86c645231ff 116 process->run( rx_left_buffer, rx_right_buffer, tx_left_buffer, tx_right_buffer, block_size );
shorie 7:e86c645231ff 117 } // End of process_callback
shorie 2:d5028a37f17b 118
shorie 6:486b1cb03e61 119
shorie 6:486b1cb03e61 120 /************************* Unzen Dependent Function implementation ************/
shorie 6:486b1cb03e61 121 void initialize_system(void)
shorie 2:d5028a37f17b 122 {
shorie 6:486b1cb03e61 123 // Set I3C clock to 100kHz
shorie 6:486b1cb03e61 124 i2c.frequency( 100000 );
shorie 6:486b1cb03e61 125
shorie 6:486b1cb03e61 126 // Configure the optional block size of signal processing. By default, it is 1[Sample]
shorie 6:486b1cb03e61 127 audio.set_block_size(BLOCKSIZE);
shorie 6:486b1cb03e61 128
shorie 6:486b1cb03e61 129 // Start UI module.
shorie 6:486b1cb03e61 130 ukifune::init( & audio );
shorie 6:486b1cb03e61 131
shorie 6:486b1cb03e61 132 // Start the ADAU1361. Audio codec starts to generate the I2C signals
shorie 6:486b1cb03e61 133 codec.start();
shorie 6:486b1cb03e61 134 // Start the audio framework on ARM processor.
shorie 6:486b1cb03e61 135 audio.start( init_callback, process_callback); // path the initializaiton and process call back to framework
shorie 6:486b1cb03e61 136
shorie 6:486b1cb03e61 137 // Setup initial analog gain
shorie 6:486b1cb03e61 138 codec.set_hp_output_gain( 0, 0 );
shorie 6:486b1cb03e61 139 codec.set_line_output_gain( 0, 0 );
shorie 6:486b1cb03e61 140 }