![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
ハードウェアおよびソフトウェアはskelton_unzen_nucleo_f746を基本にしています。
main.cpp@20:699e209fd19a, 2017-02-03 (annotated)
- Committer:
- shorie
- Date:
- Fri Feb 03 14:41:40 2017 +0000
- Revision:
- 20:699e209fd19a
- Parent:
- 18:b9b1116f8768
Rewind the faulty commit.
Who changed what in which revision?
User | Revision | Line number | New 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 | 11:7d8740437e6a | 45 | |
shorie | 6:486b1cb03e61 | 46 | // start audio. Do not touch |
shorie | 6:486b1cb03e61 | 47 | initialize_system(); |
shorie | 0:a837eeab3ca6 | 48 | |
shorie | 6:486b1cb03e61 | 49 | // main loop. Signal processing is done in background. |
shorie | 6:486b1cb03e61 | 50 | while(1) |
shorie | 6:486b1cb03e61 | 51 | { // place your foreground program here. |
shorie | 12:2b121255e2d1 | 52 | |
shorie | 12:2b121255e2d1 | 53 | // get volume from UI panel, then apply it to signal processing. |
shorie | 20:699e209fd19a | 54 | process->set_volume( ukifune::get_volume(0) ); |
shorie | 2:d5028a37f17b | 55 | |
shorie | 11:7d8740437e6a | 56 | // sample usage of button switch detection |
shorie | 11:7d8740437e6a | 57 | ukifune::get_button_state( pushing, releasing, holding); |
shorie | 11:7d8740437e6a | 58 | |
shorie | 11:7d8740437e6a | 59 | // pushing detection demo |
shorie | 11:7d8740437e6a | 60 | if ( pushing & (1 << ukifune::swm1 ) ) // is SWM1 switch pusshing down? |
shorie | 20:699e209fd19a | 61 | ukifune::toggle_led( ukifune::led1_1 ); // then, toggle LED1_1 |
shorie | 11:7d8740437e6a | 62 | |
shorie | 20:699e209fd19a | 63 | // releasing detection demo |
shorie | 20:699e209fd19a | 64 | if ( releasing & (1 << ukifune::swm2 ) ) // is SWM2 switch releasing? |
shorie | 20:699e209fd19a | 65 | ukifune::toggle_led( ukifune::led2_1 ); // then toggle LED2_1 |
shorie | 20:699e209fd19a | 66 | |
shorie | 20:699e209fd19a | 67 | // holding detection demo |
shorie | 20:699e209fd19a | 68 | if ( holding & (1 << ukifune::swm3 ) ) // is SWM3 switch holding? |
shorie | 20:699e209fd19a | 69 | ukifune::turn_led_on( ukifune::led3_1 ); // then turn LED3_1 on |
shorie | 20:699e209fd19a | 70 | else |
shorie | 20:699e209fd19a | 71 | ukifune::turn_led_off( ukifune::led3_1 ); // else off |
shorie | 11:7d8740437e6a | 72 | |
shorie | 11:7d8740437e6a | 73 | |
shorie | 6:486b1cb03e61 | 74 | // you have to call tick() every 20mS-50mS if you need get_volume() |
shorie | 6:486b1cb03e61 | 75 | wait(0.05); |
shorie | 6:486b1cb03e61 | 76 | ukifune::tick(); |
shorie | 6:486b1cb03e61 | 77 | } |
shorie | 7:e86c645231ff | 78 | } // End of main |
shorie | 7:e86c645231ff | 79 | |
shorie | 7:e86c645231ff | 80 | |
shorie | 8:d8d1776e865b | 81 | /************************* Unzen Dependent Callbacks **************************/ |
shorie | 7:e86c645231ff | 82 | // customer signal processing initialization call back. |
shorie | 7:e86c645231ff | 83 | void init_callback( |
shorie | 7:e86c645231ff | 84 | unsigned int block_size // block size [sample] |
shorie | 7:e86c645231ff | 85 | ) |
shorie | 7:e86c645231ff | 86 | { |
shorie | 7:e86c645231ff | 87 | // place initialization code here |
shorie | 7:e86c645231ff | 88 | process = new SignalProcessing( block_size ); |
shorie | 7:e86c645231ff | 89 | } // end of init_callback |
shorie | 7:e86c645231ff | 90 | |
shorie | 7:e86c645231ff | 91 | |
shorie | 7:e86c645231ff | 92 | // customer signal processing call back. |
shorie | 7:e86c645231ff | 93 | void process_callback( |
shorie | 7:e86c645231ff | 94 | float rx_left_buffer[], // array of the left input samples |
shorie | 7:e86c645231ff | 95 | float rx_right_buffer[], // array of the right input samples |
shorie | 7:e86c645231ff | 96 | float tx_left_buffer[], // place to write the left output samples |
shorie | 13:b33cb5925113 | 97 | float tx_right_buffer[], // place to write the right output samples |
shorie | 7:e86c645231ff | 98 | unsigned int block_size // block size [sample] |
shorie | 7:e86c645231ff | 99 | ) |
shorie | 7:e86c645231ff | 100 | { |
shorie | 7:e86c645231ff | 101 | // place signal processing code here |
shorie | 7:e86c645231ff | 102 | process->run( rx_left_buffer, rx_right_buffer, tx_left_buffer, tx_right_buffer, block_size ); |
shorie | 7:e86c645231ff | 103 | } // End of process_callback |
shorie | 2:d5028a37f17b | 104 | |
shorie | 6:486b1cb03e61 | 105 | |
shorie | 6:486b1cb03e61 | 106 | /************************* Unzen Dependent Function implementation ************/ |
shorie | 6:486b1cb03e61 | 107 | void initialize_system(void) |
shorie | 2:d5028a37f17b | 108 | { |
shorie | 6:486b1cb03e61 | 109 | // Set I3C clock to 100kHz |
shorie | 6:486b1cb03e61 | 110 | i2c.frequency( 100000 ); |
shorie | 6:486b1cb03e61 | 111 | |
shorie | 6:486b1cb03e61 | 112 | // Configure the optional block size of signal processing. By default, it is 1[Sample] |
shorie | 6:486b1cb03e61 | 113 | audio.set_block_size(BLOCKSIZE); |
shorie | 6:486b1cb03e61 | 114 | |
shorie | 6:486b1cb03e61 | 115 | // Start UI module. |
shorie | 6:486b1cb03e61 | 116 | ukifune::init( & audio ); |
shorie | 6:486b1cb03e61 | 117 | |
shorie | 6:486b1cb03e61 | 118 | // Start the ADAU1361. Audio codec starts to generate the I2C signals |
shorie | 6:486b1cb03e61 | 119 | codec.start(); |
shorie | 6:486b1cb03e61 | 120 | // Start the audio framework on ARM processor. |
shorie | 6:486b1cb03e61 | 121 | audio.start( init_callback, process_callback); // path the initializaiton and process call back to framework |
shorie | 6:486b1cb03e61 | 122 | |
shorie | 6:486b1cb03e61 | 123 | // Setup initial analog gain |
shorie | 6:486b1cb03e61 | 124 | codec.set_hp_output_gain( 0, 0 ); |
shorie | 6:486b1cb03e61 | 125 | codec.set_line_output_gain( 0, 0 ); |
shorie | 6:486b1cb03e61 | 126 | } |