diff --git a/firmware/inc/rf_tests.h b/firmware/inc/rf_tests.h index 658ac1b..4193fcd 100644 --- a/firmware/inc/rf_tests.h +++ b/firmware/inc/rf_tests.h @@ -31,6 +31,7 @@ enum rf_tests { RF_TEST_APRS_HIGH_FM_TONE, RF_TEST_APRS_TONE, RF_TEST_TELEMETRY_TONE, + RF_TEST_RSID, }; #define RF_TEST RF_TEST_NONE diff --git a/firmware/inc/si_trx.h b/firmware/inc/si_trx.h index a53753d..460b514 100644 --- a/firmware/inc/si_trx.h +++ b/firmware/inc/si_trx.h @@ -27,12 +27,18 @@ #include "samd20.h" +enum si_filter_model { + SI_FILTER_DEFAULT, + SI_FILTER_APRS, + SI_FILTER_RSID +}; + float si_trx_get_temperature(void); void si_trx_modem_set_deviation(uint32_t deviation); void si_trx_on(uint8_t modulation_type, uint32_t frequency, - uint16_t deviation, uint8_t power); + uint16_t deviation, uint8_t power, enum si_filter_model filter); void si_trx_off(void); void si_trx_modem_set_offset(int16_t channel); diff --git a/firmware/src/rf_tests.c b/firmware/src/rf_tests.c index cbd056d..cc91597 100644 --- a/firmware/src/rf_tests.c +++ b/firmware/src/rf_tests.c @@ -39,12 +39,12 @@ void telemetry_tone(void) { while (1) { - si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 0, 36); + si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 0, 36, SI_FILTER_DEFAULT); for (int i = 0; i < 200*1000; i++) { idle(IDLE_TELEMETRY_ACTIVE); } si_trx_off(); - si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 0, 0x7f); + si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 0, 0x7f, SI_FILTER_DEFAULT); for (int i = 0; i < 200*1000; i++) { idle(IDLE_TELEMETRY_ACTIVE); } @@ -54,12 +54,12 @@ void telemetry_tone(void) void aprs_tone(void) { while (1) { - si_trx_on(SI_MODEM_MOD_TYPE_CW, APRS_TEST_FREQUENCY, 0, 36); + si_trx_on(SI_MODEM_MOD_TYPE_CW, APRS_TEST_FREQUENCY, 0, 36, SI_FILTER_DEFAULT); for (int i = 0; i < 200*1000; i++) { idle(IDLE_TELEMETRY_ACTIVE); } si_trx_off(); - si_trx_on(SI_MODEM_MOD_TYPE_CW, APRS_TEST_FREQUENCY, 0, 0x7f); + si_trx_on(SI_MODEM_MOD_TYPE_CW, APRS_TEST_FREQUENCY, 0, 0x7f, SI_FILTER_DEFAULT); for (int i = 0; i < 200*1000; i++) { idle(IDLE_TELEMETRY_ACTIVE); } @@ -83,7 +83,7 @@ void aprs_high_fm_tone(void) false); /* Output Pin Enable */ si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, APRS_TEST_FREQUENCY, - AX25_DEVIATION, APRS_POWER); + AX25_DEVIATION, APRS_POWER, SI_FILTER_APRS); while (1) { idle(IDLE_TELEMETRY_ACTIVE); } @@ -109,6 +109,23 @@ void aprs_test(void) } } +/** + * RSID function for use during testing. Not for flight + */ +void rsid_test(void) +{ + while (1) { + + telemetry_start_rsid(RSID_CONTESTIA_32_1000); + +// Sleep wait for RSID + while (telemetry_active()) { + idle(IDLE_TELEMETRY_ACTIVE); + } + + for (int i = 3*200*1000; i; i--); + } +} void rf_tests(void) { @@ -125,6 +142,9 @@ void rf_tests(void) case RF_TEST_TELEMETRY_TONE: telemetry_tone(); break; + case RF_TEST_RSID: + rsid_test(); + break; default: break; } diff --git a/firmware/src/rsid.c b/firmware/src/rsid.c index f379572..061dff1 100644 --- a/firmware/src/rsid.c +++ b/firmware/src/rsid.c @@ -100,6 +100,7 @@ void rsid_encode(rsid_code_t rsid_code, int8_t* rsid) */ uint8_t rsid_index = 0xFE; +uint8_t rsid_subtick; int8_t rsid[RSID_NSYMBOLS]; #define MODEM_TONE_SPACING 7.805 @@ -118,6 +119,7 @@ void rsid_start(rsid_code_t rsid_code) { /* Start transmission */ rsid_index = 0; + rsid_subtick = 0; rsid_encode(rsid_code, rsid); } @@ -147,24 +149,35 @@ void rsid_tone(uint8_t tone) deviation = tone_offset - (float)channel; #endif - float duty_cycle = 0.5 + (deviation / 2); // FSK only provides a marginal improvement in performance! + float duty_cycle = 0.5 + deviation; - si_trx_switch_channel(channel); + si_trx_switch_channel(channel-2); /* -2 offset to line up with contestia signal */ telemetry_gpio1_pwm_duty(duty_cycle); } /** * Called at the rsid baud rate + * + * We mantain the first tone longer than the others to give the radio + * time to start up. Oh so hacky but hey */ uint8_t rsid_tick(void) { + if (rsid_index < RSID_NSYMBOLS || rsid_subtick) { - if (rsid_index < RSID_NSYMBOLS) { + /* Actual tick */ + if (rsid_subtick == 0) { + /* Transmit this tone */ + rsid_tone(rsid[rsid_index]); + rsid_index++; + } - /* Transmit this tone */ - rsid_tone(rsid[rsid_index]); + rsid_subtick++; + if ((rsid_index-1 == 0 && rsid_subtick == 3) || /* First tone */ + (rsid_index-1 != 0 && rsid_subtick == 2)) { /* Other tones */ + rsid_subtick = 0; + } - rsid_index++; return 1; } diff --git a/firmware/src/si_trx.c b/firmware/src/si_trx.c index e02c013..17bd978 100644 --- a/firmware/src/si_trx.c +++ b/firmware/src/si_trx.c @@ -427,7 +427,7 @@ static float si_trx_set_frequency(uint32_t frequency, uint16_t deviation) * Resets the transceiver */ void si_trx_reset(uint8_t modulation_type, uint32_t frequency, - uint16_t deviation, uint8_t power) + uint16_t deviation, uint8_t power, enum si_filter_model filter) { _si_trx_sdn_enable(); /* active high shutdown = reset */ @@ -459,22 +459,40 @@ void si_trx_reset(uint8_t modulation_type, uint32_t frequency, si_trx_set_frequency(frequency, deviation); si_trx_set_tx_power(power); - /** - * Modem tx filter coefficients for APRS - * 0dB @ 2.2kHz - * -6dB @ 1.2kHz (for pre-emphasis) - * < -30dB from 3.6KHz - */ + /* Modem tx filter coefficients */ + uint8_t rsid_si_coeff[] = {0x1, 0x4, 0x9, 0x11, 0x19, 0x22, 0x2a, 0x30, 0x31}; uint8_t p_si_coeff[] = {0x6, 0x8, 0x1, 0xf2, 0xe4, 0xe7, 0xff, 0x1d, 0x2b}; - si_trx_modem_set_tx_datarate(1600); /* Filter sampling rate 1600*10 = 16kHz */ - si_trx_modem_tx_filter_coefficients(p_si_coeff); + + switch (filter) { + case SI_FILTER_APRS: + /** + * Modem tx filter coefficients for APRS + * 0dB @ 2.2kHz + * -6dB @ 1.2kHz (for pre-emphasis) + * < -30dB from 3.6KHz + */ + si_trx_modem_set_tx_datarate(1600); /* Filter sampling rate 1600*10 = 16kHz */ + si_trx_modem_tx_filter_coefficients(p_si_coeff); + break; + case SI_FILTER_RSID: + /** + * Modem tx filter coefficients for RSID + * -6dB @ dc (for ±0.5 deviation max) + * < -50dB from 1.8KHz + */ + si_trx_modem_set_tx_datarate(1600); /* Filter sampling rate 1600*10 = 16kHz */ + si_trx_modem_tx_filter_coefficients(rsid_si_coeff); + break; + default: /* Just leave the defaults from startup in place */ + break; + } /* RTTY from GPIO1 */ si_trx_modem_set_modulation(SI_MODEM_MOD_DIRECT_MODE_SYNC, // ASYNC - SI_MODEM_MOD_GPIO_1, - SI_MODEM_MOD_SOURCE_DIRECT, - modulation_type); + SI_MODEM_MOD_GPIO_1, + SI_MODEM_MOD_SOURCE_DIRECT, + modulation_type); si_trx_state_tx_tune(); } @@ -483,9 +501,9 @@ void si_trx_reset(uint8_t modulation_type, uint32_t frequency, * Enables the radio and starts transmitting */ void si_trx_on(uint8_t modulation_type, uint32_t frequency, - uint16_t deviation, uint8_t power) + uint16_t deviation, uint8_t power, enum si_filter_model filter) { - si_trx_reset(modulation_type, frequency, deviation, power); + si_trx_reset(modulation_type, frequency, deviation, power, filter); si_trx_start_tx(0); } /** diff --git a/firmware/src/telemetry.c b/firmware/src/telemetry.c index 1a1e156..e837c93 100644 --- a/firmware/src/telemetry.c +++ b/firmware/src/telemetry.c @@ -238,7 +238,8 @@ void telemetry_tick(void) { if (!radio_on) { /* Contestia: We use the modem offset to modulate */ - si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER); + si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER, + SI_FILTER_DEFAULT); radio_on = 1; contestia_preamble(); } @@ -259,7 +260,8 @@ void telemetry_tick(void) { if (!radio_on) { /* RTTY: We use the modem offset to modulate */ - si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER); + si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER, + SI_FILTER_DEFAULT); radio_on = 1; rtty_preamble(); } @@ -290,10 +292,9 @@ void telemetry_tick(void) { /* RSID: We PWM frequencies with the external pin */ telemetry_gpio1_pwm_init(); - si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER); + si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER, + SI_FILTER_RSID); radio_on = 1; - - return; } /* Do Tx */ @@ -304,6 +305,7 @@ void telemetry_tick(void) { telemetry_gpio1_pwm_deinit(); return; } + break; case TELEMETRY_APRS: /* ---- ---- APRS */ @@ -313,8 +315,8 @@ void telemetry_tick(void) { if (aprs_start() && _aprs_frequency) { /* Radio on */ - si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, _aprs_frequency, - AX25_DEVIATION, APRS_POWER); + si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, _aprs_frequency, AX25_DEVIATION, + APRS_POWER, SI_FILTER_APRS); radio_on = 1; } else { /* Stop immediately */ @@ -333,7 +335,8 @@ void telemetry_tick(void) { if (!radio_on) { /* Turn on */ /* Pips: Cw */ - si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER); + si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER, + SI_FILTER_DEFAULT); radio_on = 1; } else { /* Turn off */ @@ -430,7 +433,7 @@ void telemetry_init(void) rtty_timer_count = timer0_get_count_value(RTTY_BITRATE); pips_timer_count = timer0_get_count_value(PIPS_FREQUENCY); ax25_timer_count = timer0_get_count_value(AX25_TICK_RATE); - rsid_timer_count = timer0_get_count_value(RSID_SYMBOL_RATE); + rsid_timer_count = timer0_get_count_value(RSID_SYMBOL_RATE*2); /* 2x Subtick */ } diff --git a/sim/si_fir_filter/si_fir_filter_rsid.ipynb b/sim/si_fir_filter/si_fir_filter_rsid.ipynb new file mode 100644 index 0000000..8f9363d --- /dev/null +++ b/sim/si_fir_filter/si_fir_filter_rsid.ipynb @@ -0,0 +1,534 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Reflects an array of coefficients about the last element \n", + "def sym_fir_coeff(coeff):\n", + " for i in range(len(coeff)-2, -1, -1):\n", + " coeff.append(coeff[i])\n", + "\n", + " return coeff\n", + "\n", + "# Normalises the si's 8-bit coefficients to 0 - 1 \n", + "def si_normalise_coeff(coeff):\n", + " coeff = [x-0x100 if x > 0x7f else x for x in coeff]\n", + " return [x/0x300 for x in coeff] # 0x300 seems to be the value required to get 0 gain at dc.. Not sure about this: Test!\n", + "\n", + "def si_coeff(coeff):\n", + " norm = [int(x*0x300) for x in coeff]\n", + " return [x+0x100 if x < 0 else x for x in norm]" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 25 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These are the default si coefficients" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Default si coefficients \n", + "si_default_fir_coeff = [0x1, 0x3, 0x8, 0x11, 0x21, 0x36, 0x4d, 0x60, 0x67]\n", + "si_fir_coeff = si_normalise_coeff(sym_fir_coeff(si_default_fir_coeff))\n", + "print si_fir_coeff" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0.0013020833333333333, 0.00390625, 0.010416666666666666, 0.022135416666666668, 0.04296875, 0.0703125, 0.10026041666666667, 0.125, 0.13411458333333334, 0.125, 0.10026041666666667, 0.0703125, 0.04296875, 0.022135416666666668, 0.010416666666666666, 0.00390625, 0.0013020833333333333]\n" + ] + } + ], + "prompt_number": 26 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup graphs" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%matplotlib inline\n", + "from scipy import signal\n", + "from pylab import *\n", + "from __future__ import division\n", + "import matplotlib.pyplot as plt" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 27 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "w,h=signal.freqz(si_fir_coeff,1) # Compute impulse response \n", + "\n", + "plt.plot(w/pi,20*log10(abs(h)))\n", + "plt.grid()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nAAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 28 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passband filter" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "sampling frequency: 16000 Hz\n", + "\n", + "* 0 Hz - 500 Hz\n", + " gain = 0\n", + " desired attenuation = -40 dB\n", + " actual attenuation = -33.20090552393641 dB\n", + "\n", + "* 1200 Hz - 2500 Hz\n", + " gain = 1\n", + " desired ripple = 5 dB\n", + " actual ripple = 7.628523622719886 dB\n", + "\n", + "* 3500 Hz - 8000 Hz\n", + " gain = 0\n", + " desired attenuation = -40 dB\n", + " actual attenuation = -33.20090552393641 dB\n", + "\"\"\"\n", + "\n", + "p_fir_coeff = [\n", + "0.03315273058205705,\n", + "0.04369271452900486,\n", + "0.010060937885865288,\n", + "-0.07363298137328711,\n", + "-0.14853046126761885,\n", + "-0.13375882936132458,\n", + "-0.007516054328839414,\n", + "0.15276142842227725,\n", + "0.2256656942570718,\n", + "0.15276142842227725,\n", + "-0.007516054328839414,\n", + "-0.13375882936132458,\n", + "-0.14853046126761885,\n", + "-0.07363298137328711,\n", + "0.010060937885865288,\n", + "0.04369271452900486,\n", + "0.03315273058205705,\n", + "]\n", + "\n", + "w,h=signal.freqz([x/2 for x in p_fir_coeff],1) # Compute impulse response \n", + "\n", + "plt.plot(w/pi,20*log10(abs(h)))\n", + "plt.grid()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEACAYAAABS29YJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXtYlGX6x78DjOKqieYhBW1UUCAV8IDH3LFExJIyW5NO\ny2q15ZY/t23NbEtbLxmtbCvLyt1VOsta29JBSU1GK0U84WlSURE5hIcUzROoPL8/Hl/eAWaG4T3P\nzP25rrn0Pd/c88z93O/3OZkYYwwEQRCEXxOktwEEQRCE+lCwJwiCCAAo2BMEQQQAFOwJgiACAAr2\nBEEQAQAFe4IgiABAtWCfk5OD6OhoREVFYeHChWo9hiAIgvACkxr97K9du4bevXtj3bp1CA8Px6BB\ng/Dpp58iJiZG6UcRBEEQXqBKZp+fn4/IyEhYLBaYzWZMnjwZ2dnZajyKIAiC8AJVgn1ZWRm6du1a\nux0REYGysjI1HkUQBEF4gSrB3mQyqXFbgiAIQiIhatw0PDwcJSUltdslJSWIiIiocw5VCARBENKQ\n0tSqSmY/cOBAFBYW4ujRo6iurkZWVhZSU1MbnMcYow9jmDNnju42GOVDviBfkC88f6SiSmYfEhKC\nt956C8nJybh27RqmTp1KPXE8cPToUb1NMAzkCxHyhQj5Qj6qBHsASElJQUpKilq3JwiCIJoAjaA1\nAOnp6XqbYBjIFyLkCxHyhXxUGVTl1YNNJln6E0EQRCAiNXZSZm8A7Ha73iYYBvKFCPlChHwhHwr2\nBEEQAQDJOARBED4EyTgEQRCEWyjYGwA5euTVq8DPPwO7dgGbNgEbNwJ2O7BtG3DgAHDmDOBLL1Ck\nzYqQL0TIF/JRrZ89oTwnTgA//ghs3gzs3Qv89BNQWgq0awd06gS0bAmYzYDJBFy4AJw7Bxw/zq+1\nWIC+fYEBA4DERP4xm3X9cwiC0BDS7A0MYzxDz84GvvwSOHYMGDaMf/r1A2JigO7dgRAPVTZjQGUl\ncOQIz/63b+dvAEVFgNUK3HUXMGECEBam2Z9FEIQMpMZOCvYGpKwMeP99IDOTZ+kTJgCpqcDgwUBw\nsDLPOHECWLcO+Owz4LvvgNtvB554Ahg9mj+TIAhjQg20PoygR+7aBTz0EJdbjh4FPvgA2L8fWLCA\nZ/NKBXoA6NgRuP9+4L//BYqLgbFjgb/8BYiNBZYuBaqrlXtWUyBtVoR8IUK+kA8FewNQVMTllJQU\n4JZbgMOHecAdMkSbLDssDHjsMV7ZvPMO8PnnQO/ewLJlvAGYIAjfh2QcHamoAJ57DvjmG2DWLGDa\nNCA0VG+rON9/D/ztb1zvf+st4NZb9baIIAiAZByf4to14O23uVzTsSNQWAg8/bRxAj3Ag7vdDsye\nzeWehx8GTp/W2yqCIKRCwV5jCguBESOA//yHB9OFC4GdO+16m+USkwm47z7exbNtW94DKCdH3WeS\nNitCvhAhX8iHgr1GMAa89x5vaH3gASA3l+vzvkCrVsAbb/AG48cfB6ZP168BlyAIaUjW7FeuXIm5\nc+di//792Lp1K/r37197zGazYdmyZQgODsabb76JMWPGNHxwAGn2v/4KTJnCG14/+QSIjtbbIulU\nVgK//z1w8iSwciUQHq63RQQRWGiu2fft2xdffPEFRo4cWWe/w+FAVlYWHA4HcnJyMG3aNNTU1Eh9\njM+zfz8frdq2LR/M5MuBHuA9d774Ahg/Hhg0CNiyRW+LCILwBsnBPjo6Gr169WqwPzs7G2lpaTCb\nzbBYLIiMjER+fr4sI32VdeuAkSOBZ57hXSndNcD6mh4ZFMR7Ef3rXzzoZ2crd29f84WakC9EyBfy\nUVyzLy8vR0RERO12REQEysrKlH6M4cnM5Nr8Z58BU6fqbY06jBsHrFrFR96++67e1hAE4QmPE6El\nJSWhoqKiwf6MjAyMHz/e64eY3IwMSk9Ph8ViAQCEhYUhPj4eVqsVgFiT++J2RgaweLEdr7wCjBzZ\n+PlWq9VQ9jd1+4cfgOHD7di3D1i8WH97/GlbwCj26LUt7DOKPVpu2+12ZGZmAkBtvJSC7EFVo0aN\nwqJFi2obaBcsWAAAmDVrFgBg7NixeOmllzB48OC6D/bDBlrGgBde4Jr2unVA5856W6QdxcXAqFHA\nU08Bf/6z3tYQhP+i66Aq5wenpqZixYoVqK6uRlFREQoLC5GYmKjEYwwNY8Bf/wp8/TXvP9+UQF8/\ni/NFbr6Z/91vvw0sWSL9Pv7gC6UgX4iQL+QjeT77L774AtOnT8epU6dwxx13ICEhAatXr0ZsbCwm\nTZqE2NhYhISEYMmSJW5lHH/ib38D1q/nn3bt9LZGH7p1A9au5aNvO3YE7r1Xb4sIghCguXEU4OWX\ngeXL+SpRHTrobY3+FBQAY8bwUcJOkitBEApAc+PoxD//yWWLtWsp0AvExwMrVgCTJvGlEQmC0B8K\n9jL49lveILt2LeDU27TJ+KMeedttwPz5wN138+URvcUffSEV8oUI+UI+FOwlsm8fX2hk5UogKkpv\na4zJo49yGefhh4EAHkRNEIaANHsJnDzJp0D4+995wCfcU13Ns/yxY3kjNkEQ8qA1aDXi2jXe+Dh4\nMJCRobc1vkF5OdC/P18Ccdgwva0hCN+GGmg14sUX+Tzv8+Ypd09/1yO7dOHTOz/4IHD2rOdz/d0X\nTYF8IUK+kA8F+ybw1VfAhx/yaYqVXPw7ELjrLiA5GfjTn/S2hCACE5JxvKS0FBgwgE+FQFKENC5e\n5D6cN48GXBGEVEizV5GaGiApiTc0Pv+83tb4Nj/+yPvf793L5/gnCKJpkGavIq+/DlRVAdfndlOc\nQNIjhw/nks7Mma6PB5IvGoN8IUK+kI/kuXEChT17AJsNyM8nnV4pbDagTx8+cRpNp0AQ2kAyjgeu\nXuVdLKdN898FSPTif//jb0p79gBms97WEITvQDKOCrzxBteVp0zR2xL/4667+CyZtMIVQWgDBXs3\nHDnC5Yb33uP96tUkEPVIkwlYtIj3zDlzRtwfiL5wB/lChHwhHwr2LmAMePxx3ojYs6fe1vgvffsC\nEyYoO0CNIAjXkGbvgqwsntVv2waEUBO2qhw/DtxyC7B5M00oRxDeoLlm/9e//hUxMTGIi4vDPffc\ng7NO4+BtNhuioqIQHR2NNWvWSH2ELly8yDP6N9+kQK8FnTrxNWvnztXbEoLwbyQH+zFjxmDfvn3Y\ntWsXevXqBZvNBgBwOBzIysqCw+FATk4Opk2bhhofmt/21VeBIUOAkSO1e2ag65HTp/M1AX76iXzh\nDPlChHwhH8nBPikpCUFB/PLBgwejtLQUAJCdnY20tDSYzWZYLBZERkYiPz9fGWtVpqSEZ/Qvv6y3\nJYFF69bA00/zKaMJglAHRRpoly1bhnHjxgEAysvLEeG0bFNERATKysqUeIzqzJrFJ+q6+WZtn2ul\nkUV48km+WHvHjla9TTEMVC5EyBfy8ahKJyUloaKiosH+jIwMjB8/HgAwf/58NGvWDPfff7/b+5jc\n9F1MT0+HxWIBAISFhSE+Pr72SxVe27Ta/te/7Fi9Gjh2TJ/nB/r2tm12jB8PvPKKFcuX628PbdO2\nUbbtdjsyMzMBoDZeSoLJYPny5WzYsGHs0qVLtftsNhuz2Wy128nJySwvL6/BtTIfrTjjxzP2+uv6\nPDs3N1efBxuMX35hrFWrXFZWprclxoDKhQj5QkRq7JQs4+Tk5OCVV15BdnY2QkNDa/enpqZixYoV\nqK6uRlFREQoLC5GYmCi9NtKAvDygoAD44x/1tiSwadeOzy66eLHelhCE/yG5n31UVBSqq6vRrl07\nAMDQoUOxZMkSAFzmWbZsGUJCQvDGG28gOTm54YMN1M9+9Ghg8mTgkUf0toQ4coSv71tUxBtuCYKo\nC81nL5HcXOCxxwCHgybkMgr33stnw3zySb0tIQjjQROhSSQjgy9IomegFxpjCO6LJ57gcxIZIBfQ\nFSoXIuQL+QR0sN++Hdi/H/DQkYjQgVGj+GIxmzfrbQlB+A8BLePcdx8fLfvnP+tqBuGCV1/lc92/\n/77elhCEsSDNvokcOgQMHcobAlu10s0Mwg2nTgGRkbzB9nofAIIgQJp9k3n1VT6NsRECPemRIoIv\n2rcHxo4FVqzQ1x49oXIhQr6QT0AG+1On+DTGTz2ltyWEJx58EPjkE72tIAj/ICBlnIULecPs8uW6\nPJ7wkupqIDwc2LoVkDNKnCD8CZJxvOTaNeCdd/iEZ4SxadaM97n/9FO9LSEI3yfggv2qVXzBjIED\n9bZEhPRIkfq+eOAB4OOPA7PPPZULEfKFfAIu2L/9NmX1vsSwYcD587wbJkEQ0gkozf7oUZ7Rl5YC\nTnO3EQbn6aeBsDDgxRf1toQg9Ic0ey/44AM+4RkFet8iNRX46iu9rSAI3yZggn1NDZCZCfzhD3pb\n0hDSI0Vc+WL4cODwYcBHFjxTDCoXIuQL+QRMsP/+e6BlS6B/f70tIZqK2QykpABff623JQThuwSM\nZp+eDvTrx/VfwvdYsQL46CMK+ARBc+N44NIloHNn4MAB3u2S8D0qK4Fu3YCff+ZvaAQRqGjeQPvC\nCy8gLi4O8fHxuP3221FSUlJ7zGazISoqCtHR0VizZo3URyjG6tW8F45RAz3pkSLufBEWBgwYwBeb\nCRSoXIiQL+QjOdjPnDkTu3btQkFBAe6++2689NJLAACHw4GsrCw4HA7k5ORg2rRpqKmpUcxgKfzn\nP8CkSbqaQCjA6NHAd9/pbQVB+CaSg31rpwVCz58/j/bt2wMAsrOzkZaWBrPZDIvFgsjISOTn58u3\nVCIXLwI5OcCECbqZ0ChWq1VvEwyDJ1/cfjuwfr12tugNlQsR8oV8QuRc/Pzzz+PDDz9EixYtagN6\neXk5hgwZUntOREQEynTsM7d6NTBoENChg24mEAoxcCBQXAycOAF07Ki3NQThW3gM9klJSaioqGiw\nPyMjA+PHj8f8+fMxf/58LFiwADNmzMByN9NImkwml/vT09NhuT6dYVhYGOLj42trcEGjk7u9cqUV\nv/udcvdTY9tZjzSCPXpuC/vcHR850orcXKBTJ2PYq+Z2QUEBZsyYYRh79Nx+/fXXVYkPvrBtt9uR\nmZkJALXxUhJMAYqLi9ktt9zCGGPMZrMxm81Weyw5OZnl5eU1uEahR3vk8mXG2rRh7MQJ1R8li9zc\nXL1NMAyN+eK11xh7/HFtbNEbKhci5AsRqbFTsmZfWFhY+//s7GwkJCQAAFJTU7FixQpUV1ejqKgI\nhYWFSExMlF4byeCHH4CYGONLOEJtTjTui2HDAmchcioXIuQL+UjW7J977jkcOHAAwcHB6NmzJ955\n5x0AQGxsLCZNmoTY2FiEhIRgyZIlbmUctVm1Chg3TpdHEyqRkMDXD/71V8CpjwBBEI3g14OqYmL4\nqMsBA1R9jGzsdjtlLtfxxhe33grMnct75/gzVC5EyBciNOtlPY4cAU6f5pkg4V8MHQps2qS3FQTh\nW/htZv/223zt0uuN2IQf8b//Ae++y8dPEESgQZl9PUiv918SE4Ht2wNzqUKCkIpfBvsrV/iUxqNH\n622Jdzj3MQ90vPFF586AyQSUl6tvj55QuRAhX8jHL4P9tm1Ajx5Au3Z6W0KogcnE22IKCvS2hCB8\nB7/U7G024Phx4PXXVbk9YQCefRa44Qbg+ef1toQgtIU0eyfsdoB6afk38fGU2RNEU/C7YH/lCu+W\nN3Kk3pZ4D+mRIt76IhCCPZULEfKFfPwu2O/cCXTvTnq9v9OrF2+gPXdOb0sIwjfwO81+8WJgzx5g\n6VLFb00YjAEDeH/7QYP0toQgtIM0++ts2QIMHqy3FYQW9OoFHDyotxUE4Rv4XbDPz+eDbnwJ0iNF\nmuKLqCj/DvZULkTIF/Lxq2B/+jRQUQHExuptCaEFlNkThPf4lWafkwMsXAjk5ip6W8Kg5OcDTzzB\np04giECBNHvwkbO+JuEQ0hFkHJojhyAaR3awX7RoEYKCgnD69OnafTabDVFRUYiOjsaaNWvkPsJr\ndu8G4uI0e5xikB4p0hRftG0LhIby0dL+CJULEfKFfGQF+5KSEqxduxY333xz7T6Hw4GsrCw4HA7k\n5ORg2rRpqKmpkW2oN+zZA/Ttq8mjCINAuj1BeIfkZQkB4Omnn8bLL7+Mu+66q3ZfdnY20tLSYDab\nYbFYEBkZifz8fAwZMsTF9UC/fsCYMUCXLnIsAS5dAo4eBXr3lncfPaAVeESa6otevYADB7wbMV1c\nzPvlHz8OjBoF3H8/EBwszc7GYIxP2/Htt8DPP/PyPW4cMGIEn8jNG5QqF7t2AV9/zRf0AfgKbvfc\nwycL1APGeHtLbi5QVASEhHCbxo8HnPLGOmjxG6mpAfLygO++A44dA5o35/Fk7FguGepJaSmftn3H\nDun3kJzZZ2dnIyIiAv369auzv7y8HBEREbXbERERKCsrc3mPzp15o2qfPsDvficWRin89BP/Qpo1\nk34Pwvfo3p0H8cb44Qdg4EDg2jVgyBDgvff4soaVlcrbVFjIV9N68kngN78BfvtbHjgeewwYPpxX\nTlpw6BCQksKD6MmT/O9OTAQOH+b/nzyZBxEt+fFHPgjuwQeBEyf4tBe9e/Mg1r8/jwPefJ9K8/XX\nXBV49FG+vvGAAdyuXbv4Mpipqfx71ZqyMu6ruDhg40bglltk3Ix5YPTo0axPnz4NPtnZ2Wzw4MHs\n7NmzjDHGLBYLO3XqFGOMsSeffJJ99NFHtfeYOnUq+/zzzxvc2/nRv/7KmM3G2I03MvbBB54scs/y\n5Yzdf7+0a/UmNzdXbxMMQ1N9sXw5Yw895Pmc48cZu+kmxnJyxH3XrjH2xBOMjRnD/68UeXmMdejA\n2OLFjNXU1D127Rpjb73FWPv2jK1f3/i95JSLr77idixaxNjlyw2Pnz/P2N/+xv2ycaPkx3hNTQ1j\nL77IWJcujGVlufb5xYuM/f3v3D9ffln3mFq/kaoqxv74R8Z69GDs668bfmeCXYsW8fiUmamKGS75\n6ivGOnbk31Nlpbi/kbDtFo8yztq1a13u37t3L4qKihB3vTW0tLQUAwYMwJYtWxAeHo6SkpLac0tL\nSxEeHu7yPunp6bBYLACAsLAwvPpqPF580YqTJ4H+/e0AxNc3oYHG3faqVXaEhQGAd+fTtjG3Bbw9\nv1s3K44d83z+Cy8AI0bY0bw5IJSPjRvtmDgRmDvXioULgaFD5dtfXAzMnGlFZibwm9/YsWFDw/P/\n9CcrYmOBu++2IyODb7u7X0FBgSR7vvoKePhhO+bPB6ZNc33+1q123H47cOutVkycCMyebUd8vDrf\nL2NAaqodhw4BO3ZY0amT+/NfeMGKpCTgzjvteOwxICODHy+4PuudkvZVVwOLF/PtN9+0o2VLwGRq\neH6LFjweLVrEy8vx40BionL+cbU9a5YdS5cCq1ZZcfmyHf/3f5kAUBsvJaFEDWSxWNgvv/zCGGNs\n3759LC4ujlVVVbEjR46wHj16sBoX1aW7R5eUMBYRwdjKlU2zISmJ18xEYHHwIGPdu7s/XlrKWNu2\njF1/8WzAsWOMtWvHz5NDVRVj8fGMvfeed+d/9RUv58ePy3tufXbv5pnxli3eX7NuHX8LcDiUtUVg\nzhzGBg7kb/Desm8fY506MfbNN+rYVFPDWFoaYxMnMlZd7f11ZWW8vC1fro5djPG/uXNnxvbvd31c\nathWJNh37969Ntgzxtj8+fNZz549We/evVmO87uz84M9GLxjBy+wTfkBWiyMFRZ6fz7hH1y8yFiz\nZu6lmHnz+Gu6J2bOZOyxx+TZMWcOY6mprmUAd8yaxdiECfKe68z584xFR0uTGpYuZSwujrFLl5Sz\nhzEunXXtylhFRdOv/fFHLmMUFytrE2OMvfIKr4AuXmz6tQ4Hrxy3bVPeroMH+b03bXJ/jq7BXtKD\nGzF4zhzvfwhVVfwH35Qa2kiQZi8ixRcdOjBWXu76WEwMY5s3e77+1Cme3UsNKhUV0q6/dImxnj0Z\nW73a9fGm+uL55xm7776m2SBQU8PYPffwCkgpfvmFsfBwxr77Tvo9Fixg7Le/ZWz9+lylzGL79vFk\nUk4l8sknvGK9cEExs9jVq4wNG8bY6697Pk9qsDfsCNpZs/ggqY0bGz/32DHetc1sVt8uwnh07szn\nRKrPoUPAmTONj6q+8UbgvvuAzExpz8/IAB56COjWrWnXhYYCb7wBzJjBewnJ4fBh3q100SJp15tM\nfHrwf/6T30sJ5s7lvVhuu036PZ55hveOWbdOGZtqaoCpU4F585r+fTmTlsZ779hsytgFAG+/zWPY\nU08pd886SKoiFMCbR7/7LmN33tn4vXJyGLv9dgWMInySMWNcZ8eLFzM2ZYp399i+nbGbb256z5zT\npxkLC5MmUzDGM+rBg5veRlWfBx7gkpVcMjK4ji2XAwd475UTJ+Tfa9Mm3ovn/Hn598rK4vKNEj2w\niov5G11Jifx7nTnDJas9exo/V2rYNmxmDwAPPwxs3Qo4HJ7PO3wY6NlTG5sI43HTTa4z+x9+8H55\nyv79+fQL69c37dkffcT7snfq1LTrBEwm4LnngAULpM/xU1wMrF6tTEY4Ywbw/fd83Ioc5szhWXmH\nDvJtGjqUf+QuSHT1KvDCC/xNLEiByNetG/D44/xvlcvChXw8RJ8+8u/lDkMH+xYt+ECU997zfN6R\nI/qNBlSC+t0OAxkpvnAV7BnjQWvECO/vk5YGfPGF9+czxgPQo496f40rxo8Hzp/nA46c8dYXr73G\npYk2beTZAfDf3JNPAq++Kv0ex44Ba9bwGUmVYswY3vWxqkr6PbKyeFkZPVoxs/CXv/AyU14u/R7n\nzvEY9+KLytnlCkMHe4BroVlZvFZ2B2X2gY2rYF9RwQNDU5KAceP4kHRvM+wdO/g0HXJH8gcFAX/4\nA/D++02/9tIl4MMPgenT5dngzLRpPIBJnWDujTeA9HRlKh+BXr141vvJJ9Lv8dZbfIoWb6er8IZ2\n7fgI18WLpd/j3//mU8bIaUPwCknijwI05dHx8Z5H+fXty7trEoHJxx837IXy7beMWa1Nu09NDe8m\n6G1/8zlzGHvmmaY9wx3CeICmdgVcsYKPMVGahx5i7B//aPp1ly9zHbuoSHGT2P/+x9jw4dKu3bqV\nsW7deI8XpTl8mLdPSOm2evUq7zbelHERUsO24TN7ALjzTj53hSsY830Zh5BHp04Ns9C9e5s+A6rJ\nxLP71au9O//rr3nZVILwcD53T3Z206776COeWSrNQw/xN4amsmoV97ucgZ7uGDeOv8VLmVto6VKu\nr6sx8V2PHnzumm++afq133/P34C0WIfDJ4J9SgrXAF1x6hSf/EzJV0atIc1eRIovbryRL0npzJ49\n0hq7xo7lk/M1Rnk5TzKGDWv6M9xx773Al1+K24354pdfeLC45x7lbBC47TYuhTXWOaI+H38MPPCA\n8vbY7XaYzbwSamoX2StXgP/+l89yqhYPPsgr3qailr9c4RPBfuBA3mfa1QyFZWWA0ySbRADSrl3D\nYH/okLTprkeMALZsabzf+6pVQHKysmM7hKTG2z73337LZ9Rs1Uo5GwSCg/msmCtXen/N2bPA2rW8\n0lKLtDTgs8+a1nMpN5e36bmbPlkJ7rmH9+SqXw49UVXFK6G0NPXscsYngn2zZvw1p35vBYBnWG7m\nWfMZrHJb+PwIKb5o25YPnnLm6FFpUkL79nyQ1t69ns/74Qc+J76SdO3KG5u3bePbjfni2295haMW\n48Z595YjsG4d7yLZtq3ytgi+iI8HLl9umpSzciWfOllN2rThvXzcyc2uWLuWv31qlaz6RLAH+Pzb\nW7c23F9WJn/hE8K3adWKZ0lCt7zqaj5XutQkYOhQvoiFJ/LzgcGDpd3fEykp3rUZMMbfAsaOVd4G\ngREjgH37uFzkDWvWqFv5ALxdxVMbXn1qang7yMSJ6toF8O/i22+9Pz8nR7k2H2/wmWCfkADs3Nlw\nf3m57wd70uxFpPjCZOJSjpDdl5TwQB8icR22/v1dlzWBs2d5X3JZC0m4YexYsX3Kky927+aVnJod\nE5o35zKRm5nO68AYD3Rjxqhji7Mv7rwT+Oor767bu5dn3d27q2OXM8nJ/LvzdhXWtWuBpCR1bXLG\nL4K9r8s4hHycpZyiInm9QdyVNYFt2/g5UisTTwwZwldHunzZ83nffadNoEhJ8U7KOXSIN4TGxqpv\n0223Adu38zlzGiM3V3m5zR3duvERw94sHXj0KG+DrLfQn6r4TLDv0YM7p742W17ONVZfhjR7Eam+\ncG6kLSuTlwDExfGM0F1DqVoSDgC0bMnXY92+3bMvtm7lFYPajBrl3WSE69bxykfJAUvOOPuiRQv+\nHbmSdeujZbAHvO/NJWT1Skzb4C0+E+xNJj6Krv46kCdOSJ+XhPAf2rYVg/3Jk0DHjtLv1bo1z9CK\nilwf37JF3X7R3rQZbNvGe6mpTe/eXLb6+WfP5+Xl8fV1tWLoUGDzZs/nXLvGKyotc6lRo3h32MbI\nzeVrIGuJzwR7gAf7gwfr7jt1iveg8GVIsxeR6gvnzP7kSfkTcMXEAPv3uz62axeXcdRiwAAuI7nz\nRWUl7wMvpWtpUwkK8i6wbt+ubuVT3xfe2LR3L6/0tXzzHzrUu66727ZpM5DKGcnBfu7cuYiIiEBC\nQgISEhKw2qkLgc1mQ1RUFKKjo7HG3WgoCURF+WewJ+Rzww18QimAv+3JyewBIDradbC/eJEHWjUb\n/BISPOu+O3bwLohqjAZ1xaBBPJi748IF/hakRoO1O4Rg76m//Y4d2rz9ONO+PS97ngajnT3L5efo\naO3sAmQEe5PJhKeffho7d+7Ezp07kZKSAgBwOBzIysqCw+FATk4Opk2bhhpvm6cboX5mX13Nf3y+\nPHoWIM3eGam+aNmSlwVAmcw+Otr1NL8HD/IBOmo0zgrExvIGvEGDrC6PayXhCDRW+RQUcJubNVPP\nhvrloksXLrfVT/6c2bWLa/taM3Cg58pR68paQJaMw1xUq9nZ2UhLS4PZbIbFYkFkZCTy8/PlPKaW\nm2/mXd7+nQfWAAAbvElEQVQEfvmFD5VXq1GI8B1atuQZJiBfsweAyEg+HUJ9fvqJSzxqYjbz57sb\nOLRtG5d6tKJ/fx683GXR27dra4/A4MGeG2l37eJBVWu86c2lh79kBfvFixcjLi4OU6dOReX1uQzK\ny8sR4TQkLCIiAmVlZfKsvE54OO9pIeAvEg5p9iJSfeEc7E+ckJ/ZWyw8u65PYSGXE9UmJgb4/HO7\ny2N792rbZS88nGvQJ064Pq5FsHdVLvr2dT/SmTH+xqFHZt9YsFe7fcMdHoN9UlIS+vbt2+Dz5Zdf\n4oknnkBRUREKCgrQuXNn/OUvf3F7H5NCqXeXLrxXgKAKnTzpH8GekE/9zF5usO/aleuq9ddRKC7W\nZoBOdHTdt1iBq1f5G4cWFY6AycQrH3erV6ndYO2OPn3cB/uSEr7Gr9w3PCnExfFBb+7ehPTK7D0q\nj2u9GToH4JFHHsH48eMBAOHh4SgpKak9VlpainA3nZ7T09NhuT76JSwsDPHx8bXanFCT199u08aK\nEyeA/fvt2LABaN/e8/m+sG21Wg1ljy9uFxfbcfgwcPWqFZcuAdu22WEySb/fpk123HADUF5uRbdu\n4vGjR62YPFn9v4cxO4qLUYtwvGtXK266CdiyRd3n199u08aO7OyGx0eOtKKwEDhxwg67Xb3nC/uc\nj1+4AOzZ4/r8jz6yo2tXANDGP87bHTrw7++LL4B77ql7fPBgK0pLgZ9/tuPECe/uZ7fbkXl9qk+L\nnNGCkmbBZ4yVl5fX/v+1115jaWlpjDHG9u3bx+Li4lhVVRU7cuQI69GjB6upqWlwvdRHx8Uxtm0b\n//+77zL2yCOSbkP4GStXMjZhAmOVlYzdcIMy9xw+nLENG+ru69GDL6atNlu38kV76vPNN3yBda15\n9VXGnnqq4f7iYr4YuB5cvcpY8+aMXbjQ8Ni8eYzNnKm9TQIjRjCWm9tw/65djMXEyLu31NgpWbN/\n9tln0a9fP8TFxWHDhg34xz/+AQCIjY3FpEmTEBsbi5SUFCxZskQxGQfg+mFpKf//uXO8y52vI9Ti\nhDzN/uJFLuW0bKmMLd261ZVSrl3jZU/15ePA2wwKC+0N9mvVZlCf3r1d93w5eJD3klMbV+UiOJhL\naq4a0gsLtRmH4A53vbkOHNDPLskdyD744AO3x2bPno3Zs2dLvbVHOnXimizA58Zo3VqVxxA+hqDZ\nnz+v3PzuN91UdwWsigo+Ujc0VJn7e+LGG3nlUlkJhIWJ+48dU3dednd07+66wVqrYO+OqCg+L0/9\nhWoOH+br+uqF3pWjK3xqBC1Qd3bDX3/1j8zeWZcMdKT6Qo1gX3+5w4oK7UZjmkxAVJS1wZQNxcX6\nBHuLhT+7/pCZo0e1WRLUXbmIjGw4hQrAg33Pnura5Al3leOhQ/q8mQE+GOyd50ChzJ4QEIK9kjLO\nTTfxAC9w/Li28zBZLA3n5zl2TBsZqT4tW/LfWv21fvWyR6BnTx5Anblwgb8R6Tkbrruuu3pV1oAP\nBnvnzP7cOf8I9qTZi8jR7NWQcfQM9kFBdtQfolJcrF9w7d69YeWjlT3uykW3bmIbnsDRozygBukY\n3dxl9hTsm4DzhFf+IuMQ8vnNb8Rgr1RmX1/G0TrYt2tXt7K5fJlnrDfdpJ0Nztx8M+p0BwX0z+wj\nIhoGeyOsS922rdjmIlBTw23lXUK1x+eCvfMiFf4i45BmLyJHsxd64/hLZj90qLXB8zt21C9j7dy5\nrj+qq3lnCS3aMdyVC3fBXu/V60ymhpVjRQVvbG/RQh+bfC7YO2f2/iLjEPJp3pyPLq2sVC7Yt2/P\n518SGiWPH9c2q64fXPVeu6Fz57rz2v/8M6981JwUrjHat+eVvDAJHiB/8Rql6NKl7ven91uQTwZ7\nf+uNQ5q9iFRfmExcyjl5UjkZJySE3/P8eb6txNTJTaGszF4nuAqZvV7Uf9PRsvJxVy5MpoZzZhkl\n2N90U93KUcveXK7wuWBPvXEIdwQH87c9pTJ7gE+fLeiuZ87w8qcV9TV7I2T2RrJHwHmgJcDnNNJb\nxgH0rRxd4XPBvk0bHuRravwn2JNmLyLHF0FBfGEIpTJ7gGusZ8/y/589q+3aCXffbcXJk+KqR1q/\nWdSnfqaqpT2eykWHDnwGXAEjaPaA6zYfPb8/nwv2QUFcnxUCfvPmeltEGAU1MvuwMDGz1zrYm828\n4hJW4NI7WLjK7PW0R6B9+7rB/tQpY9hFmb0ChIbyH2BoqH8sXEKavYgcXwQF8d44SvZ2EGQcxrQP\n9na7vU5lo3ewuPFGLmUJbxpa9k7yVC7qB3thUSO9ocxeAUJDebbTTMVl0AjfIziYdwdUcrk3Qca5\nfFl8q9QS567Gei/WExzMZVMl1/pVAudgX13NvysjdNyoP05D78raJ4N9ixb8B+gvwZ40exG5mv2V\nK8oH+8pK7bN6gPvCObM/d07/9ZbDwsTKR4kVwbzFU7lwDvanT/MK0ghv/G3b1h1URZm9BCizJ1wR\nHMyDvZKDjtq04YFej2APNGwz0DtjdbanspL3GNKb+sHeCBIOUNdXAJeX9Hwz88lg72+ZPWn2InI1\ne3/K7O12ex0ZxwjrN+hlj7eavVH0eoAnpTU1XFYC9H8z88lgL2T2ZrPelhBGQo1gLzTQGiGz1ztY\nuLJH78oH4MFeWOPi9GljvG0AXEoS2nyqqvTvPSgr2C9evBgxMTHo06cPnn322dr9NpsNUVFRiI6O\nxpo1a2QbWZ8WLfxLxiHNXkSOL9SQcVq14j189NTsz5zhgULJeX+koldm76lchIWJjcZGyuwBsXIU\nKmo92xIkz2qRm5uLL7/8Ert374bZbMbJ61Wrw+FAVlYWHA4HysrKMHr0aBw8eBBBCv4CSbMnXBEU\nxDMoJTP70FB+T7308rZt+VJ2wmyeek7bC4jB69o14NIlZQewSaVlS+4fxoyV2QOiv4KD9X8Lklx0\n3nnnHTz33HMwX9dSOlxvls/OzkZaWhrMZjMsFgsiIyORn5+vjLXXCQ0lzd5fkeMLNTL75s255nrp\nEp8nR0uc+9kboXEWqJuptm6tXabqqVyYzfy7r6oy3nxZ9TN7PZH8sygsLMTGjRsxZMgQWK1WbNu2\nDQBQXl6OCKfJpCMiIlBWfwUGmfibjEMogxqafWgoD/ZVVfrora1b8wBmFH1ckHGMYo9Aq1Y8u79w\nQftK2RNGqqw9yjhJSUmocB4Cdp358+fj6tWrOHPmDPLy8rB161ZMmjQJR1wt8w7A5Kb6T09Ph8Vi\nAQCEhYUhPj6+VpsTanJX26GhgMNhR3U1ADR+vtG3rVaroezx1e1Ll4ArV6wIClLu/s2bW1FVBfz0\nk/36NLra/n1CZSNmtto+v/52mzZWnD0LfPed/Xqlqs3zhX3ujoeE2LFuHXDxohUtWxqjPAJAWJgV\nlZVAYaEdV64AUvxlt9uRmZkJALXxUhJMImPHjmV2u712u2fPnuzkyZPMZrMxm81Wuz85OZnl5eU1\nuF7Go9n06Yzddhtjd94p+RaEH5KQwFirVozl5ip3z61bGRswgLE5cxh78UXl7ustdjtjI0cylpPD\n2Jgx2j+/PitXMnbPPYz98ANjw4bpbY1IbCxje/Yw9vDDjC1frrc1IjNnMmazMfb++4w9+KAy95Qa\nOyXLOHfffTfWr18PADh48CCqq6vRvn17pKamYsWKFaiurkZRUREKCwuRmJgovTZygb810IpZGyHH\nF0EqyDjNm3MJRw8Zx26312b2RpABAPFNQ2sZp7FyIcg4Fy8ao9FYoFUrbpNeXXedkdwbZ8qUKZgy\nZQr69u2LZs2a4YMPPgAAxMbGYtKkSYiNjUVISAiWLFniVsaRCmn2hCvUaKB11uz1GP0YGsobhy9e\nNIYW3aKFPsG+MYQushcuGCvYh4Yap81FcrA3m8348MMPXR6bPXs2Zs+eLdmoxvC33jjOumSgI8cX\nQUG8P7oamX11tfblzWq14sABHlyrq40xnbdQ+Wi9JGhj5cI5szdCpSggJAsmk7YL37hCx9UjpeNv\nMg6hDEKQVyuz1yPYCpl0dbUxRow7+yM0VG9rRJx74xgpsxe67ppM+vvLJ6dLaNGCZxf+EuxJsxeR\nq9kDymf2emXWzpq9Hm8WrtCr8mmsXAgDq4zW9dL5+9P7zcxnM3vAGIWfMA5qZfZCA60e5c1owd5o\n9ggYtYFW8FdIiP7+8slgL3yZRnitVQLS7EXkavaAspl9s2bighhaZ2ZWqxVXruD6+AH9gwUgavZa\n2+OtZm/UzL5ZM/2/P5+UccLC+L96O48wFkKwVzKzN5nENY/1eA0PCeGNzhcvGqO8O8s4RrBHoFUr\n/h0ZNbM3goxDwd4AkGYvIscXQkavZGYP8B+pHh0C7HZ7bcPer78ao7zrJeM0Vi6c5zBScg1iuRhJ\n9vLJYC90YdLbeYSxUEPGAcSuvnplZkbqfeY8yMxIMmpwMJdxQkP1nxnUGefeS3p/fwZyi/f4W2ZP\nmr2IHF+o0UAL6JfZC74QVmYzQnANCuJ+0PpNo7FyERLCvyMj6fUAZfayEYYdh/hk8zKhFmpm9ufO\nUWYvYCRZSSA4mNtk5GBPmr0EhCAvrO3o65BmL6KEZq9GZn/pkj797AHjBVc9Kp/GyoUwn70R3n6c\n0XMEdn18MtgLXLigtwWEkVAzswf0+7EabS4oQVYyij0A/86rq5X/7uVCmr1C+EuwJ81exKiavfO/\nWiH4wmhzQQmZvZZZdGPlwujBnjJ7mfDFJAiCo3ZmT5o9x2j2AKKMY7R2PNLsFSAuDhg1Sm8rlIE0\nexGjzY0DiB0C9OhnD9QdhWkE9JCVvNHsjZjZN2vGRxsb4fszWD3oPQUFeltAGA21ZJwePfi/emVm\nQg8TozQ+GjWzr67Wf874+ggjsI3gL5/N7P0J0uxFjDY3DgB0787/1aufvTBvvN7BQkAYoWqkfvZG\nzewB4/SmkhzsJ0+ejISEBCQkJKB79+5ISEioPWaz2RAVFYXo6GisWbNGEUMJojHUyuy7dat7f60R\nslW9g4VAq1b8X6O8aQDG1ewB/dt8BCT/LFasWIGdO3di586dmDhxIiZOnAgAcDgcyMrKgsPhQE5O\nDqZNm4aamhrFDPZHSLMXMaJmHx6u7P28RfCF0TJ7PezxVc0eEIO83t+f7ByIMYb//Oc/SEtLAwBk\nZ2cjLS0NZrMZFosFkZGRyM/Pl20oQTSGWpn9LbcAzzyj7D2bgtEye6NVPoCxg70wC6febx2yfxbf\nf/89OnXqhJ49ewIAysvLERERUXs8IiICZWVlch/j15BmL2JEzb5ZM+CVV5S9pzcYVbPXwx5vNPsr\nV4wZ7IXK2mTS1w6PdU1SUhIqKioa7M/IyMD48eMBAJ9++inuv/9+jw8xufkr09PTYbFYAABhYWGI\nj4+v/VKF1zbapm1vt3/+GQCsCA42hj1KbfNgYcf27UBUlP728GBvx44dQK9e+tsDAHv28O2QEGPY\n4+r7s9ulXW+325GZmQkAtfFSEkwGV65cYZ06dWJlZWW1+2w2G7PZbLXbycnJLC8vr8G1Mh/tV+Tm\n5uptgmGQ44vp0xkDGKupUc4ePRF88fXX/O9y+pnpyjvvcHtKS7V7ZmPlYsMGblNKijb2NIWJE7lt\nSiE1dsqScdatW4eYmBh06dKldl9qaipWrFiB6upqFBUVobCwEImJiXIeQxBeERTEP3q/LisNafaN\no9bCNUpglL7/spoMsrKyahtmBWJjYzFp0iTExsYiJCQES5YscSvjEBzh1Y2QPzdOkB+NHBF8QcHe\nO83e+V8j4RfBfvny5S73z549G7Nnz5Zza4JoMkFBxvyxy8VombTR7AEo2HuDH+VBvovQGEPIn8/e\nnzJ7wRdCcDXKICaj9rMH9O/e6ArBX3rjRz8NItDx98zeKH+bMFePUewBjJ3ZDxumtwUcCvYGgDR7\nEdLsRQRfhIbylbKMgjD8X0t8WbMfPhxgTG8rKNgTfoS/ZvaAPgHWHR076m1BQ4wc7I0CBXsDQJq9\niBxf+FuwN2q5aNVK+0zVlzV7o0DBnvAb/E3GIbyHMvvGoZ+GASDNXkSOL/wts6dyIdKYL4SM3p++\nf6WhYE/4DZTZBy6U2TcO/TQMgFG1WT0gzV6EyoUIafbyoWBP+A2U2QculNk3Dv00DABpsyKk2YtQ\nuRDx5X72RoGCPeE3+FuwJ7yHgn3jULA3AKTNitDcOCJULkS81ewp2LvHj34aRKBDmX3gQg20jUPB\n3gCQNitCc+OIULkQIc1ePn700yACHcrsAxcK9o0jOdjn5+cjMTERCQkJGDRoELZu3Vp7zGazISoq\nCtHR0VizZo0ihvozpM2KkGYvQuVChDR7+UhWuGbOnIl58+YhOTkZq1evxsyZM5GbmwuHw4GsrCw4\nHA6UlZVh9OjROHjwIIL86VdIGBLK7AMXk4l/SLN3j+QI3LlzZ5w9exYAUFlZifDwcABAdnY20tLS\nYDabYbFYEBkZifz8fGWs9VNImxWhfvYiVC5EvPFFcLB/ff9KI7keXLBgAUaMGIFnnnkGNTU12Lx5\nMwCgvLwcQ4YMqT0vIiICZWVl8i0liEbwNxmHaBoU7D3jMdgnJSWhoqKiwf758+fjzTffxJtvvokJ\nEyZg5cqVmDJlCtauXevyPiaTyeX+9PR0WCwWAEBYWBji4+Nra3BBowuEbWc90gj26Lkt7JNy/U8/\nAcHBxvp75GwXFBRgxowZhrFHz+3XX3/dq/jgT9+/sG2325GZmQkAtfFSEkwirVu3rv1/TU0Nu+GG\nGxhjjNlsNmaz2WqPJScns7y8vAbXy3i035Gbm6u3CYZBji9WrmTst79VzBTdoXIh4o0vWrdmbOlS\n9W3RG6mxU/JLb2RkJDZs2AAAWL9+PXr16gUASE1NxYoVK1BdXY2ioiIUFhYiMTFRem0UAAi1OUGa\nvTNULkS88QXJOJ6RrNkvXboUf/rTn1BVVYUWLVpg6dKlAIDY2FhMmjQJsbGxCAkJwZIlS9zKOASh\nJKTZBzYU7D0j+acxcOBAbNmyBQUFBdi8eTMSEhJqj82ePRuHDh3C/v37kZycrIih/oyzXh3oyPGF\nv2X2VC5EvPEFBXvPUB5E+A1duwLx8XpbQehFcDD1s/eE6brgr/2DTSbo9GiCIPyQrl2B114Dfvc7\nvS1RF6mxkzJ7giD8ApJxPEPB3gCQNitCvhAhX4iQZi8fCvYEQfgFFOw9Q5o9QRB+QWws1+zHjtXb\nEnUhzZ4giICGMnvPULA3AKTNipAvRMgXIqTZy4eCPUEQfgEFe8+QZk8QhF+QmAj84x/A8OF6W6Iu\npNkTBBHQ3HEHIGcGYH+Hgr0BIG1WhHwhQr4Q8cYXc+YA1xfMI1xAwZ4gCCIAIM2eIAjChyDNniAI\ngnCL5GC/a9cuDB06FP369UNqaip+/fXX2mM2mw1RUVGIjo7GmjVrFDHUnyFtVoR8IUK+ECFfyEdy\nsH/kkUfw8ssvY/fu3ZgwYQJeeeUVAIDD4UBWVhYcDgdycnIwbdo01NTUKGawP1JQUKC3CYaBfCFC\nvhAhX8hHcrAvLCzErbfeCgAYPXo0Pv/8cwBAdnY20tLSYDabYbFYEBkZifz8fGWs9VMqKyv1NsEw\nkC9EyBci5Av5SA72t9xyC7KzswEAK1euRElJCQCgvLwcERERtedFRESgrKxMppkEQRCEHDwu4pWU\nlISKiooG+zMyMrBs2TJMnz4d8+bNQ2pqKpo1a+b2PrTguGeOHj2qtwmGgXwhQr4QIV8oAFOAAwcO\nsMTERMYYYzabjdlsttpjycnJLC8vr8E1AOhDH/rQhz4SPlKQ3M/+5MmT6NChA2pqapCeno7bbrsN\n6enpcDgcuP/++5Gfn4+ysjKMHj0ahw4douyeIAhCRyRr9p9++il69+6NmJgYREREID09HQAQGxuL\nSZMmITY2FikpKViyZAkFeoIgCJ3RbQQtQRAEoR2qj6DNyclBdHQ0oqKisHDhQpfnTJ8+HVFRUYiL\ni8POnTvVNkk3GvPFxx9/jLi4OPTr1w/Dhw/H7t27dbBSG7wpFwCwdetWhISE4L///a+G1mmLN76w\n2+1ISEhAnz59YLVatTVQQxrzxalTpzB27FjEx8ejT58+yMzM1N5IDZgyZQo6deqEvn37uj2nyXFT\nktLvJVevXmU9e/ZkRUVFrLq6msXFxTGHw1HnnG+++YalpKQwxhjLy8tjgwcPVtMk3fDGF5s2bWKV\nlZWMMcZWr14d0L4Qzhs1ahS744472GeffaaDperjjS/OnDnDYmNjWUlJCWOMsZMnT+phqup444s5\nc+awWbNmMca4H9q1a8euXLmih7mqsnHjRrZjxw7Wp08fl8elxE1VM/v8/HxERkbCYrHAbDZj8uTJ\ntX3zBb788kv8/ve/BwAMHjwYlZWVOH78uJpm6YI3vhg6dCjatGkDgPuitLRUD1NVxxtfAMDixYtx\n7733okOHDjpYqQ3e+OKTTz7BxIkTa8evtG/fXg9TVccbX3Tu3Bnnzp0DAJw7dw433ngjQkI89iD3\nSW699Va0bdvW7XEpcVPVYF9WVoauXbvWbrsaYOXqHH8Mct74wpl///vfGDdunBamaY635SI7OxtP\nPPEEAP8dq+GNLwoLC3H69GmMGjUKAwcOxIcffqi1mZrgjS8effRR7Nu3D126dEFcXBzeeOMNrc00\nBFLipqpVorc/UFavjdgff9hN+Ztyc3OxbNky/PjjjypapB/e+GLGjBlYsGBB7XSu9cuIv+CNL65c\nuYIdO3bgu+++w8WLFzF06FAMGTIEUVFRGlioHd74IiMjA/Hx8bDb7Th8+DCSkpKwa9cutG7dWgML\njUVT46aqwT48PLx2GgUAKCkpqTOVgqtzSktLEe6Hy8144wsA2L17Nx599FHk5OR4fI3zZbzxxfbt\n2zF58mQAvFFu9erVMJvNSE1N1dRWtfHGF127dkX79u3RokULtGjRAiNHjsSuXbv8Lth744tNmzbh\n+eefBwD07NkT3bt3x4EDBzBw4EBNbdUbSXFTsRYFF1y5coX16NGDFRUVsaqqqkYbaDdv3uy3jZLe\n+KK4uJj17NmTbd68WScrtcEbXziTnp7OPv/8cw0t1A5vfPHTTz+x22+/nV29epVduHCB9enTh+3b\nt08ni9XDG1/8+c9/ZnPnzmWMMVZRUcHCw8PZL7/8ooe5qlNUVORVA623cVPVzD4kJARvvfUWkpOT\nce3aNUydOhUxMTF47733AAB//OMfMW7cOKxatQqRkZFo2bIlli9frqZJuuGNL/7+97/jzJkztTq1\n2Wz2yxlDvfFFoOCNL6KjozF27Fj069cPQUFBePTRRxEbG6uz5crjjS9mz56NP/zhD4iLi0NNTQ1e\nfvlltGvXTmfLlSctLQ0bNmzAqVOn0LVrV7z00ku4cuUKAOlxkwZVEQRBBAC0LCFBEEQAQMGeIAgi\nAKBgTxAEEQBQsCcIgggAKNgTBEEEABTsCYIgAgAK9gRBEAEABXuCIIgA4P8BYqjO7Di3rxwAAAAA\nSUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 29 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Another filter design, low pass\n", + "rsid_fir_coeff = [x*5.2 for x in [\n", + "0.000306, \n", + "0.001117, \n", + "0.002461, \n", + "0.004306, \n", + "0.006491, \n", + "0.008734, \n", + "0.010690, \n", + "0.012026, \n", + "0.012500, \n", + "0.012026, \n", + "0.010690, \n", + "0.008734, \n", + "0.006491, \n", + "0.004306, \n", + "0.002461, \n", + "0.001117, \n", + "0.000306]]\n", + "\n", + "w,h=signal.freqz(rsid_fir_coeff,1) # Compute impulse response \n", + "\n", + "plt.plot(w/pi,20*log10(abs(h)))\n", + "plt.grid()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 70 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Convert to si hex" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "rsid_si_coeff_values = si_coeff(rsid_fir_coeff)[0:9]\n", + "\n", + "print rsid_si_coeff_values\n", + "print \", \".join(hex(n) for n in rsid_si_coeff_values)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[1, 4, 9, 17, 25, 34, 42, 48, 49]\n", + "0x1, 0x4, 0x9, 0x11, 0x19, 0x22, 0x2a, 0x30, 0x31\n" + ] + } + ], + "prompt_number": 71 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and back again (to simulate precision loss)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "rsid_si_fir_coeff = si_normalise_coeff(sym_fir_coeff(rsid_si_coeff_values))\n", + "print rsid_si_fir_coeff" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[0.0013020833333333333, 0.005208333333333333, 0.01171875, 0.022135416666666668, 0.032552083333333336, 0.044270833333333336, 0.0546875, 0.0625, 0.06380208333333333, 0.0625, 0.0546875, 0.044270833333333336, 0.032552083333333336, 0.022135416666666668, 0.01171875, 0.005208333333333333, 0.0013020833333333333]\n" + ] + } + ], + "prompt_number": 72 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "w,h=signal.freqz(rsid_si_fir_coeff,1) # Compute impulse response \n", + "\n", + "plt.plot(w/pi,20*log10(abs(h)))\n", + "plt.grid()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nAkRENvb/AY0p+cIYNG7VAAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 73 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test RSID data" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "rsid_symbol_rate = 11025.0/1024\n", + "sqw_frequency = 2000 # approx 2kHz\n", + "\n", + "# The ratio between the rsid frequency step and the channel frequency step\n", + "# In our case the channel frequency step is bigger than the rsid frequency step so we try to \"interpolate\"\n", + "ratio = rsid_symbol_rate/7.805\n", + "\n", + "rsid_data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 5, 2, 12, 0, 11, 4, 6, 2, 10, 11,1 ,8, 12, 13, 7, 4, 15, 12]\n", + "\n", + "# The number of sqw periods per symbol period\n", + "sqw_periods = int(round(sqw_frequency/rsid_symbol_rate))" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 74 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "tones = [(round(t), t-round(t)) for t in [x*ratio for x in rsid_data]]\n", + "print tones" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[(0.0, 0.0), (1.0, 0.3794492713004485), (3.0, -0.24110145739910305), (4.0, 0.13834781390134587), (6.0, -0.4822029147982061), (7.0, -0.10275364349775806), (8.0, 0.27669562780269175), (10.0, -0.3438551008968602), (11.0, 0.03559417040358781), (12.0, 0.41504344170403584), (14.0, -0.20550728699551613), (15.0, 0.17394198430493368), (17.0, -0.4466087443946165), (18.0, -0.06715947309416848), (19.0, 0.31228979820627956), (21.0, -0.3082609304932724), (7.0, -0.10275364349775806), (3.0, -0.24110145739910305), (17.0, -0.4466087443946165), (0.0, 0.0), (15.0, 0.17394198430493368), (6.0, -0.4822029147982061), (8.0, 0.27669562780269175), (3.0, -0.24110145739910305), (14.0, -0.20550728699551613), (15.0, 0.17394198430493368), (1.0, 0.3794492713004485), (11.0, 0.03559417040358781), (17.0, -0.4466087443946165), (18.0, -0.06715947309416848), (10.0, -0.3438551008968602), (6.0, -0.4822029147982061), (21.0, -0.3082609304932724), (17.0, -0.4466087443946165)]\n" + ] + } + ], + "prompt_number": 75 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def get_frac_signal(sr=16000):\n", + " signal = []\n", + " sqw_width=int(round(sr/sqw_frequency))\n", + " \n", + " #print \"Width: \"+str(sqw_width)\n", + " \n", + " for t in tones:\n", + " (inte, frac) = t\n", + " for i in range(sqw_periods):\n", + " high = int(round(sqw_width*(0.5+frac))) #(1+frac)/2)\n", + " #print \"High: \"+str(high)\n", + " for j in range(high):\n", + " signal.append(1)\n", + " for j in range(sqw_width-high):\n", + " signal.append(-1)\n", + " return signal\n", + "\n", + "def get_inte_signal(sr=16000):\n", + " signal = []\n", + " \n", + " for t in tones:\n", + " (inte, frac) = t\n", + " for i in range(int(round(sr/rsid_symbol_rate))):\n", + " signal.append(inte)\n", + " \n", + " return signal\n", + "\n", + "def get_perfect_signal(sr=16000):\n", + " signal = []\n", + " \n", + " for t in rsid_data:\n", + " for i in range(int(round(sr/rsid_symbol_rate))):\n", + " signal.append(t*ratio)\n", + " \n", + " return signal" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 76 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Returns rsid-like signal as a list of modem output channels over time\n", + "def get_rsid_channel_series(sr=16000):\n", + " inte = get_inte_signal(sr)\n", + " frac = get_frac_signal(sr)\n", + " return [x + y for x, y in zip(inte,frac)]\n", + " \n", + "\n", + "channel_data = get_rsid_channel_series(16000)\n", + "plt.plot(channel_data)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 77, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEACAYAAABfxaZOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHdxJREFUeJzt3X1wVNX9BvDnBlK15U1esknZTBNDQiAJyba8+Ia/YAzI\n1CAUWqAOMBAZB0dHhbHgWNvgtBDotArItIxFB3UMtVYoY0vkdZUBgQpJtUCFSlJDSIJAUyGI5OX8\n/tiyEJLdvck99/U8n5kMsHtz7/fs3vvs2XPPvWhCCAEiIlJCnN0FEBGRdRj6REQKYegTESmEoU9E\npBCGPhGRQhj6REQK0RX6NTU1GDduHLKyspCdnY3Vq1cDAEpKSuD3+xEIBBAIBFBeXm5qsUREZIym\nZ55+fX096uvrkZeXh4sXL+J73/seNm/ejLfeegu9e/fGwoULraiViIgM6qlnocTERCQmJgIAevXq\nhWHDhqG2thYAwGu7iIjco8tj+tXV1aioqMDtt98OAFizZg1yc3NRXFyMxsZG6QUSEZE8XQr9ixcv\nYtq0aVi1ahV69eqFBQsWoKqqCpWVlUhKSsKiRYvMqpOIiCTQNaYPAM3NzXjggQcwceJEPPnkkx2e\nr66uRlFRET755JP2G9A0OZUSESnGjOFzXT19IQSKi4sxfPjwdoFfV1cX/vumTZuQk5MT8fe9+vPz\nn//c9hrYPraN7fPej1l0ncjdu3cv3njjDYwYMQKBQAAAsGzZMpSVlaGyshKapiE1NRXr1q0zrVAi\nIjJOV+jffffdaGtr6/D4xIkTpRdERETm4RW5BuXn59tdgqm83D4vtw1g+6hzuk/kdnsDmmbq+BQR\nkReZlZ3s6RMRKYShT0SkEIY+EZFCGPpERAph6BMRKYShT0SkEIY+EZFCGPpERAph6BMRKYShT0Sk\nEIY+EZFCGPpERAph6BMRKYShT0SkEIY+EZFCGPokTWsroGmxf776yu5KyUn07DPNzXZX6R0MfZKm\nrk7fcrt3m1sHec+xY3ZX4B0MfbKcptldAblNHJNKGr6UJI3eMOcBTF3FjoI8PPzIcjyAqau4z8jD\n0Cdp9P4fzjyAiezD0CfLcXiHyD48/Mhy7OkT2YehT9LoHd4h6iruW/Iw9EkaHphkFu5b8jD0SZq2\nNrsrIKJYdIV+TU0Nxo0bh6ysLGRnZ2P16tUAgPPnz6OwsBAZGRkYP348GhsbTS2WnI29MSLn0xX6\n8fHxeOGFF3DkyBHs378fa9euxbFjx1BaWorCwkIcP34cBQUFKC0tNbtecjC9PX1+OBDZR1foJyYm\nIi8vDwDQq1cvDBs2DLW1tdiyZQvmzJkDAJgzZw42b95sXqXkeAx9Mgv3GXm6PKZfXV2NiooKjBkz\nBg0NDfD5fAAAn8+HhoYG6QWSe3BMn8j5uhT6Fy9exNSpU7Fq1Sr07t273XOapkHjBGxP27kz+u1v\nMzP1radnT3PrJPe4fFnfcrygTx7dh19zczOmTp2KWbNmYfLkyQBCvfv6+nokJiairq4OCQkJnf5u\nSUlJ+O/5+fnIz883VDTZ47HH5KznO9+Rsx5yP71zP/r3N7cOJwgGgwgGg6ZvRxMi9miZEAJz5szB\ngAED8MILL4Qf/8lPfoIBAwZg8eLFKC0tRWNjY4eTuZqmQccmyAWGDQP++c/Yy0V7u1NTgV27Qn8S\n1dcDeXmhPyNJSgIOHw79qRKzslNXT3/v3r144403MGLECAQCAQDA8uXLsWTJEvzoRz/C+vXrkZKS\ngrfeekt6gURE7DfKoyv07777brRFOEu3Y8cOqQWR9/EApqv07Auaxn1GJp4eIUvxXD/dKNY+wdCX\ni6FPuvHAIzsw9OXi5DkKO3cO+M1vgJaW0EF29WC7+uenn8rZDg9g9/jsM+B3vwtNmexsn/jOd4BH\nHzX3GxxDXy6GPoUNHGj+Nji84y5DhuhbZsKE7q1f75g+ycPhHSIy5OJFY7+vJ9TZ05eHoU9Ehpjd\nE+fwjlwMfbIcD2BvMfsWCQx9uRj6ZCmOz3qPkfeU8/Stx9AnIkOMfpBznr61GPpkOR7A3mLF8A7J\nw9BXyPjxwJdf2luD0QO4qip04zcy7r335ASq2aF88iTw+OPmbkMlnKevkO3bgbo6oE8fY+v5xS8i\nP/d//2ds3bEcOqTvTp8U28svy1mP2WP6ALB1a/e3Qe0x9BUjY2jl2WeNr6O7+J9pyOOUYROn1KEK\nHkKKccJ4upEaGBDy8ANUTXzbFWN36BsNbQaVPPwAVRMPIcXYHfpGMfSdx8g+5fb90Y14CCnGCQeZ\nkRoY+vLI6ukb3af4jcNaPIQUY3fom30hDxFFx9BXTLTQT06O/fvz58urpTvY05dH1geozydnPWQN\nTtlUTLTQv/NOYPJkYMYM6+rpKoa+PHpey7g44MoVoEePzp8PBICeBlLE7m+eKuIhpJhoB1lLi7ED\nWEYNsXB4R55Yr6UQQFtb7A8Hjum7C0NfMXaHPqdsOkes96K1NdTDj7YcA9t9eAhRWEtL5K/xTsHQ\nlydWYFv1zY+sxUNIMdF6+q2tHN6ha/SGPufpuwtDXzFtbZGfc8PwDkNfHj09/Vjf/Nxwl05qj1/e\nPOLNN4GHHoq93F13ATff3PlzTU3R76DpBDfdFPqzb9/Iy/TvH7odb6Qw0RsydvZC9+0LvVexXLgA\n9OrVvW3cdlvoz0ivpRBAv36x12PV6xTtPX/pJWDWLGvqcDuGvke8846+5U6fjtybj4sDeveWV5MZ\nbr4ZSE8H/va3yMvoCSqn27dP33JGQn/UKOCee4AtWyIvc/VDNhIreulXrgCXLkVf5pZbzK/DKxj6\nHqG3t9Wvn/0na432DL/5zei9Pi8MF7S2mr8NIWK/llbUEEt8vL01eg3H9D1Cb5DaHYh2b98trAh9\nQM77wXn67qIr9OfNmwefz4ecnJzwYyUlJfD7/QgEAggEAigvLzetSIot2gna67n9ANMbMG6fFWJV\nT98ot+9PKtIV+nPnzu0Q6pqmYeHChaioqEBFRQXuv/9+UwokfdzS0wfYM9RD74e4UU7o6ZO1dIX+\n2LFjceutt3Z4XPDddgyrQsIoKwLbCx8KVnxzc0JPnxFiPUNj+mvWrEFubi6Ki4vR2NgoqybqxO7d\noQMs0s+779pdIXXFxx9Hfz+ff96aOpzQ0/fCh7SbdHv2zoIFC/Czn/0MAPDcc89h0aJFWL9+fafL\nlpSUhP+en5+P/Pz87m5WWffea3cF8vAKTiA31+4KvPNaekUwGEQwGDR9O90O/YSEhPDfH374YRQV\nFUVc9vrQJ7VZdQUnA00fXiHtHDd2iJcuXWrKdro9vFNXVxf++6ZNm9rN7CEi55P1wchvbu6iq6c/\nc+ZMvP/++zh79iySk5OxdOlSBINBVFZWQtM0pKamYt26dWbXSqQrJFTqfdrdU+e9d9xHV+iXlZV1\neGzevHnSiyE18MSfPE7oZbO37i68IpcsZVVgqxJERqfqOqGnT9Zi6JOrqBLmehkJfSe8lk6oQTUM\nfbKc2cM7KvU+4+ON/T7n6auHd9n0GKf3nJxwgM+bB9xxB/Dww50//9vfhi6ecoJo72e/frFvfdzd\ndevlhPeTuoY9fXIVWR9qXgkrJ/Synd7RoPYY+uQ6Vlyc5YYgc8J9b5xQA3UNQ58sZ/eBHmv7XvkW\noIcT2uqEGlTC0CdLOeUum7GWsfuDyQqcp68mhj65ihUB46aep91j+m56rSiEs3ccQqWDx4qgirYN\nr/RMnTKe7oSrgkk/9vQ95MUX7a4gNqd8uNk9vLNoUexlFi82twbAGT19p+wTqmBP32VU7xlZccM1\nK0IoIQF4+mlg5UrztxWJ6vuSqtjTJ9exYlhDlUDkPH31MPTJclaEhJFpmVb09L0ynu6U8wqkH0Of\nLMWQuMYJw1BO6OlzTN9aDH1yHTf1xO1av1U1MLDdhydyLfLRR0BDAxAXF7odblxc6KDTNGcEgJXM\nbq/RmTlWBZnZ2zlzBti5E+jbt+N2hQDKy4FLl8ytgZyHoW+Bzz4DRo2yuwpncMrwjt1TNmWJVqfP\nZ38NZv4udQ+Hdyxw4YLdFXiL2Tdcc8vwkROGVpxyXoH0Y+iTcpzSu/RK2Dnl9SR9GPoW8MrBLYvZ\nwwG84Zp1uG+7D0PfAjwwrnHDcIBbhndkrscubq/fjRj6FmDoW88NN1xzwjx9GThP310Y+mQ5J4Su\n3cM7TngNZGBguw9DX4J580I7f6SfESPsrtA5nDJlMxqvzNO3wu7dQEFB9P0/MdHuKul6nKcvwauv\nyllP795Av36dPzdgALBnj5ztuF2ssJTRi3dLT9wNdTY0RH7ODfV7DUPfQU6csO6CGq9T4YZrXvim\nAHinHW7B4R0HUaXXwys4Qxh2ZAddoT9v3jz4fD7k5OSEHzt//jwKCwuRkZGB8ePHo7Gx0bQiVeGl\nQIvECVM2nTC8o8J7Tc6kK/Tnzp2L8vLydo+VlpaisLAQx48fR0FBAUpLS00pkKirjF6cxRO51uGH\nn/V0hf7YsWNx6623tntsy5YtmDNnDgBgzpw52Lx5s/zqFKPKAeCG4R23vBduqTMafvhZq9tj+g0N\nDfD976yjz+dDQ7RT9KSLFw7gWKwa3jFycRZP5JKXSZm9o2katCh7YElJSfjv+fn5yM/Pl7FZzxk4\n0O4K1OGEwHRCDWlpdldAVwWDQQSDQdO30+3Q9/l8qK+vR2JiIurq6pCQkBBx2etDX2Uq9OTNxuEd\n/R57DMjIAB5/3O5KIvPC6yzLjR3ipUuXmrKdbg/vTJo0CRs2bAAAbNiwAZMnT5ZWFHmb2fdqccP/\nnMUbrl3jhG88KtEV+jNnzsSdd96JTz/9FMnJyXj11VexZMkSbN++HRkZGdi1axeWLFlidq3kAVYd\n4EaD3Q23e3BCG8h9dA3vlJWVdfr4jh07pBZD5ARu6unHwl403YhX5JLl3DBl0wpmB7IbXis31Og1\nDH2ylBVTNnnDtWvc0NN3Q41ewtDXIdptY7nDOpPZN1yLtU9oGlBd3f369OC+R93Bu2xK9PvfR36O\nlybI4ZYeOAAcOQKkpER+3gvDO2fOAFu3As3NnT+/ciXwgx+YXwfpx9CXqLjY7grcwe7/Xs+q4Z3W\nVuPrMMrsD5ZBg4DZsyM/f/o08PXXkZ9304e4V3B4hyzllCEJK2641tYW+Tkr5uk7IVA1zRvnHbyE\noU+uoifIZISIjMCMFvqANf8xut2Bqif0yVoMfbKcFcM7TrjhmhU9fadj6DsPQ58sZXfP8yor6og1\npu+FE7mxxAp9J9SoGoY+gIce4pRMq3z4IXDXXdFf71OnIv++m264Fmt4xwp2778c03cehj6AN9+0\nuwK6XnJy9OfdcsM1K3q4Tu8pc3jHeRj65ElOuOGa3SdynRC2DH3nYeiTq7jh7pdXOeFErt1DJxzT\ndx6GPrmOFRdnyWB2Tz8WJwQqx/Sdh6FPSnLC8I4MTg9UDu84D0OfPMdo0MgKymhTNlW54RpD33mU\nD33ukO4i4/2y6t47HN5xx8lm1Xg+9FevBtLSIj/Pnc59zL4n/5/+BLz9duTn9Q7b+Hxdq8kMdn8b\nWLwYePHF6MvYXaNqPB/6O3cCJ09Gfl5v6L/2WmjZaD/kDbt3R3++rQ2Ii4u+L+TkALfdFnkdqtxw\nLdItl8k+ng/9WPQeGOyNOIMVN1yLi3FUtLUBPXrEXo/ZJ1ndcMO1WJzwwaQa5UPfCZfKU9eYfcO1\nWIF+tacfDceyyamUD30efGqKFsp6evqxlgHsn07pln3b6d9GvIahr/PAcMsB5HVWvA8yQt+qILP7\ng4XcR/nQ1zu8w9B3DrOvyJUxvBNrO1bM03fDPuuGGr1G+dDXu9PFx5tbB8lj9NJ/q3r6VvTC2dOn\nGzH0dYb+5Mnm1qGK556Lvcwzz0R+zgk3XGtrM/9kskr4wWQt5UO/rQ3o1Sv2HPxbbrG7Um94/vno\nr/NTTwEDBkRfh9nDO7F68UK4o6fPDxbqjPKhr+cAJutYda8WJ8zekcHtJ3L5wWS9nkZXkJKSgj59\n+qBHjx6Ij4/HwYMHZdRlGSGcf2CoRMbJSaPvp1vm6XO/pe4wHPqapiEYDKJ///4y6rGc3vFZso6M\n3quR8XTO07cWjz9rSRnYEA7eu/T0uDi84xxOGN6xoqdvFafUQc4hpad/3333oUePHnjkkUcwf/58\nGXXp1tIC1NVFfv7zz0N/nj7d+fPnz/PAcBInvBdXAz3SPlNX54x5+lZtQ4ZIr+UXX1hbB0kI/b17\n9yIpKQlffPEFCgsLkZmZibFjx7ZbpqSkJPz3/Px85OfnG91smN758yNHRn4uK0tOLSSH2UEWax2z\nZwOHD0ffZ3Jyoq/Ditk7TpghFMu0aaHbVEd7LSXGgasFg0EEg0HTt2M49JOSkgAAgwYNwpQpU3Dw\n4MGooW+XSD0NchYZ/6eq0XU88UToxyi39MLN9Mc/2l2Be9zYIV66dKkp2zE0mn3p0iVcuHABANDU\n1IRt27YhJ1YXiCgKu3umsjihF67KBwt1jaGefkNDA6ZMmQIAaGlpwUMPPYTx48dLKYzUZffwjiyc\np09OZCj0U1NTUVlZKasWIinDO3q3YyYnzNNnT586w8mK5CiyAt0NgccbrpEdGPrkOF45AeqmWkkd\nhmfvmI09FbWsWxe6duKnPzVvG1aE8cGDwB13RF8mNRVYuNDYdrzyAUnWYU+fHOX8eWu244TORFWV\nsd93wgwhch+GPpFHsadPnWHok+fEOpGrUhiyp083YuiTkhiGpCqGPpGL8RsNdRVDn5TjlTDkiVzq\nDoY+eY5VV/USuZESoT9woN0VEFnPK99oSC7HX5ylF3dw0stL+wq/0VBXKdHTJ7qRF8KQN1yj7mDo\nkycx8EK88OFGcjH0yXPYAyaKjKFPSvJKD5jz9KmrGPpELsV5+tQdts7e+eILICHB+Hqys42vg9Th\nlR7wv/4FZGREX+bmm4Hp062ph9zB1tA/elTfcmlpwDe+0flzqanAO+/Iq4nsdeYMUFQEfPllx+c0\nLfTzyivR1+GEi7P27gUWLACamzvWo2lA//7AX/5ibg0A8NprwIYN5m+H3MPW0Nfb4zpyBLjpJnNr\nIWcYNAjYv9/uKoy7807g73+3uwqijjimT0SkEFtD3ytjq+Qu3O9IZQx98iS7x/SJnIrDO+Q5DHSi\nyDQhzO1va5qGQEB06HlpGlBRoW8dly/zRC7pp2mhqcCDB4d6/DfOnqmsBN57Dxg/3r4aZdD74cZv\n1O6kaRrMiGdLZu/oDXciWc6cCf1E8v777g99ou5wxfAOv66TbF9/bXcFRPZwRegTEZEchkO/vLwc\nmZmZSE9Px4oVK2TURGQ6fnskVRkK/dbWVjz22GMoLy/H0aNHUVZWhmPHjsmqjYiIJDMU+gcPHsSQ\nIUOQkpKC+Ph4zJgxA3/+859l1RbG2QdERHIYCv3a2lokJyeH/+33+1FbW2u4qBu1tUlfJRGRkgyF\nvmbRwGgcTzcTdUuvXnZXQE5jaJ7+4MGDUVNTE/53TU0N/H5/J0uWXPf3/P/9XHPyZORt9O7NC7OI\nOtPUFLoWIdLwZ48ewHVfxMnhgsEggsGg6dsxdEVuS0sLhg4dip07d+Lb3/42Ro8ejbKyMgwbNuza\nBjQNQPRNcMyeZNLzBfTpp4GVK82vhai7HHlFbs+ePfHSSy9hwoQJaG1tRXFxcbvAJyIiZzF8G4aJ\nEydi4sSJMmohsgy/XZKqeIqUlMTQJ1Ux9ElJDH1SFUOflMRrP0hVtof+yJF2V0Bec889sZd59lnz\n6yByIkv+ExWTN0FE5DlmZaftPX0iIrIOQ5+ISCEMfSIihTD0iYgUwtAnIlIIQ5+ISCEMfSIihTD0\niYgUwtAnIlIIQ5+ISCEMfSIihTD0iYgUwtAnIlIIQ5+ISCEMfSIihTD0iYgUwtAnIlIIQ5+ISCEM\nfSIihTD0iYgUwtAnIlIIQ5+ISCEMfSIihXQ79EtKSuD3+xEIBBAIBFBeXi6zLiIiMkG3Q1/TNCxc\nuBAVFRWoqKjA/fffL7Mu1wgGg3aXYCovt8/LbQPYPuqcoeEdIYSsOlzL6zuel9vn5bYBbB91zlDo\nr1mzBrm5uSguLkZjY6OsmoiIyCRRQ7+wsBA5OTkdfrZs2YIFCxagqqoKlZWVSEpKwqJFi6yqmYiI\nukkTEsZoqqurUVRUhE8++aTjBjTN6OqJiJRkxhB6z+7+Yl1dHZKSkgAAmzZtQk5OTqfLcdyfiMg5\nut3Tnz17NiorK6FpGlJTU7Fu3Tr4fD7Z9RERkURShneIiMgdTLsit7y8HJmZmUhPT8eKFSvM2owU\n8+bNg8/nazdEdf78eRQWFiIjIwPjx49vNztp+fLlSE9PR2ZmJrZt2xZ+/NChQ8jJyUF6ejqeeOKJ\n8ONff/01pk+fjvT0dNx+++3497//bU3DANTU1GDcuHHIyspCdnY2Vq9e7an2Xb58GWPGjEFeXh6G\nDx+OZ555xlPtu6q1tRWBQABFRUUAvNW+lJQUjBgxAoFAAKNHjwbgrfY1NjZi2rRpGDZsGIYPH44D\nBw7Y2z5hgpaWFpGWliaqqqrElStXRG5urjh69KgZm5Ligw8+EIcPHxbZ2dnhx55++mmxYsUKIYQQ\npaWlYvHixUIIIY4cOSJyc3PFlStXRFVVlUhLSxNtbW1CCCFGjRolDhw4IIQQYuLEiWLr1q1CCCHW\nrl0rFixYIIQQYuPGjWL69OmWta2urk5UVFQIIYS4cOGCyMjIEEePHvVM+4QQoqmpSQghRHNzsxgz\nZozYs2ePp9onhBC//vWvxY9//GNRVFQkhPDO/imEECkpKeLcuXPtHvNS+2bPni3Wr18vhAjto42N\njba2z5TQ37dvn5gwYUL438uXLxfLly83Y1PSVFVVtQv9oUOHivr6eiFEKDiHDh0qhBBi2bJlorS0\nNLzchAkTxIcffihOnz4tMjMzw4+XlZWJRx55JLzM/v37hRChN33gwIGmtyeSBx98UGzfvt2T7Wtq\nahIjR44U//jHPzzVvpqaGlFQUCB27dolHnjgASGEt/bPlJQUcfbs2XaPeaV9jY2NIjU1tcPjdrbP\nlOGd2tpaJCcnh//t9/tRW1trxqZM09DQED4x7fP50NDQAAA4ffo0/H5/eLmrbbvx8cGDB4fbfP3r\n0bNnT/Tt2xfnz5+3qilh1dXVqKiowJgxYzzVvra2NuTl5cHn84WHsrzUvqeeegq/+tWvEBd37XD1\nUvs0TcN9992HkSNH4uWXXwbgnfZVVVVh0KBBmDt3Lr773e9i/vz5aGpqsrV9poS+1+bma5rm+jZd\nvHgRU6dOxapVq9C7d+92z7m9fXFxcaisrMSpU6fwwQcfYPfu3e2ed3P73n33XSQkJCAQCESc/uzm\n9gHA3r17UVFRga1bt2Lt2rXYs2dPu+fd3L6WlhYcPnwYjz76KA4fPoxvfetbKC0tbbeM1e0zJfQH\nDx6Mmpqa8L9ramrafUq5gc/nQ319PYDQNQkJCQkAOrbt1KlT8Pv9GDx4ME6dOtXh8au/8/nnnwMI\n7QT//e9/0b9/f6uagubmZkydOhWzZs3C5MmTAXirfVf17dsX3//+93Ho0CHPtG/fvn3YsmULUlNT\nMXPmTOzatQuzZs3yTPsAhK/3GTRoEKZMmYKDBw96pn1+vx9+vx+jRo0CAEybNg2HDx9GYmKibe0z\nJfRHjhyJEydOoLq6GleuXMEf/vAHTJo0yYxNmWbSpEnYsGEDAGDDhg3hsJw0aRI2btyIK1euoKqq\nCidOnMDo0aORmJiIPn364MCBAxBC4PXXX8eDDz7YYV1vv/02CgoKLGuHEALFxcUYPnw4nnzySc+1\n7+zZs+GZD1999RW2b9+OQCDgmfYtW7YMNTU1qKqqwsaNG3Hvvffi9ddf90z7Ll26hAsXLgAAmpqa\nsG3bNuTk5HimfYmJiUhOTsbx48cBADt27EBWVhaKiorsa1/3Tk/E9te//lVkZGSItLQ0sWzZMrM2\nI8WMGTNEUlKSiI+PF36/X7zyyivi3LlzoqCgQKSnp4vCwkLxn//8J7z8L3/5S5GWliaGDh0qysvL\nw49/9NFHIjs7W6SlpYnHH388/Pjly5fFD3/4QzFkyBAxZswYUVVVZVnb9uzZIzRNE7m5uSIvL0/k\n5eWJrVu3eqZ9H3/8sQgEAiI3N1fk5OSIlStXCiGEZ9p3vWAwGJ6945X2nTx5UuTm5orc3FyRlZUV\nzgqvtE8IISorK8XIkSPFiBEjxJQpU0RjY6Ot7ePFWURECuF/l0hEpBCGPhGRQhj6REQKYegTESmE\noU9EpBCGPhGRQhj6REQKYegTESnk/wEQouHRueKR6AAAAABJRU5ErkJggg==\n", + "text": [ + "" + ] + } + ], + "prompt_number": 77 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What happens when we add a filter" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Which fir filter to use\n", + "fir = rsid_si_fir_coeff" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 78 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Returns rsid-like signal as a list of modem output channels over time\n", + "def get_rsid_channel_series_filtered_frac(sr=16000):\n", + " inte = get_inte_signal(sr)\n", + " frac = get_frac_signal(sr)\n", + " filtered_frac = convolve(frac, fir, mode='valid')\n", + " return [x+y for x, y in zip(inte,filtered_frac)]" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 79 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "sr = 16000\n", + "\n", + "filtered_channel_data = get_rsid_channel_series_filtered_frac(sr)\n", + "plt.plot(filtered_channel_data)\n", + "\n", + "perfect = get_perfect_signal(sr)\n", + "plt.plot(perfect)\n", + "\n", + "inte = get_inte_signal(sr)\n", + "#plt.plot(inte)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nIP8f1IrBLH6K7ugAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 80 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 40 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file