Changes between Version 28 and Version 29 of Tutorials/k0SDR/Tutorial04a


Ignore:
Timestamp:
May 21, 2015, 4:52:00 PM (9 years ago)
Author:
nilanjan
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • Tutorials/k0SDR/Tutorial04a

    v28 v29  
    44
    55=== Description ===
    6 In this tutorial we'll use the USRPs on the grid for FFT-based spectrum sensing. Each USRP (centered on a frequency with specified bandwidth) will collect data into an OML server for post processing. For details on available USRP2s on the grid, please check  [https://www.orbit-lab.org/status/orbit/ inventory status].
     6This tutorial will give a walk through on how to used Wiserd to set up USRPs for signal transmission and reception.
    77
    88=== Hardware / Software Resources utilized ===
    99 1. Grid nodes with a USRP2 connect via Ethernet.
    10  2. ''ubuntu-12-04-uhd.ndz'': disk image loaded onto nodes. This image has all the precompiled - software required to configure the USRPs and analyze recorded data. The USRP2's interface with the node is already configured.
    11  3. spectrum: application on node to set up & collect data from USRP2 and send to OML server / local file for recording in database file.
    12  4. spectrum_console: application on console to configure & initiate spectrum sense application on node.
    13  5. Orbit's Arbitrary Waveform Injection System: used to inject noise or simple signal into RF environment. [https://www.orbit-lab.org/wiki/Software/eAM/mInterf#InterferenceAggregateManager More information of this generator can be found here.]
     10 2. ''ubuntu-14-04-64bit-sdr.ndz'': disk image loaded onto nodes.
     11 3. Wiserd - interface to configure and stream data to/from USRPs.
     12 4. octave - generate transmit data file and plot received data file.
     13
    1414
    1515=== Set up ===
     
    2828 * Image nodes
    2929{{{
    30 nilanjan@console.grid:~$ omf load -i ubuntu-12-04-uhd.ndz -t node3-3,node8-8,node13-13 -r 20
     30nilanjan@console.grid:~$ omf load -i ubuntu-14-04-64bit-sdr.ndz -t node20-20,node19-19,node8-8 -r 20
    3131}}}
    3232
    33  * After nodes are imaged, verify that nodes are in POWEROFF state. Otherwise issue the following to turn them off for a reboot
     33 * After nodes are imaged, verify that nodes are in POWEROFF state. Otherwise issue the following to turn them off for a
     34
     35reboot
    3436{{{
    3537nilanjan@console.grid:~$ omf tell -a offh -t system:topo:all
     
    3840 * Turn nodes back on and verify they are in POWERON state
    3941{{{
    40 nilanjan@console.grid:~$ omf tell -a on -t node3-3,node8-8,node13-13
     42nilanjan@console.grid:~$ omf tell -a on -t node20-20,node19-19,node8-8
    4143}}}
    4244
    43   * Before proceeding, download the [http://www.orbit-lab.org/attachment/wiki/Tutorials/k0SDR/Tutorial05/spectrum_console.cpp spectrum console application code] to your local directory. This is the application that will invoke the application to configure the USRP on the nodes.
     45In this example node8-8 and node19-19 is used as the transmitting nodes and the node20-20 as the receiver
    4446
    45  * Compile the application code.
     47=== Generate signal source file using octave ===
     48
     49On each transmiting node, create a signal file using octave. You can use the scripts provided here as an example. On node8-8 create a file ''s1.bin'' using the lines below
    4650{{{
    47 nilanjan@console.grid:~/UHD/SPECTRUM/w$ g++ spectrum_console.cpp -lboost_program_options-mt -loml2 -o spectrum_console
     51root@node8-8:~# cd wiserd
     52root@node8-8:~/wiserd# octave
     53octave:1> signal = fGenFDSignal(256,50,10,'1half');
     54octave:2> saveToWiserdFile(signal,'s1.bin');
     55octave:3> exit
    4856}}}
    4957
    50 === Spectrum sensing with multiple nodes at different frequencies ===
     58The signal will look something like the following in the frequency domain - notice the first half of the spectrum is populate:
     59  || [[Image(s1.png, width=500px)]] ||
    5160
    52  * To view the available parameters for the console application
     61Create a similar signal on node19-19 but with the 2nd half of the spectrum populated
    5362{{{
    54 nilanjan@console.grid:~/UHD/SPECTRUM/w$ ./spectrum_console --help
     63octave:1> signal = fGenFDSignal(256,50,10,'2half');
     64octave:2> saveToWiserdFile(signal,'s2.bin');
     65}}}
     66  || [[Image(s2.png, width=500px)]] ||
     67
     68
     69
     70=== Set up transmitting node ===
     71
     72
     73
     74 * ssh into each node and start the wiserd interface:
     75{{{
     76root@node8-8> wiserd
     77linux; GNU C++ version 4.8.2; Boost_105400; UHD_003.008.002-86-g566dbc2b
     78
     79-- Opening a USRP2/N-Series device...
     80-- Current recv frame size: 1472 bytes
     81-- Current send frame size: 1472 bytes
     82-- Detecting internal GPSDO.... No GPSDO found
     83-- Successfully tuned to 900.000000 MHz
     84--
     85-- Successfully tuned to 900.000000 MHz
     86--
     87Ready!
     88>
    5589}}}
    5690
    57  * The first run will demonstrate how to use the sensing application on multiple nodes centered at different frequencies. In this case we will not inject noise into the environment. Check the following page to view nodes corresponding to [http://www.orbit-lab.org/wiki/Documentation/USRP2_hw_map usrp n210].[[BR]]
    58  In this case we'll be sensing on node3-3, node8-8, node13-13 on the frequencies 5.0 GHz, 5.1 GHz, 5.2 GHz respectively.[[BR]]
    59  Sampling rate option (''--rate 8e6'') yields a bandwidth of 4MHz.[[BR]]
    60  The fft size (''--num-bins 1024'') corresponds to a 1024 point fft.[[BR]]
    61  The time option (''--time 5'') runs the application for 5 seconds.
    62  Since the ''--oml file'' option is used the collected data will be store on the node locally.[[BR]]
     91 * At the wiserd prompt set the carrier frequency, sampling rate & gain. Then link the transmitter to the signal source which
     92
     93is the binary file generated in octave from prior step:
    6394{{{
    64 nilanjan@console.grid:~/UHD/SPECTRUM/w$ ./spectrum_console --rate 8e6 --num-bins 1024 --time 5 --oml file --node node3-3,node8-8,node13-13 --freq 5.0e9,5.1e9,5.2e9
     95> set --uhd_tx_freq 700e6 --uhd_tx_rate 5e6 --uhd_tx_gain 20 --tran_wavefilename s1.bin
     96-- Successfully tuned to 700.000000 MHz
     97--
     98tran_wavefilename s2.bin
     99uhd_tx_freq 700000000
     100uhd_tx_gain 20
     101uhd_tx_rate 5000000
     102> add --signalfromfile
     103Consumer signalfromfile added
     104LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
     105>
    65106}}}
    66107
    67  * The recorded spectrum data is stored in a file under the root directory on each of the nodes. Copy that data file from the node to the console and check the contents. Each node will have its own file: /root/spectrum_nodex-y. [[BR]]
    68  The following will copy the data collect from node3-3 to the console.
     108The set command is used with multiple arguments in one line:
     109''--uhd_tx_freq'' set carrier frequenct to 700MHz
     110''--uhd_tx_rate'' set sampling rate to 5M samples/sec
     111''--uhd_tx_gain'' set transmit gain to 20dB.
     112''--tran_wavefilename''  tells the links the transmitter source to a binary filename.
     113
     114''add --signalfromfile'' opens the above filename, reads the samples and streams to the usrp.
     115
     116At this point the USRP will continuously transmit the signal util the delete command is issued:
     117''delete --signalfromfile'' stops tranmitting signal.
     118
     119
     120Now set up the transmitter on node19-19 using similar commands.
     121
     122
     123
     124=== Set up receiving node(s) ===
     125On the receiving node (node20-20), run wiserd to capture a snapshot of the signal from both transmitters.
    69126{{{
    70 nilanjan@console.grid:~/UHD/SPECTRUM/w$ scp root@node8-8:/root/spectrum_node8-8 .
     127root@node20-20> wiserd
     128linux; GNU C++ version 4.8.2; Boost_105400; UHD_003.008.002-86-g566dbc2b
     129
     130-- Opening a USRP2/N-Series device...
     131-- Current recv frame size: 1472 bytes
     132-- Current send frame size: 1472 bytes
     133-- Detecting internal GPSDO.... No GPSDO found
     134-- Successfully tuned to 900.000000 MHz
     135--
     136-- Successfully tuned to 900.000000 MHz
     137--
     138Ready!
     139> set --uhd_rx_freq 700e6 --uhd_rx_rate 5e6 --uhd_rx_gain 20 --recv_running_time 1000 --recv_output_filename rx_signal
     140-- Successfully tuned to 700.000000 MHz
     141--
     142recv_output_filename rx_signal
     143recv_running_time 1000
     144uhd_rx_freq 700000000
     145uhd_rx_gain 20
     146uhd_rx_rate 5000000
     147> add --timesamplestofile --timed
     148Consumer timesamplestofile added
     149Consumer timesamplestofile finished
     150
     151> exit
    71152}}}
    72153
    73  * The contents of the file is very long and is in a database format. The full contents of an example run can be view [http://www.orbit-lab.org/attachment/wiki/Documentation/GNURadio/Tutorials/FFTSpectrum/spectrum_measurement_node8-8 here].
    74154
    75  * Plot of the noise floor at 5.0GHz, 5.1GHZ and 5.2 GHz is shown below.
    76   || [[Image(noise_floor.png, width=500px)]] ||
     155Here the set command has an additional argument to limit capturing to 1000 milliseconds:
     156''--recv_output_filename'' set receiving signal filename.
     157''--recv_running_time''    set receiver run time in milliseconds. (optional)
    77158
    78 === Frequency detection with multiple nodes ===
     159The add command options
     160''--timesamplestofile'' streams data from receiver to file
     161''--timed''             runs receiver for the specified amount of time. (optional)
    79162
    80  * This will demonstrate using the waveform generator to create a signal at 5.002 GHz and using the USRPs to detect & record the signal. From the grid console enter the following to configure & run the waveform generator at 5.002 GHz with a -1 dBm power level.
     163Received signal file should should be prepended with the frequency, rate and gain:
    81164{{{
    82 nilanjan@console.grid:~/UHD/SPECTRUM/w$ wget -qO- http://instrument1.orbit-lab.org:5054/interference/initialize
    83 OK
    84 nilanjan@console.grid:~/UHD/SPECTRUM/w$ wget -qO- http://instrument1.orbit-lab.org:5054/interference/set?frequency=5.002\&power=-1
    85 OK
    86 nilanjan@console.grid:~/UHD/SPECTRUM/w$ wget -qO- http://instrument1.orbit-lab.org:5054/interference/start
    87 OK
     165root@node20-20> ls -ltr *.bin
     166-rw-r--r-- 1 root root 40003072 May 21 10:56 rx_signal_freq700000000_rate5000000_gain20.bin
    88167}}}
    89168
    90  * Now use the node3-3, node8-8 and nod13-13 to record data at frequency 5.0 GHz with a sampling rate of 8e6.
     169Use octave to view the spectrum image:
    91170{{{
    92 nilanjan@console.grid:~/UHD/SPECTRUM/w$ ./spectrum_console --rate 8e6 --num-bins 1024 --time 5 --oml file --node node3-3,node8-8,node13-13 --freq 5.0e9
     171octave:1> fReconFDSignal(readWiserdFile('rx_signal_freq700000000_rate5000000_gain20.bin', 256*500), 256);
    93172}}}
    94173
    95  * After the application as completed turn off the waveform generator.
    96 {{{
    97 nilanjan@console.grid:~/UHD/SPECTRUM/w$ wget -qO- http://instrument1.orbit-lab.org:5054/interference/stop
    98 OK
    99 }}}
    100 
    101  * As before each node will have it owns data file. At zip file with this data can be downloaded here.
    102 
    103  * The extracted data and plot of the signal detection is shown below.
    104   || [[Image(f5.002.png, width=500px)]] ||
    105 
    106 === Spectrum sensing code ===
    107 
    108  * The spectrum sensing code interfacing with the USRP is located in the node under the following directory: /root/uhd/host/examples/ - the two files of interest are CWriteOML_spectrum.h and spectrum.cpp. This version of the code uses an FFT to detect spectrum activity. This code can be modified/tweaked for testing other sensing schemes as well.
    109 
    110 === Logging spectrum data directly to an OML server ===
    111 
    112 * Spectrum data can also be logged directly to an OML server. In the above examples the data was recorded to a local file stored on the node itself. To log directly to an oml sever, run the ''spectrum_console'' application with the '''--oml''' option specified with an ip-address:port-number of the oml server. The following would record to the oml-server running on the grid console:
    113 {{{
    114 nilanjan@console.grid:~/UHD/SPECTRUM/w$ ./spectrum_console --rate 8e6 --num-bins 1024 --time 5 --oml oml:3003 --node node3-3,node8-8,node13-13 --freq 5.0e9
    115 }}}
    116 
    117  * The data is recorded in the database file /var/lib/oml/spectrum_measurement.sq3 on the grid console. The content of the file can be viewed using the following command:
    118 {{{
    119 nilanjan@console.grid:~/UHD/SPECTRUM/w$ sqlite3 /var/lib/oml2/spectrum_measurement.sq3 ".dump"
    120 }}}
    121 
    122  * When logging to an oml sever the magnitude value of the fft bins are stored in binary format. The first entry of the db file is shown below. So when dumping the file contents the ftt bins data is shown as consecutive ascii representation of the binary floating point numbers.
    123 {{{
    124 PRAGMA foreign_keys=OFF;
    125 BEGIN TRANSACTION;
    126 CREATE TABLE _senders (name TEXT PRIMARY KEY, id INTEGER UNIQUE);
    127 INSERT INTO "_senders" VALUES('nodeW\_',1);
    128 INSERT INTO "_senders" VALUES('nodeW^LE',2);
    129 INSERT INTO "_senders" VALUES('nodeWì{',3);
    130 CREATE TABLE _experiment_metadata (key TEXT PRIMARY KEY, value TEXT);
    131 INSERT INTO "_experiment_metadata" VALUES('start_time','1355941828');
    132 CREATE TABLE "spectrum_packet_info" (oml_sender_id INTEGER, oml_seq INTEGER, oml_ts_client REAL, oml_ts_server REAL, "sampling" INTEGER,
    133  "cfreq_MHz" REAL, "gain_dB" INTEGER, "FFTLength" INTEGER, "FFTNum" TEXT, "FFTBins" BLOB);
    134 INSERT INTO "spectrum_packet_info" VALUES(1,1,0.180260999826714,0.201296,16000000,5000000000.0,15,1024,'---',X'AB4F0E403E00A33B99BE813BBFFB263C5291023B1AB5373C6E78403C1E29E43B6D15333C0635323C28D0213C0529BF3BF3D51C3CCF13A23BDF10C43B4B15013C98007E3A1421903BDAFE003C28B54D3BD4390E3C0C6BF33B1AD60C3CD1D3503CF9ADBD3B3CE4453C4C608C3B6554B73B7ED8263B3DDEBF3B81E30E3C22203B3BA0511B3C2C85B43BB30B243C9F4D153C1B7FD33A7D26113C1960D53BE08CB23BD3F6503C227CC83B0F7D9A3B6043473C7101463CDDE1123CB096A63BFE82953B02867F3BB569103C4966FD3B5DE73E3C1CD4863B6C2ED73B1A14E13AB530983B315CC93BB2A6163BCC92B23B8F95653B1148043CB8A0D33A057E133C0C7D843B3A360F3C6B4D7C3BB2259A3AE4D26B3B03D4F83B2173C83B45E8BF3B3B5DA03B990FA33B4AB29B3B5B719C3A541B8B3B3E2B703C09378C3B36A3F53B310DFB3BB666803AD1E09D3BA202323C233B2E3CCD174A3B57398A3BEA6BB63BCE4B383BBA6CDF3B3836863C6F1A093C9BC7D63B9D7CA63B94ECCB3A5119193C6097A33BAEDAD83B26C50C3C6E7B723B7DA2973BDDF7033C5018203B3552A13B39BBFA3B2FAF153C9743073C19BD563CFD8F803C1A06093B5A4E8D3A28829C3BFB03593C5F77A93B0305423C9785963B13A0513CD9CD263B181DB83B4400C93B51FF043CF12CE13AD8E6BF3B68ED193B9FFBEA3B0B9B103BEF834F3ADA74BF3BEEB1963BDE87513C4968B73B1B5A483B63550D3C3218893B33F0E03B4EBE113C48A71D3C00F23F3C26930B3C6AECB43B7A56E33B7256353C0C90A43B02CCA23BC730603B1435C83B06418E3B9CCBC43A0E25223B876D093CD3280C3B70F2923B571B883BD49A2E3C7144943C9215433C1CDA393C769EC63B8254143BB18D8C3BEA4E9F3B62D10F3C6183073C5948B03BC64C123CA572173C94C1DD3AB32BC73B05DB973BF8BABC3B5184AC3B1A8C123CDE6FD33B5027423B18731B3C2447D73B9F44D03BB0DB163C7ACEDE3B8D85CE3B27A39C3B4F300B3C020DC73AF5ABA33B303B113BEF4E323B30AD3A3B4595D439955FB03B5087A23BD23A7B3BFC380A3BB8CA293BDC2E013C81EA3D3C4A3AD43999CF193CC283423B6B97283B9D3CFC3B7705203CB1DAB83BF32D7A3BA191193B3D970A3CE6CF6E3B2E58453BED5B2C3C4DB43F3BC81B953B64DC9D3BEB991B3C3E72B13B25D0463C2F06E43B9CEBEF3B0AB0273C195C043C55D0563BFD62723B3153CE3BBC20373CC592843BEA77433B65E4FA3BD21B8D3B6620733B9A2FA53B03A49F3B736CA53A05D5E43A9398533BA8E2163C7EA4983B098D153C65AB173B5556A53AC9211C3C0074DD3B318B003C4283F23BB0CF883BD6C5123BB9E23D3B9A6DFD3B073C043CC831203C50AD133B536A8F3BC9A2223C0049A33B9A09BE3AF970413BE9D4C13B61F6003B8698633B827A883B3AFA923BD87A8B3B6B5AE23A239EF33A32D1C23B7CC8633B2F294C3B39EF853B45AE5D3BF9D7A63B4ECDEC3A2A08023BAB46EE3BC04FE93BEC49C63B17F1983B0D045F3BDEBBDC3BA121C33B5FFCC73BE8752A3C3560D33B6D03A93BC7714D3BB03B9C3B60D9233CA8101F3CA54AAA3BD4888C3AA773713B1D17BD3A1A81913B6796DA3B8E15C33BF63EF13B19BA0C3CD260C43A553D113BE747893B2AB18B3BBA61373C127BEE3BD954893B1AA50C3BA5E4823BFC46213B3D511B3C0A61DF3A650B0D3C6022D63B5DEEA53B298BCD3BED4C223B08F3023C2BFF9D3B827A363C1FE6AF3B7B07243A4EE69E3AA4B74F3A60CB923BF541833BA43B093CDD7D593B0E7CBC3B2B00CD3B9056913B16462B3BED3A793B8F16643BE9EEE93B067CD93B86F07A3A8302073BEC6F973B6955C93B019B6F3B846A8A3B6510D33B9F8E5F3B3FFEAC3B50FE993BC36F853B64AFAE3A2867813B1919233C5D8D8A3BAE08E539D5C7003B44AABF3A2AA40F3A14EDD13B8AF59B3BD1712C3B6C16143C7E67F13B72A6CB3B82B3E83B7CAC903B4E910C3C7308913B7E251D3CCCD0C03A45F06A3BF1959B3B844A003B8B4EED3B172E7B3BCE2F893B4132F43B4DA7C13BB96EC83B275C1B3C3AA0453B24FFEC3AD89CB13B90556A3B61C8C43B1124D43B965E0F3CC607AD3B350A963B1188053B9A4D683C5C08563B8650143C6C868F3B70F8973B5EE1033CD091263CBE76DF3BACC2AE3B24AAE43BAA3B063C69F0853ADAEA423C60DC393AB8DC133B07DF153BD2DE0B3CCCB5313CD3263E3B9D98803BD1DC583BCDEAD83B252DB13BD6D9BF3BE9055B3BEBA1AD3BA3F9063C5C337B3B54C8C53B33AA9F3BD422483BB24C1F3C31D5D93B72B2A63B5120F23AC6949B3A14DB143C30617F3B835AA13BCE3CED3B2891E73B9A8AA73B90D2BB3B39F0D03A1C8B6E3B289BBA3B23FD033CDF1E9B3BDBF4AA3BFBBC813BBF91983B3ECD693A3EEA8C3B6C79CC3BCBAE1D3B8863BE3BD65A893BBAC8EB3B5C05243B0CB58C3BB3E4A03B2E147A3A7CBD513A8EBBE13AB784A63B6E1F0C3B2271F83B0BC3A73B2322D73BB2C9A53B8B52F03A4BBC173B5195473B6C1E423AF0A13A3BF705B83B55F7AD3AD775B83BC476E13B6291963B533ED53BDF66AF3A268E223B2EB2913B34957E3BEE10B03BD644E93AEA8FA53B27FBDD3A4F06A23B959F373B17E8943BB79A893B6631093B2BE5113BE87B813BBED2373B7BE0A73B9925103B26B9DF3ADB54103B98AAA33BFFFF2A3B3FB8C73BD92F213B673D593BF85DAC3AC6F0973B9187623BB0C5603B4128993AE94E4D3B5C2AD13B4586433B79947E3BBF26EB3B7132053BA068403A7CE8933BEC69113B44FEF73A537FD83A74A46A3AA169CF3AFFD0523B67FBC73B6E60B23B20BE6D3B4A954D3B17942C3B2FAFA63BADC0623B8DA4043B6C3DDC3B5DA0A23A52D7693B18BB143B64E21C3BA4F29F3BC7C2E53AC4F5D93B2317083B654A293B386DA93BA4252F3BDE484D3B636E263BB8358B3BE53D933B8C99463BC591A03B70E20B3BBC85053B66A57D3B8015A039572E133BF060963B3B7B163C49A8933AB279FD3B57068A3BB695783BC9F89D3B22ED943B9D9BCA3BED77163C1216CB3BDE61D63B8493453BCBE2AB3BFAE6D23BA501143B8BA3B63B4F55BD3BF5F7E53BE911A33B1611443BB69B253B4E1D4E3BC303033C668A803BF4884D3C876CA33BA0A1963A0771AB3BCA77FA3A2217933AB831273B4D19D73B1A946C3BF851923B66FE893B42CE903BD512FA3B3F5ACB3B44D8903B5599013C653E853AA4140D3BB913693BA167E13B55B0563B4ED9013C11CF963B65F9923B9916D23ACD26983BA166863BBDBE0C3CE2263C3B2097773B4210843B7994D83BD90C373B439724399768F83BF5FE8A3B450BAE3B758B463B93980C3B55D3343B70B9E93A251A853B27D0F43BDBD2A63B7F7B1F3CF12E353C4B00293C4ECEC73B99D24A3BB8CEA93B654E943B3EE95F3BA2A0373B2FC5CA3BB8A0C43A7FCF233BB44F2C3B4702803B3D4B3D3BF5F5093B9BA9EE3B0E48403B28A5BF3B27DFE73B607CC53A3422D83B40B1043C15ED9D3BBB91A43B602F363B02E8EF3AA2BCC43B012AAD3BA732493C144A143C58D6583C06D5133C41FE5F3B08A3F83AC8089B3BA453803B5BD9153C087DB43A4835043CDF6A0A3CBB3CB13B1FFF513B5552903B27B52E3CAB7C0E3C8232953B288CA63B2C6F843B779DFD3B29F0EB3BA340F83B364F6A3B9F90863B2D732A3B4589C83B4874AA3B3597DB3B8159E53AF65CB93B99F0F33BFC6E2E3B9E40543B43F5193C5AC9DD3A4443423BDA678C3ABD38043CB0B1323C4CEA0F3C41FB5F3B149E793B66B39F3B88DAE83B1344273BCDC2033C9697C13B15740D3CD6F9823B776FBE3B8833D83BA44ED73BEA990B3B8629D53A444AB33B72A82D3BE7201C3C8F7CBD3B763E313C6C616E3B52B5A23B477A563B7AA6C03B371A103CCB22F33B177FD23BAFB5833B79B4563CD697CE3B8A4C563CDBEEBB3BB2DEA93BFD98CD3B03BD773BEAEA923BB979E73B562FC73B8F08043CF146C23BE18DAD3BA5EBBC3A9A46D33B1C67B73B6156DD3B19F9D93A685C213C868A573C7144823B11678B3B0CC50A3C54B9C63B164EC43BB9F0E23BFE83693B8580073C9BB8DC3BBE74593BA80C713B3CD3EB3BD87C983B895D903BD9B18D3BD462D33BE8EEE73B9691403B576BE83B5B4AC63A97B0003B8186283C200CB33B26BCC23BAD419D3BC645DE3B6280CE3B8C2CF63A4186233BF4B7983B4A03E83B1F1FD33BCD5FB93BAD3D923BCE3F353C92B90B3C147C1C3C64042E3C5582E03BB569493BC363AC3BA995753BE679343C05E6ED3B15DF723BBED6EF3B86E99D3B7629EB3B0CEEB83B5976FA3B37E9313B45D4103B0C0EF33B3F20643C40F3103C6EA5223B333E503B9471E83BEF35053C9C3D1D3CC7A72C3C571CFD3B19AF353B58BEE63BE853353CFC8EA73B62F7763ACF90353CA3BFCB3B321F963B033E813CB4D7873B20990C3CBB5AC93BE18DEF3B4BBE633B27F8DA3AFD7BF93AB171523CF823153C4A74CB3B72DF273CBC93B63B49C8EC3B8A90C13B855D2C3B84E91D3C87D6E639326A543B919E2D3C9297523A07F8483C80FDC63B0319E73B2511353CA59B013B1FFCF33A726B323C29DF5E3A954B9B3BC0230C3C31A7AE3BC9C8013C1074003C9D51463C2D4A933B3AEC5E3C1EBBAE3BF81F813BA9B91D3C4C582D3C411B1D3CD082E23B8566AB3B23DC053C1921CC3B5031C23B263F873C6D73123C1BDA003C4362D83B8DCC403CEF6A0C3C8EC0D23BD937CE3B7558FD3BDC13B93B42F9953B598A163C7265493C6E67083C9913AE3B9C2C533C15349B3B8454993B1A69683BE7351D3BEB3C0E3CF1F1183C52EF363CA454163BA36DF63A3E56743B48577C3BBD7AFB3B52AF923BA4AA133BB80C5C3BF03CB13B962F573CC7D31A3B6C1D783C4BDA403C22DDCE3BD3B0983B1677713B59170C3B143E0C3B269EE33BFEC29A3B63D6D73AC50F5D3A2E960C3B50F3A43B3452083CCB32A33B422EC73B6BD1453C357A413B05F0F33B5BECC03BC28CCD3AA2C9D73BC8AF1B3B9DF7C13B34A3333C73B4963B25950E3CAC6F0B3C92E1223C8FD3C83B76B5113C06C2013CBE241C3C5A2D263B8DBE9B3B14131E3C2C80073A944BB13BC262A63B6E4E013CACEF053CA4B9F13B9D5D7C3C8174FA3BBFFA4D3C9AB7673B243FAB3BAC9CA43B7E604B3CD50B893BB29F453C06578D3B019EE13AB624B33B5EFF013C2639203CE002D13B03238C3B8AB8713BB492A23BC2EE4E3C3D36DA3B81B7953B10C5403C42AAB33B15B8763B0B929E3BEE35093CD495B83B810FC33BF2AA5E3B352FF63B5F93823B76DABC3B7A505B3C83A5953BF4FAAF3B7D8A1D3B93CA933B4D7ADD3B4B75EE3BCEFC603BE50AC73ACCE8463BB88C3A3CDB05EB3A58AA403CA6076C3CEC2F013C16182D3CB528113CB53B193B4F90F33B04EE163C3CC5733B7C36A13BF5086D3B18BD253C8794AE3CEECC883CE8476B3CFECFB93B5FB4E53B8EDA923B59FF3A3CA2E4DD3B94FD893B80C1053C31B81C3CF3F7C63B564A1C3C5FABBE3B25E3043CC21CDE3BADA8103B85682A3BF464853B35409A3B79092B3C9505CC3BF8C6583C5336273CC357363BEC7FFD3B2101313C5E8D223CBC42023BD45EF23B13E12D3C7AD7B03B12A0AC3A8E15543C3D7D493C16815B3BE1C4323CE57B343C5841E43AD894563CCF69B03BC8C1863BD20B253C54640E3CF126F23A8D4A1F3C7D9E163C3D93C63BD05F883B45EA183C741DF13BFE3FE93B49896E3C2AEFC83B');
    135 }}}
     174Received signal should look simiar to
     175  || [[Image(rx_signal.png, width=500px)]] ||