├── Frames.ipynb ├── LICENSE ├── README.md ├── frames.u8 ├── handson_01_spectrum.grc ├── handson_02_pll.grc ├── handson_03_downconversion.grc ├── handson_04_bpsk_carrier.grc ├── handson_05_symbol_rate.grc ├── handson_06_clock_carrier_recovery.grc ├── handson_07_syncword.grc ├── handson_08_framesize.grc ├── handson_09_turbo_decode.grc ├── recordings └── README.md └── slides ├── slides.pdf └── src ├── 10gemedish1.jpg ├── BepiColombo_Auto6F.jpeg ├── Slides graphs.ipynb ├── baseband.png ├── codewords.png ├── grcon20.png ├── hilbert.png ├── iq.png ├── manchester.png ├── manchester_after_hilb.png ├── manchester_before_hilb.png ├── manchester_fir.png ├── manchester_hilb.png ├── manchester_wave.png ├── post_matched.png ├── pre_matched.png ├── slides.tex ├── solar_orbiterTHUMB.jpg ├── subcarrier.png ├── syncwords.png └── tmheader.png /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public 379 | licenses. Notwithstanding, Creative Commons may elect to apply one of 380 | its public licenses to material it publishes and in those instances 381 | will be considered the “Licensor.” The text of the Creative Commons 382 | public licenses is dedicated to the public domain under the CC0 Public 383 | Domain Dedication. Except for the limited purpose of indicating that 384 | material is shared under a Creative Commons public license or as 385 | otherwise permitted by the Creative Commons policies published at 386 | creativecommons.org/policies, Creative Commons does not authorize the 387 | use of the trademark "Creative Commons" or any other trademark or logo 388 | of Creative Commons without its prior written consent including, 389 | without limitation, in connection with any unauthorized modifications 390 | to any of its public licenses or any other arrangements, 391 | understandings, or agreements concerning use of licensed material. For 392 | the avoidance of doubt, this paragraph does not form part of the 393 | public licenses. 394 | 395 | Creative Commons may be contacted at creativecommons.org. 396 | 397 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GRCon20 workshop: Decoding interplanetary spacecraft 2 | 3 | This repository contains material for the workshop "Decoding interplanetary 4 | spacecraft" by Daniel Estévez at [GRCon20](https://www.gnuradio.org/grcon/grcon20/) 5 | on 14 September 2020. The recording of the workshop session can be found 6 | in this [Youtube video](https://www.youtube.com/watch?v=RDbs6l4rMhs). 7 | 8 | The material 9 | supplied here was provided to attendees of the workshop to follow 10 | along using their own computers, and for reference after the workshop. 11 | 12 | The workshop is centred around building GNU Radio flowgraphs to analyze and 13 | demodulate deep-space probes IQ recordings. 14 | 15 | This repository contains a number of GNU Radio companion `.grc` files called 16 | `handson_*.grc` that show the progress at different steps during the hands-on 17 | part of the workshop with GNU Radio companion. 18 | 19 | It also contains the PDF slides for the workshop in the folder `slides/`. 20 | 21 | ## GNU Radio Virtual Machine 22 | 23 | Users of the [UbuntuVM](https://wiki.gnuradio.org/index.php/UbuntuVM) virtual 24 | machine that includes GNU Radio can install the required software for the 25 | workshop by following [the instructions 26 | here](https://github.com/daniestevez/grcon2020-workshop/issues/1). Note you also 27 | need to download the IQ recordings as indicated below. 28 | 29 | ## Requirements 30 | 31 | The workshop was originally done with GNU Radio 3.8 and needed the following. 32 | 33 | * [GNU Radio 3.8](https://www.gnuradio.org/) 34 | * [gr-satellites](https://github.com/daniestevez/gr-satellites) (any version 35 | since v3.0.0 is fine for GNU Radio 3.8) 36 | * [gr-dslwp](https://github.com/daniestevez/gr-dslwp/tree/maint38), branch 37 | `maint38` 38 | 39 | The flowgraphs that were used in the workshop can now be found in the 40 | `maint-3.8` branch. The flowgraphs have now been updated to GNU Radio 3.10 in 41 | the `master` branch. GNU Radio 3.9 should probably work without problems with 42 | the `maint-3.8` flowgraphs. A version of gr-satellites and gr-dslwp that matches 43 | the version of GNU Radio should be used. 44 | 45 | There is also a very brief part of the workshop that uses a Jupyter 46 | notebook. This needs: 47 | 48 | * [Jupyter](https://jupyter.org/) 49 | * [NumPy](https://numpy.org/) 50 | * [Matplotlib](https://matplotlib.org/) 51 | * [construct](https://construct.readthedocs.io/) 52 | 53 | If someone faces problems installing any of the above, I'm welcome to help in 54 | the issues of this repository. Also, note the following: 55 | 56 | gr-satellites will only be used for the AGC, so instead of 57 | installing gr-satellites, it is also possible to download and generate the 58 | [AGC hierarchical 59 | flowgraph](https://github.com/daniestevez/gr-satellites/blob/master/python/hier/rms_agc.grc). 60 | 61 | gr-dslwp will only be used for Turbo decoding in the last part of the 62 | workshop. Most of the workshop can be followed without gr-dslwp. 63 | 64 | It is possible to test that GNU Radio and the OOT modules are working correctly 65 | by using the `handson_09_turbo_decode.grc` flowgraph. Jupyter and related python 66 | packages can be tested with the `Frames.ipynb` notebook. 67 | 68 | ## Recordings 69 | 70 | The IQ recordings that will be used in this workshop can be downloaded 71 | [here](http://eala.destevez.net/~daniel/grcon2020-workshop/). They should be 72 | placed in the `recordings/` folder inside this repository. These files total to nearly 73 | 1GB, so attendees are recommended to download these before the workshop. 74 | 75 | ## GNU Radio Logging 76 | 77 | If you have a freshly installed GNU Radio or are using a Virtual Machine with 78 | GNU Radio, then the default logging configuration will produce many debug 79 | messages with some of the flowgraphs. These messages can make 80 | `gnuradio-companion` run very slowly. It is recommended that you edit (or 81 | create) `~/.gnuradio/config.conf` and enter into this file: 82 | 83 | ``` 84 | [log] 85 | log_level = info 86 | ``` 87 | 88 | to reduce the number of debug messages. 89 | 90 | ## Licensing 91 | 92 | This material is released under the [CC BY 4.0 93 | license](https://creativecommons.org/licenses/by/4.0/). 94 | 95 | ## More recordings 96 | 97 | Here is a list of recordings similar used to those used in the workshop. It can 98 | serve as a basis for people interested in studying these topics further. 99 | 100 | * [Recordings of Tianwen-1](http://gs1.to.ee/public_to117/Obs/Viljo/dsn/tianwen/) 101 | made by Viljo Allik ES5PC with the 4.5m dish at Tartu University 102 | (Estonia). 103 | See [this](https://destevez.net/2020/07/tianwen-1-telemetry-modulation-and-coding/) 104 | and related blogposts. 105 | 106 | * [Short recording of Tianwen-1](https://drive.google.com/file/d/1jcH1S0vUzzEplE5SU5VIxp2HClwHUDf8/view) 107 | made by Wei Mingchuan BG2BHC with the 5.4m dish at Harbin Institute of Technology (China). 108 | The format is `complex64` (i.e., `float32` IQ) at 3Msps. 109 | Source: [this tweet](https://twitter.com/bg2bhc/status/1290650921349914624) 110 | 111 | * [Emirates Mars Mission (Hope)](http://eala.destevez.net/~daniel/20200719_232945_99998.raw), 112 | recorded by Paul Marsh M0EYT. The format is `int16` IQ at 99998sps. See the 113 | [blog post](https://destevez.net/2020/07/decoding-emirates-mars-mission-hope/) 114 | for more information. 115 | 116 | -------------------------------------------------------------------------------- /frames.u8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/frames.u8 -------------------------------------------------------------------------------- /handson_01_spectrum.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_01_spectrum 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: visualizing the spectrum' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: samp_rate 37 | id: variable 38 | parameters: 39 | comment: '' 40 | value: '2016129' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [264, 12.0] 46 | rotation: 0 47 | state: enabled 48 | - name: blocks_float_to_complex_0 49 | id: blocks_float_to_complex 50 | parameters: 51 | affinity: '' 52 | alias: '' 53 | comment: '' 54 | maxoutbuf: '0' 55 | minoutbuf: '0' 56 | vlen: '1' 57 | states: 58 | bus_sink: false 59 | bus_source: false 60 | bus_structure: null 61 | coordinate: [416, 196.0] 62 | rotation: 0 63 | state: true 64 | - name: blocks_throttle_0 65 | id: blocks_throttle 66 | parameters: 67 | affinity: '' 68 | alias: '' 69 | comment: '' 70 | ignoretag: 'True' 71 | maxoutbuf: '0' 72 | minoutbuf: '0' 73 | samples_per_second: samp_rate 74 | type: complex 75 | vlen: '1' 76 | states: 77 | bus_sink: false 78 | bus_source: false 79 | bus_structure: null 80 | coordinate: [800, 188.0] 81 | rotation: 0 82 | state: true 83 | - name: blocks_wavfile_source_0 84 | id: blocks_wavfile_source 85 | parameters: 86 | affinity: '' 87 | alias: '' 88 | comment: '' 89 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 90 | maxoutbuf: '0' 91 | minoutbuf: '0' 92 | nchan: '2' 93 | repeat: 'True' 94 | states: 95 | bus_sink: false 96 | bus_source: false 97 | bus_structure: null 98 | coordinate: [24, 176.0] 99 | rotation: 0 100 | state: true 101 | - name: qtgui_freq_sink_x_0 102 | id: qtgui_freq_sink_x 103 | parameters: 104 | affinity: '' 105 | alias: '' 106 | alpha1: '1.0' 107 | alpha10: '1.0' 108 | alpha2: '1.0' 109 | alpha3: '1.0' 110 | alpha4: '1.0' 111 | alpha5: '1.0' 112 | alpha6: '1.0' 113 | alpha7: '1.0' 114 | alpha8: '1.0' 115 | alpha9: '1.0' 116 | autoscale: 'False' 117 | average: '0.1' 118 | axislabels: 'True' 119 | bw: samp_rate 120 | color1: '"blue"' 121 | color10: '"dark blue"' 122 | color2: '"red"' 123 | color3: '"green"' 124 | color4: '"black"' 125 | color5: '"cyan"' 126 | color6: '"magenta"' 127 | color7: '"yellow"' 128 | color8: '"dark red"' 129 | color9: '"dark green"' 130 | comment: '' 131 | ctrlpanel: 'False' 132 | fc: '0' 133 | fftsize: '4096' 134 | freqhalf: 'True' 135 | grid: 'True' 136 | gui_hint: '' 137 | label: Relative Gain 138 | label1: '' 139 | label10: '''''' 140 | label2: '''''' 141 | label3: '''''' 142 | label4: '''''' 143 | label5: '''''' 144 | label6: '''''' 145 | label7: '''''' 146 | label8: '''''' 147 | label9: '''''' 148 | legend: 'True' 149 | maxoutbuf: '0' 150 | minoutbuf: '0' 151 | name: '""' 152 | nconnections: '1' 153 | norm_window: 'False' 154 | showports: 'False' 155 | tr_chan: '0' 156 | tr_level: '0.0' 157 | tr_mode: qtgui.TRIG_MODE_FREE 158 | tr_tag: '""' 159 | type: complex 160 | units: dB 161 | update_time: '0.10' 162 | width1: '1' 163 | width10: '1' 164 | width2: '1' 165 | width3: '1' 166 | width4: '1' 167 | width5: '1' 168 | width6: '1' 169 | width7: '1' 170 | width8: '1' 171 | width9: '1' 172 | wintype: window.WIN_BLACKMAN_hARRIS 173 | ymax: '-65' 174 | ymin: '-110' 175 | states: 176 | bus_sink: false 177 | bus_source: false 178 | bus_structure: null 179 | coordinate: [1152, 164.0] 180 | rotation: 0 181 | state: true 182 | 183 | connections: 184 | - [blocks_float_to_complex_0, '0', blocks_throttle_0, '0'] 185 | - [blocks_throttle_0, '0', qtgui_freq_sink_x_0, '0'] 186 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 187 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 188 | 189 | metadata: 190 | file_format: 1 191 | grc_version: v3.10.1.1-58-g637fcda4 192 | -------------------------------------------------------------------------------- /handson_02_pll.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_02_pll 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: carrier phase locking with a PLL' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: pll_bw 37 | id: variable 38 | parameters: 39 | comment: '' 40 | value: '100' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [352, 12.0] 46 | rotation: 0 47 | state: true 48 | - name: pll_limit 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: 10e3 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [352, 84.0] 58 | rotation: 0 59 | state: true 60 | - name: samp_rate 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: '2016129' 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [192, 12.0] 70 | rotation: 0 71 | state: enabled 72 | - name: analog_pll_carriertracking_cc_0 73 | id: analog_pll_carriertracking_cc 74 | parameters: 75 | affinity: '' 76 | alias: '' 77 | comment: '' 78 | max_freq: 2 * pi * pll_limit / samp_rate 79 | maxoutbuf: '0' 80 | min_freq: -2 * pi * pll_limit / samp_rate 81 | minoutbuf: '0' 82 | w: 2 * pi * pll_bw / samp_rate 83 | states: 84 | bus_sink: false 85 | bus_source: false 86 | bus_structure: null 87 | coordinate: [1176, 4.0] 88 | rotation: 0 89 | state: enabled 90 | - name: blocks_complex_to_float_0 91 | id: blocks_complex_to_float 92 | parameters: 93 | affinity: '' 94 | alias: '' 95 | comment: '' 96 | maxoutbuf: '0' 97 | minoutbuf: '0' 98 | vlen: '1' 99 | states: 100 | bus_sink: false 101 | bus_source: false 102 | bus_structure: null 103 | coordinate: [1752, 76.0] 104 | rotation: 0 105 | state: enabled 106 | - name: blocks_float_to_complex_0 107 | id: blocks_float_to_complex 108 | parameters: 109 | affinity: '' 110 | alias: '' 111 | comment: '' 112 | maxoutbuf: '0' 113 | minoutbuf: '0' 114 | vlen: '1' 115 | states: 116 | bus_sink: false 117 | bus_source: false 118 | bus_structure: null 119 | coordinate: [384, 196.0] 120 | rotation: 0 121 | state: true 122 | - name: blocks_throttle_0 123 | id: blocks_throttle 124 | parameters: 125 | affinity: '' 126 | alias: '' 127 | comment: '' 128 | ignoretag: 'True' 129 | maxoutbuf: '0' 130 | minoutbuf: '0' 131 | samples_per_second: samp_rate 132 | type: complex 133 | vlen: '1' 134 | states: 135 | bus_sink: false 136 | bus_source: false 137 | bus_structure: null 138 | coordinate: [728, 188.0] 139 | rotation: 0 140 | state: true 141 | - name: blocks_wavfile_source_0 142 | id: blocks_wavfile_source 143 | parameters: 144 | affinity: '' 145 | alias: '' 146 | comment: '' 147 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 148 | maxoutbuf: '0' 149 | minoutbuf: '0' 150 | nchan: '2' 151 | repeat: 'True' 152 | states: 153 | bus_sink: false 154 | bus_source: false 155 | bus_structure: null 156 | coordinate: [24, 176.0] 157 | rotation: 0 158 | state: true 159 | - name: import_0 160 | id: import 161 | parameters: 162 | alias: '' 163 | comment: '' 164 | imports: from math import pi 165 | states: 166 | bus_sink: false 167 | bus_source: false 168 | bus_structure: null 169 | coordinate: [192, 84.0] 170 | rotation: 0 171 | state: true 172 | - name: qtgui_freq_sink_x_0 173 | id: qtgui_freq_sink_x 174 | parameters: 175 | affinity: '' 176 | alias: '' 177 | alpha1: '1.0' 178 | alpha10: '1.0' 179 | alpha2: '1.0' 180 | alpha3: '1.0' 181 | alpha4: '1.0' 182 | alpha5: '1.0' 183 | alpha6: '1.0' 184 | alpha7: '1.0' 185 | alpha8: '1.0' 186 | alpha9: '1.0' 187 | autoscale: 'False' 188 | average: '0.2' 189 | axislabels: 'True' 190 | bw: samp_rate 191 | color1: '"blue"' 192 | color10: '"dark blue"' 193 | color2: '"red"' 194 | color3: '"green"' 195 | color4: '"black"' 196 | color5: '"cyan"' 197 | color6: '"magenta"' 198 | color7: '"yellow"' 199 | color8: '"dark red"' 200 | color9: '"dark green"' 201 | comment: '' 202 | ctrlpanel: 'False' 203 | fc: '0' 204 | fftsize: '4096' 205 | freqhalf: 'True' 206 | grid: 'False' 207 | gui_hint: '' 208 | label: Relative Gain 209 | label1: PLL input 210 | label10: '''''' 211 | label2: PLL output 212 | label3: '''''' 213 | label4: '''''' 214 | label5: '''''' 215 | label6: '''''' 216 | label7: '''''' 217 | label8: '''''' 218 | label9: '''''' 219 | legend: 'True' 220 | maxoutbuf: '0' 221 | minoutbuf: '0' 222 | name: '""' 223 | nconnections: '2' 224 | norm_window: 'False' 225 | showports: 'False' 226 | tr_chan: '0' 227 | tr_level: '0.0' 228 | tr_mode: qtgui.TRIG_MODE_FREE 229 | tr_tag: '""' 230 | type: complex 231 | units: dB 232 | update_time: '0.10' 233 | width1: '1' 234 | width10: '1' 235 | width2: '1' 236 | width3: '1' 237 | width4: '1' 238 | width5: '1' 239 | width6: '1' 240 | width7: '1' 241 | width8: '1' 242 | width9: '1' 243 | wintype: window.WIN_BLACKMAN_hARRIS 244 | ymax: '-15' 245 | ymin: '-60' 246 | states: 247 | bus_sink: false 248 | bus_source: false 249 | bus_structure: null 250 | coordinate: [1440, 164.0] 251 | rotation: 0 252 | state: true 253 | - name: qtgui_freq_sink_x_0_0 254 | id: qtgui_freq_sink_x 255 | parameters: 256 | affinity: '' 257 | alias: '' 258 | alpha1: '1.0' 259 | alpha10: '1.0' 260 | alpha2: '1.0' 261 | alpha3: '1.0' 262 | alpha4: '1.0' 263 | alpha5: '1.0' 264 | alpha6: '1.0' 265 | alpha7: '1.0' 266 | alpha8: '1.0' 267 | alpha9: '1.0' 268 | autoscale: 'False' 269 | average: '0.2' 270 | axislabels: 'True' 271 | bw: samp_rate 272 | color1: '"blue"' 273 | color10: '"dark blue"' 274 | color2: '"red"' 275 | color3: '"green"' 276 | color4: '"black"' 277 | color5: '"cyan"' 278 | color6: '"magenta"' 279 | color7: '"yellow"' 280 | color8: '"dark red"' 281 | color9: '"dark green"' 282 | comment: '' 283 | ctrlpanel: 'False' 284 | fc: '0' 285 | fftsize: '4096' 286 | freqhalf: 'True' 287 | grid: 'False' 288 | gui_hint: '' 289 | label: Relative Gain 290 | label1: I 291 | label10: '''''' 292 | label2: Q 293 | label3: '''''' 294 | label4: '''''' 295 | label5: '''''' 296 | label6: '''''' 297 | label7: '''''' 298 | label8: '''''' 299 | label9: '''''' 300 | legend: 'True' 301 | maxoutbuf: '0' 302 | minoutbuf: '0' 303 | name: '""' 304 | nconnections: '2' 305 | norm_window: 'False' 306 | showports: 'False' 307 | tr_chan: '0' 308 | tr_level: '0.0' 309 | tr_mode: qtgui.TRIG_MODE_FREE 310 | tr_tag: '""' 311 | type: float 312 | units: dB 313 | update_time: '0.10' 314 | width1: '1' 315 | width10: '1' 316 | width2: '1' 317 | width3: '1' 318 | width4: '1' 319 | width5: '1' 320 | width6: '1' 321 | width7: '1' 322 | width8: '1' 323 | width9: '1' 324 | wintype: window.WIN_BLACKMAN_hARRIS 325 | ymax: '-15' 326 | ymin: '-60' 327 | states: 328 | bus_sink: false 329 | bus_source: false 330 | bus_structure: null 331 | coordinate: [1904, 212.0] 332 | rotation: 0 333 | state: enabled 334 | - name: satellites_rms_agc_0 335 | id: satellites_rms_agc 336 | parameters: 337 | affinity: '' 338 | alias: '' 339 | alpha: 1e-4 340 | comment: '' 341 | maxoutbuf: '0' 342 | minoutbuf: '0' 343 | reference: '1.0' 344 | states: 345 | bus_sink: false 346 | bus_source: false 347 | bus_structure: null 348 | coordinate: [1032, 176.0] 349 | rotation: 0 350 | state: enabled 351 | 352 | connections: 353 | - [analog_pll_carriertracking_cc_0, '0', blocks_complex_to_float_0, '0'] 354 | - [analog_pll_carriertracking_cc_0, '0', qtgui_freq_sink_x_0, '1'] 355 | - [blocks_complex_to_float_0, '0', qtgui_freq_sink_x_0_0, '0'] 356 | - [blocks_complex_to_float_0, '1', qtgui_freq_sink_x_0_0, '1'] 357 | - [blocks_float_to_complex_0, '0', blocks_throttle_0, '0'] 358 | - [blocks_throttle_0, '0', satellites_rms_agc_0, '0'] 359 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 360 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 361 | - [satellites_rms_agc_0, '0', analog_pll_carriertracking_cc_0, '0'] 362 | - [satellites_rms_agc_0, '0', qtgui_freq_sink_x_0, '0'] 363 | 364 | metadata: 365 | file_format: 1 366 | grc_version: v3.10.1.1-58-g637fcda4 367 | -------------------------------------------------------------------------------- /handson_03_downconversion.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_03_downconversion 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: downconverting the data sideband to baseband' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: pll_bw 37 | id: variable 38 | parameters: 39 | comment: '' 40 | value: '100' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [472, 12.0] 46 | rotation: 0 47 | state: true 48 | - name: pll_limit 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: 10e3 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [472, 92.0] 58 | rotation: 0 59 | state: true 60 | - name: samp_rate 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: '2016129' 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [304, 12.0] 70 | rotation: 0 71 | state: enabled 72 | - name: analog_pll_carriertracking_cc_0 73 | id: analog_pll_carriertracking_cc 74 | parameters: 75 | affinity: '' 76 | alias: '' 77 | comment: '' 78 | max_freq: 2 * pi * pll_limit / samp_rate 79 | maxoutbuf: '0' 80 | min_freq: -2 * pi * pll_limit / samp_rate 81 | minoutbuf: '0' 82 | w: 2 * pi * pll_bw / samp_rate 83 | states: 84 | bus_sink: false 85 | bus_source: false 86 | bus_structure: null 87 | coordinate: [1312, 164.0] 88 | rotation: 0 89 | state: enabled 90 | - name: analog_sig_source_x_0 91 | id: analog_sig_source_x 92 | parameters: 93 | affinity: '' 94 | alias: '' 95 | amp: '1' 96 | comment: '' 97 | freq: 550e3 98 | maxoutbuf: '0' 99 | minoutbuf: '0' 100 | offset: '0' 101 | phase: '0' 102 | samp_rate: samp_rate 103 | type: complex 104 | waveform: analog.GR_COS_WAVE 105 | states: 106 | bus_sink: false 107 | bus_source: false 108 | bus_structure: null 109 | coordinate: [1184, 344.0] 110 | rotation: 0 111 | state: true 112 | - name: blocks_complex_to_arg_0 113 | id: blocks_complex_to_arg 114 | parameters: 115 | affinity: '' 116 | alias: '' 117 | comment: '' 118 | maxoutbuf: '0' 119 | minoutbuf: '0' 120 | vlen: '1' 121 | states: 122 | bus_sink: false 123 | bus_source: false 124 | bus_structure: null 125 | coordinate: [104, 292.0] 126 | rotation: 0 127 | state: enabled 128 | - name: blocks_float_to_complex_0 129 | id: blocks_float_to_complex 130 | parameters: 131 | affinity: '' 132 | alias: '' 133 | comment: '' 134 | maxoutbuf: '0' 135 | minoutbuf: '0' 136 | vlen: '1' 137 | states: 138 | bus_sink: false 139 | bus_source: false 140 | bus_structure: null 141 | coordinate: [392, 196.0] 142 | rotation: 0 143 | state: true 144 | - name: blocks_float_to_complex_1 145 | id: blocks_float_to_complex 146 | parameters: 147 | affinity: '' 148 | alias: '' 149 | comment: '' 150 | maxoutbuf: '0' 151 | minoutbuf: '0' 152 | vlen: '1' 153 | states: 154 | bus_sink: false 155 | bus_source: false 156 | bus_structure: null 157 | coordinate: [544, 388.0] 158 | rotation: 0 159 | state: true 160 | - name: blocks_multiply_conjugate_cc_0 161 | id: blocks_multiply_conjugate_cc 162 | parameters: 163 | affinity: '' 164 | alias: '' 165 | comment: '' 166 | maxoutbuf: '0' 167 | minoutbuf: '0' 168 | vlen: '1' 169 | states: 170 | bus_sink: false 171 | bus_source: false 172 | bus_structure: null 173 | coordinate: [1536, 308.0] 174 | rotation: 0 175 | state: true 176 | - name: blocks_throttle_0 177 | id: blocks_throttle 178 | parameters: 179 | affinity: '' 180 | alias: '' 181 | comment: '' 182 | ignoretag: 'True' 183 | maxoutbuf: '0' 184 | minoutbuf: '0' 185 | samples_per_second: samp_rate 186 | type: complex 187 | vlen: '1' 188 | states: 189 | bus_sink: false 190 | bus_source: false 191 | bus_structure: null 192 | coordinate: [720, 188.0] 193 | rotation: 0 194 | state: true 195 | - name: blocks_wavfile_source_0 196 | id: blocks_wavfile_source 197 | parameters: 198 | affinity: '' 199 | alias: '' 200 | comment: '' 201 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 202 | maxoutbuf: '0' 203 | minoutbuf: '0' 204 | nchan: '2' 205 | repeat: 'True' 206 | states: 207 | bus_sink: false 208 | bus_source: false 209 | bus_structure: null 210 | coordinate: [24, 176.0] 211 | rotation: 0 212 | state: true 213 | - name: hilbert_fc_0 214 | id: hilbert_fc 215 | parameters: 216 | affinity: '' 217 | alias: '' 218 | beta: '6.76' 219 | comment: '' 220 | maxoutbuf: '0' 221 | minoutbuf: '0' 222 | num_taps: '65' 223 | win: window.WIN_HAMMING 224 | states: 225 | bus_sink: false 226 | bus_source: false 227 | bus_structure: null 228 | coordinate: [536, 276.0] 229 | rotation: 0 230 | state: true 231 | - name: import_0 232 | id: import 233 | parameters: 234 | alias: '' 235 | comment: '' 236 | imports: from math import pi 237 | states: 238 | bus_sink: false 239 | bus_source: false 240 | bus_structure: null 241 | coordinate: [304, 92.0] 242 | rotation: 0 243 | state: true 244 | - name: qtgui_freq_sink_x_0 245 | id: qtgui_freq_sink_x 246 | parameters: 247 | affinity: '' 248 | alias: '' 249 | alpha1: '1.0' 250 | alpha10: '1.0' 251 | alpha2: '1.0' 252 | alpha3: '1.0' 253 | alpha4: '1.0' 254 | alpha5: '1.0' 255 | alpha6: '1.0' 256 | alpha7: '1.0' 257 | alpha8: '1.0' 258 | alpha9: '1.0' 259 | autoscale: 'False' 260 | average: '0.2' 261 | axislabels: 'True' 262 | bw: samp_rate 263 | color1: '"blue"' 264 | color10: '"dark blue"' 265 | color2: '"red"' 266 | color3: '"green"' 267 | color4: '"black"' 268 | color5: '"cyan"' 269 | color6: '"magenta"' 270 | color7: '"yellow"' 271 | color8: '"dark red"' 272 | color9: '"dark green"' 273 | comment: '' 274 | ctrlpanel: 'False' 275 | fc: '0' 276 | fftsize: '4096' 277 | freqhalf: 'True' 278 | grid: 'False' 279 | gui_hint: '' 280 | label: Relative Gain 281 | label1: Phase modulation (real) 282 | label10: '''''' 283 | label2: Sideband downconverted to baseband 284 | label3: '''''' 285 | label4: '''''' 286 | label5: '''''' 287 | label6: '''''' 288 | label7: '''''' 289 | label8: '''''' 290 | label9: '''''' 291 | legend: 'True' 292 | maxoutbuf: '0' 293 | minoutbuf: '0' 294 | name: '""' 295 | nconnections: '2' 296 | norm_window: 'False' 297 | showports: 'False' 298 | tr_chan: '0' 299 | tr_level: '0.0' 300 | tr_mode: qtgui.TRIG_MODE_FREE 301 | tr_tag: '""' 302 | type: complex 303 | units: dB 304 | update_time: '0.10' 305 | width1: '1' 306 | width10: '1' 307 | width2: '1' 308 | width3: '1' 309 | width4: '1' 310 | width5: '1' 311 | width6: '1' 312 | width7: '1' 313 | width8: '1' 314 | width9: '1' 315 | wintype: window.WIN_BLACKMAN_hARRIS 316 | ymax: '-15' 317 | ymin: '-60' 318 | states: 319 | bus_sink: false 320 | bus_source: false 321 | bus_structure: null 322 | coordinate: [1336, 564.0] 323 | rotation: 0 324 | state: true 325 | - name: satellites_rms_agc_0 326 | id: satellites_rms_agc 327 | parameters: 328 | affinity: '' 329 | alias: '' 330 | alpha: 1e-4 331 | comment: '' 332 | maxoutbuf: '0' 333 | minoutbuf: '0' 334 | reference: '1.0' 335 | states: 336 | bus_sink: false 337 | bus_source: false 338 | bus_structure: null 339 | coordinate: [1016, 176.0] 340 | rotation: 0 341 | state: enabled 342 | 343 | connections: 344 | - [analog_pll_carriertracking_cc_0, '0', blocks_complex_to_arg_0, '0'] 345 | - [analog_sig_source_x_0, '0', blocks_multiply_conjugate_cc_0, '1'] 346 | - [blocks_complex_to_arg_0, '0', blocks_float_to_complex_1, '0'] 347 | - [blocks_complex_to_arg_0, '0', hilbert_fc_0, '0'] 348 | - [blocks_float_to_complex_0, '0', blocks_throttle_0, '0'] 349 | - [blocks_float_to_complex_1, '0', qtgui_freq_sink_x_0, '0'] 350 | - [blocks_multiply_conjugate_cc_0, '0', qtgui_freq_sink_x_0, '1'] 351 | - [blocks_throttle_0, '0', satellites_rms_agc_0, '0'] 352 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 353 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 354 | - [hilbert_fc_0, '0', blocks_multiply_conjugate_cc_0, '0'] 355 | - [satellites_rms_agc_0, '0', analog_pll_carriertracking_cc_0, '0'] 356 | 357 | metadata: 358 | file_format: 1 359 | grc_version: v3.10.1.1-58-g637fcda4 360 | -------------------------------------------------------------------------------- /handson_04_bpsk_carrier.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_04_bpsk_carrier 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: refining our downconversion to baseband' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: pll_bw 37 | id: variable 38 | parameters: 39 | comment: '' 40 | value: '100' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [352, 12.0] 46 | rotation: 0 47 | state: true 48 | - name: pll_limit 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: 10e3 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [352, 84.0] 58 | rotation: 0 59 | state: true 60 | - name: samp_rate 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: '2016129' 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [192, 12.0] 70 | rotation: 0 71 | state: enabled 72 | - name: analog_pll_carriertracking_cc_0 73 | id: analog_pll_carriertracking_cc 74 | parameters: 75 | affinity: '' 76 | alias: '' 77 | comment: '' 78 | max_freq: 2 * pi * pll_limit / samp_rate 79 | maxoutbuf: '0' 80 | min_freq: -2 * pi * pll_limit / samp_rate 81 | minoutbuf: '0' 82 | w: 2 * pi * pll_bw / samp_rate 83 | states: 84 | bus_sink: false 85 | bus_source: false 86 | bus_structure: null 87 | coordinate: [1280, 164.0] 88 | rotation: 0 89 | state: enabled 90 | - name: analog_sig_source_x_0 91 | id: analog_sig_source_x 92 | parameters: 93 | affinity: '' 94 | alias: '' 95 | amp: '1' 96 | comment: '' 97 | freq: 555.555e3 98 | maxoutbuf: '0' 99 | minoutbuf: '0' 100 | offset: '0' 101 | phase: '0' 102 | samp_rate: samp_rate 103 | type: complex 104 | waveform: analog.GR_COS_WAVE 105 | states: 106 | bus_sink: false 107 | bus_source: false 108 | bus_structure: null 109 | coordinate: [200, 380.0] 110 | rotation: 0 111 | state: true 112 | - name: blocks_complex_to_arg_0 113 | id: blocks_complex_to_arg 114 | parameters: 115 | affinity: '' 116 | alias: '' 117 | comment: '' 118 | maxoutbuf: '0' 119 | minoutbuf: '0' 120 | vlen: '1' 121 | states: 122 | bus_sink: false 123 | bus_source: false 124 | bus_structure: null 125 | coordinate: [432, 284.0] 126 | rotation: 0 127 | state: enabled 128 | - name: blocks_float_to_complex_0 129 | id: blocks_float_to_complex 130 | parameters: 131 | affinity: '' 132 | alias: '' 133 | comment: '' 134 | maxoutbuf: '0' 135 | minoutbuf: '0' 136 | vlen: '1' 137 | states: 138 | bus_sink: false 139 | bus_source: false 140 | bus_structure: null 141 | coordinate: [376, 196.0] 142 | rotation: 0 143 | state: true 144 | - name: blocks_multiply_conjugate_cc_0 145 | id: blocks_multiply_conjugate_cc 146 | parameters: 147 | affinity: '' 148 | alias: '' 149 | comment: '' 150 | maxoutbuf: '0' 151 | minoutbuf: '0' 152 | vlen: '1' 153 | states: 154 | bus_sink: false 155 | bus_source: false 156 | bus_structure: null 157 | coordinate: [1096, 340.0] 158 | rotation: 0 159 | state: true 160 | - name: blocks_multiply_xx_0 161 | id: blocks_multiply_xx 162 | parameters: 163 | affinity: '' 164 | alias: '' 165 | comment: '' 166 | maxoutbuf: '0' 167 | minoutbuf: '0' 168 | num_inputs: '2' 169 | type: complex 170 | vlen: '1' 171 | states: 172 | bus_sink: false 173 | bus_source: false 174 | bus_structure: null 175 | coordinate: [1520, 340.0] 176 | rotation: 0 177 | state: true 178 | - name: blocks_throttle_0 179 | id: blocks_throttle 180 | parameters: 181 | affinity: '' 182 | alias: '' 183 | comment: '' 184 | ignoretag: 'True' 185 | maxoutbuf: '0' 186 | minoutbuf: '0' 187 | samples_per_second: samp_rate 188 | type: complex 189 | vlen: '1' 190 | states: 191 | bus_sink: false 192 | bus_source: false 193 | bus_structure: null 194 | coordinate: [696, 188.0] 195 | rotation: 0 196 | state: true 197 | - name: blocks_wavfile_source_0 198 | id: blocks_wavfile_source 199 | parameters: 200 | affinity: '' 201 | alias: '' 202 | comment: '' 203 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 204 | maxoutbuf: '0' 205 | minoutbuf: '0' 206 | nchan: '2' 207 | repeat: 'True' 208 | states: 209 | bus_sink: false 210 | bus_source: false 211 | bus_structure: null 212 | coordinate: [24, 176.0] 213 | rotation: 0 214 | state: true 215 | - name: hilbert_fc_0 216 | id: hilbert_fc 217 | parameters: 218 | affinity: '' 219 | alias: '' 220 | beta: '6.76' 221 | comment: '' 222 | maxoutbuf: '0' 223 | minoutbuf: '0' 224 | num_taps: '65' 225 | win: window.WIN_HAMMING 226 | states: 227 | bus_sink: false 228 | bus_source: false 229 | bus_structure: null 230 | coordinate: [792, 300.0] 231 | rotation: 0 232 | state: true 233 | - name: import_0 234 | id: import 235 | parameters: 236 | alias: '' 237 | comment: '' 238 | imports: from math import pi 239 | states: 240 | bus_sink: false 241 | bus_source: false 242 | bus_structure: null 243 | coordinate: [192, 84.0] 244 | rotation: 0 245 | state: true 246 | - name: low_pass_filter_0 247 | id: low_pass_filter 248 | parameters: 249 | affinity: '' 250 | alias: '' 251 | beta: '6.76' 252 | comment: '' 253 | cutoff_freq: samp_rate/200*0.8 254 | decim: '100' 255 | gain: '1' 256 | interp: '1' 257 | maxoutbuf: '0' 258 | minoutbuf: '0' 259 | samp_rate: samp_rate 260 | type: fir_filter_ccf 261 | width: samp_rate/200*0.1 262 | win: window.WIN_HAMMING 263 | states: 264 | bus_sink: false 265 | bus_source: false 266 | bus_structure: null 267 | coordinate: [504, 516.0] 268 | rotation: 0 269 | state: enabled 270 | - name: qtgui_freq_sink_x_0 271 | id: qtgui_freq_sink_x 272 | parameters: 273 | affinity: '' 274 | alias: '' 275 | alpha1: '1.0' 276 | alpha10: '1.0' 277 | alpha2: '1.0' 278 | alpha3: '1.0' 279 | alpha4: '1.0' 280 | alpha5: '1.0' 281 | alpha6: '1.0' 282 | alpha7: '1.0' 283 | alpha8: '1.0' 284 | alpha9: '1.0' 285 | autoscale: 'False' 286 | average: '0.2' 287 | axislabels: 'True' 288 | bw: samp_rate 289 | color1: '"blue"' 290 | color10: '"dark blue"' 291 | color2: '"red"' 292 | color3: '"green"' 293 | color4: '"black"' 294 | color5: '"cyan"' 295 | color6: '"magenta"' 296 | color7: '"yellow"' 297 | color8: '"dark red"' 298 | color9: '"dark green"' 299 | comment: '' 300 | ctrlpanel: 'False' 301 | fc: '0' 302 | fftsize: '4096' 303 | freqhalf: 'True' 304 | grid: 'False' 305 | gui_hint: '' 306 | label: Relative Gain 307 | label1: BPSK signal 308 | label10: '''''' 309 | label2: BPSK signal squared 310 | label3: '''''' 311 | label4: '''''' 312 | label5: '''''' 313 | label6: '''''' 314 | label7: '''''' 315 | label8: '''''' 316 | label9: '''''' 317 | legend: 'True' 318 | maxoutbuf: '0' 319 | minoutbuf: '0' 320 | name: '""' 321 | nconnections: '2' 322 | norm_window: 'False' 323 | showports: 'False' 324 | tr_chan: '0' 325 | tr_level: '0.0' 326 | tr_mode: qtgui.TRIG_MODE_FREE 327 | tr_tag: '""' 328 | type: complex 329 | units: dB 330 | update_time: '0.10' 331 | width1: '1' 332 | width10: '1' 333 | width2: '1' 334 | width3: '1' 335 | width4: '1' 336 | width5: '1' 337 | width6: '1' 338 | width7: '1' 339 | width8: '1' 340 | width9: '1' 341 | wintype: window.WIN_BLACKMAN_hARRIS 342 | ymax: '0' 343 | ymin: '-60' 344 | states: 345 | bus_sink: false 346 | bus_source: false 347 | bus_structure: null 348 | coordinate: [1864, 244.0] 349 | rotation: 0 350 | state: true 351 | - name: qtgui_freq_sink_x_0_0 352 | id: qtgui_freq_sink_x 353 | parameters: 354 | affinity: '' 355 | alias: '' 356 | alpha1: '1.0' 357 | alpha10: '1.0' 358 | alpha2: '1.0' 359 | alpha3: '1.0' 360 | alpha4: '1.0' 361 | alpha5: '1.0' 362 | alpha6: '1.0' 363 | alpha7: '1.0' 364 | alpha8: '1.0' 365 | alpha9: '1.0' 366 | autoscale: 'False' 367 | average: '0.2' 368 | axislabels: 'True' 369 | bw: samp_rate/100 370 | color1: '"blue"' 371 | color10: '"dark blue"' 372 | color2: '"red"' 373 | color3: '"green"' 374 | color4: '"black"' 375 | color5: '"cyan"' 376 | color6: '"magenta"' 377 | color7: '"yellow"' 378 | color8: '"dark red"' 379 | color9: '"dark green"' 380 | comment: '' 381 | ctrlpanel: 'False' 382 | fc: '0' 383 | fftsize: '4096' 384 | freqhalf: 'True' 385 | grid: 'False' 386 | gui_hint: '' 387 | label: Relative Gain 388 | label1: '' 389 | label10: '''''' 390 | label2: Sideband downconverted to baseband 391 | label3: '''''' 392 | label4: '''''' 393 | label5: '''''' 394 | label6: '''''' 395 | label7: '''''' 396 | label8: '''''' 397 | label9: '''''' 398 | legend: 'True' 399 | maxoutbuf: '0' 400 | minoutbuf: '0' 401 | name: '""' 402 | nconnections: '1' 403 | norm_window: 'False' 404 | showports: 'False' 405 | tr_chan: '0' 406 | tr_level: '0.0' 407 | tr_mode: qtgui.TRIG_MODE_FREE 408 | tr_tag: '""' 409 | type: complex 410 | units: dB 411 | update_time: '0.10' 412 | width1: '1' 413 | width10: '1' 414 | width2: '1' 415 | width3: '1' 416 | width4: '1' 417 | width5: '1' 418 | width6: '1' 419 | width7: '1' 420 | width8: '1' 421 | width9: '1' 422 | wintype: window.WIN_BLACKMAN_hARRIS 423 | ymax: '0' 424 | ymin: '-60' 425 | states: 426 | bus_sink: false 427 | bus_source: false 428 | bus_structure: null 429 | coordinate: [832, 568.0] 430 | rotation: 0 431 | state: enabled 432 | - name: satellites_rms_agc_0 433 | id: satellites_rms_agc 434 | parameters: 435 | affinity: '' 436 | alias: '' 437 | alpha: 1e-4 438 | comment: '' 439 | maxoutbuf: '0' 440 | minoutbuf: '0' 441 | reference: '1.0' 442 | states: 443 | bus_sink: false 444 | bus_source: false 445 | bus_structure: null 446 | coordinate: [984, 176.0] 447 | rotation: 0 448 | state: enabled 449 | 450 | connections: 451 | - [analog_pll_carriertracking_cc_0, '0', blocks_complex_to_arg_0, '0'] 452 | - [analog_sig_source_x_0, '0', blocks_multiply_conjugate_cc_0, '1'] 453 | - [blocks_complex_to_arg_0, '0', hilbert_fc_0, '0'] 454 | - [blocks_float_to_complex_0, '0', blocks_throttle_0, '0'] 455 | - [blocks_multiply_conjugate_cc_0, '0', blocks_multiply_xx_0, '0'] 456 | - [blocks_multiply_conjugate_cc_0, '0', blocks_multiply_xx_0, '1'] 457 | - [blocks_multiply_conjugate_cc_0, '0', qtgui_freq_sink_x_0, '0'] 458 | - [blocks_multiply_xx_0, '0', low_pass_filter_0, '0'] 459 | - [blocks_multiply_xx_0, '0', qtgui_freq_sink_x_0, '1'] 460 | - [blocks_throttle_0, '0', satellites_rms_agc_0, '0'] 461 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 462 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 463 | - [hilbert_fc_0, '0', blocks_multiply_conjugate_cc_0, '0'] 464 | - [low_pass_filter_0, '0', qtgui_freq_sink_x_0_0, '0'] 465 | - [satellites_rms_agc_0, '0', analog_pll_carriertracking_cc_0, '0'] 466 | 467 | metadata: 468 | file_format: 1 469 | grc_version: v3.10.1.1-58-g637fcda4 470 | -------------------------------------------------------------------------------- /handson_05_symbol_rate.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_05_symbol_rate 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: finding the symbol rate' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: lowpass_taps 37 | id: variable_low_pass_filter_taps 38 | parameters: 39 | beta: '6.76' 40 | comment: '' 41 | cutoff_freq: samp_rate/200 * 0.8 42 | gain: '1.0' 43 | samp_rate: samp_rate 44 | width: samp_rate/200 * 0.1 45 | win: window.WIN_HAMMING 46 | states: 47 | bus_sink: false 48 | bus_source: false 49 | bus_structure: null 50 | coordinate: [1064, 560.0] 51 | rotation: 0 52 | state: true 53 | - name: pll_bw 54 | id: variable 55 | parameters: 56 | comment: '' 57 | value: '100' 58 | states: 59 | bus_sink: false 60 | bus_source: false 61 | bus_structure: null 62 | coordinate: [544, 12.0] 63 | rotation: 0 64 | state: true 65 | - name: pll_limit 66 | id: variable 67 | parameters: 68 | comment: '' 69 | value: 10e3 70 | states: 71 | bus_sink: false 72 | bus_source: false 73 | bus_structure: null 74 | coordinate: [544, 84.0] 75 | rotation: 0 76 | state: true 77 | - name: samp_rate 78 | id: variable 79 | parameters: 80 | comment: '' 81 | value: '2016129' 82 | states: 83 | bus_sink: false 84 | bus_source: false 85 | bus_structure: null 86 | coordinate: [272, 12.0] 87 | rotation: 0 88 | state: enabled 89 | - name: analog_pll_carriertracking_cc_0 90 | id: analog_pll_carriertracking_cc 91 | parameters: 92 | affinity: '' 93 | alias: '' 94 | comment: '' 95 | max_freq: 2 * pi * pll_limit / samp_rate 96 | maxoutbuf: '0' 97 | min_freq: -2 * pi * pll_limit / samp_rate 98 | minoutbuf: '0' 99 | w: 2 * pi * pll_bw / samp_rate 100 | states: 101 | bus_sink: false 102 | bus_source: false 103 | bus_structure: null 104 | coordinate: [1288, 164.0] 105 | rotation: 0 106 | state: enabled 107 | - name: analog_sig_source_x_0 108 | id: analog_sig_source_x 109 | parameters: 110 | affinity: '' 111 | alias: '' 112 | amp: '1' 113 | comment: '' 114 | freq: 555.555e3 115 | maxoutbuf: '0' 116 | minoutbuf: '0' 117 | offset: '0' 118 | phase: '0' 119 | samp_rate: samp_rate 120 | type: complex 121 | waveform: analog.GR_COS_WAVE 122 | states: 123 | bus_sink: false 124 | bus_source: false 125 | bus_structure: null 126 | coordinate: [200, 380.0] 127 | rotation: 0 128 | state: true 129 | - name: blocks_complex_to_arg_0 130 | id: blocks_complex_to_arg 131 | parameters: 132 | affinity: '' 133 | alias: '' 134 | comment: '' 135 | maxoutbuf: '0' 136 | minoutbuf: '0' 137 | vlen: '1' 138 | states: 139 | bus_sink: false 140 | bus_source: false 141 | bus_structure: null 142 | coordinate: [56, 300.0] 143 | rotation: 0 144 | state: enabled 145 | - name: blocks_delay_0 146 | id: blocks_delay 147 | parameters: 148 | affinity: '' 149 | alias: '' 150 | comment: '' 151 | delay: '1' 152 | maxoutbuf: '0' 153 | minoutbuf: '0' 154 | num_ports: '1' 155 | type: complex 156 | vlen: '1' 157 | states: 158 | bus_sink: false 159 | bus_source: false 160 | bus_structure: null 161 | coordinate: [1064, 396.0] 162 | rotation: 0 163 | state: true 164 | - name: blocks_float_to_complex_0 165 | id: blocks_float_to_complex 166 | parameters: 167 | affinity: '' 168 | alias: '' 169 | comment: '' 170 | maxoutbuf: '0' 171 | minoutbuf: '0' 172 | vlen: '1' 173 | states: 174 | bus_sink: false 175 | bus_source: false 176 | bus_structure: null 177 | coordinate: [376, 196.0] 178 | rotation: 0 179 | state: true 180 | - name: blocks_multiply_conjugate_cc_0 181 | id: blocks_multiply_conjugate_cc 182 | parameters: 183 | affinity: '' 184 | alias: '' 185 | comment: '' 186 | maxoutbuf: '0' 187 | minoutbuf: '0' 188 | vlen: '1' 189 | states: 190 | bus_sink: false 191 | bus_source: false 192 | bus_structure: null 193 | coordinate: [720, 348.0] 194 | rotation: 0 195 | state: true 196 | - name: blocks_multiply_conjugate_cc_1 197 | id: blocks_multiply_conjugate_cc 198 | parameters: 199 | affinity: '' 200 | alias: '' 201 | comment: '' 202 | maxoutbuf: '0' 203 | minoutbuf: '0' 204 | vlen: '1' 205 | states: 206 | bus_sink: false 207 | bus_source: false 208 | bus_structure: null 209 | coordinate: [1328, 356.0] 210 | rotation: 0 211 | state: true 212 | - name: blocks_throttle_0 213 | id: blocks_throttle 214 | parameters: 215 | affinity: '' 216 | alias: '' 217 | comment: '' 218 | ignoretag: 'True' 219 | maxoutbuf: '0' 220 | minoutbuf: '0' 221 | samples_per_second: samp_rate 222 | type: complex 223 | vlen: '1' 224 | states: 225 | bus_sink: false 226 | bus_source: false 227 | bus_structure: null 228 | coordinate: [712, 188.0] 229 | rotation: 0 230 | state: true 231 | - name: blocks_wavfile_source_0 232 | id: blocks_wavfile_source 233 | parameters: 234 | affinity: '' 235 | alias: '' 236 | comment: '' 237 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 238 | maxoutbuf: '0' 239 | minoutbuf: '0' 240 | nchan: '2' 241 | repeat: 'True' 242 | states: 243 | bus_sink: false 244 | bus_source: false 245 | bus_structure: null 246 | coordinate: [24, 176.0] 247 | rotation: 0 248 | state: true 249 | - name: freq_xlating_fir_filter_xxx_0 250 | id: freq_xlating_fir_filter_xxx 251 | parameters: 252 | affinity: '' 253 | alias: '' 254 | center_freq: 555.555e3 255 | comment: '' 256 | decim: '100' 257 | maxoutbuf: '0' 258 | minoutbuf: '0' 259 | samp_rate: samp_rate 260 | taps: lowpass_taps 261 | type: ccc 262 | states: 263 | bus_sink: false 264 | bus_source: false 265 | bus_structure: null 266 | coordinate: [1552, 516.0] 267 | rotation: 0 268 | state: enabled 269 | - name: hilbert_fc_0 270 | id: hilbert_fc 271 | parameters: 272 | affinity: '' 273 | alias: '' 274 | beta: '6.76' 275 | comment: '' 276 | maxoutbuf: '0' 277 | minoutbuf: '0' 278 | num_taps: '65' 279 | win: window.WIN_HAMMING 280 | states: 281 | bus_sink: false 282 | bus_source: false 283 | bus_structure: null 284 | coordinate: [480, 324.0] 285 | rotation: 0 286 | state: true 287 | - name: import_0 288 | id: import 289 | parameters: 290 | alias: '' 291 | comment: '' 292 | imports: from math import pi 293 | states: 294 | bus_sink: false 295 | bus_source: false 296 | bus_structure: null 297 | coordinate: [272, 84.0] 298 | rotation: 0 299 | state: true 300 | - name: qtgui_freq_sink_x_0 301 | id: qtgui_freq_sink_x 302 | parameters: 303 | affinity: '' 304 | alias: '' 305 | alpha1: '1.0' 306 | alpha10: '1.0' 307 | alpha2: '1.0' 308 | alpha3: '1.0' 309 | alpha4: '1.0' 310 | alpha5: '1.0' 311 | alpha6: '1.0' 312 | alpha7: '1.0' 313 | alpha8: '1.0' 314 | alpha9: '1.0' 315 | autoscale: 'False' 316 | average: '0.2' 317 | axislabels: 'True' 318 | bw: samp_rate 319 | color1: '"blue"' 320 | color10: '"dark blue"' 321 | color2: '"red"' 322 | color3: '"green"' 323 | color4: '"black"' 324 | color5: '"cyan"' 325 | color6: '"magenta"' 326 | color7: '"yellow"' 327 | color8: '"dark red"' 328 | color9: '"dark green"' 329 | comment: '' 330 | ctrlpanel: 'False' 331 | fc: '0' 332 | fftsize: '4096' 333 | freqhalf: 'True' 334 | grid: 'False' 335 | gui_hint: '' 336 | label: Relative Gain 337 | label1: '' 338 | label10: '''''' 339 | label2: BPSK signal squared 340 | label3: '''''' 341 | label4: '''''' 342 | label5: '''''' 343 | label6: '''''' 344 | label7: '''''' 345 | label8: '''''' 346 | label9: '''''' 347 | legend: 'True' 348 | maxoutbuf: '0' 349 | minoutbuf: '0' 350 | name: '""' 351 | nconnections: '1' 352 | norm_window: 'False' 353 | showports: 'False' 354 | tr_chan: '0' 355 | tr_level: '0.0' 356 | tr_mode: qtgui.TRIG_MODE_FREE 357 | tr_tag: '""' 358 | type: complex 359 | units: dB 360 | update_time: '0.10' 361 | width1: '1' 362 | width10: '1' 363 | width2: '1' 364 | width3: '1' 365 | width4: '1' 366 | width5: '1' 367 | width6: '1' 368 | width7: '1' 369 | width8: '1' 370 | width9: '1' 371 | wintype: window.WIN_BLACKMAN_hARRIS 372 | ymax: '0' 373 | ymin: '-60' 374 | states: 375 | bus_sink: false 376 | bus_source: false 377 | bus_structure: null 378 | coordinate: [1744, 324.0] 379 | rotation: 0 380 | state: true 381 | - name: qtgui_freq_sink_x_0_0 382 | id: qtgui_freq_sink_x 383 | parameters: 384 | affinity: '' 385 | alias: '' 386 | alpha1: '1.0' 387 | alpha10: '1.0' 388 | alpha2: '1.0' 389 | alpha3: '1.0' 390 | alpha4: '1.0' 391 | alpha5: '1.0' 392 | alpha6: '1.0' 393 | alpha7: '1.0' 394 | alpha8: '1.0' 395 | alpha9: '1.0' 396 | autoscale: 'False' 397 | average: '0.2' 398 | axislabels: 'True' 399 | bw: samp_rate/100 400 | color1: '"blue"' 401 | color10: '"dark blue"' 402 | color2: '"red"' 403 | color3: '"green"' 404 | color4: '"black"' 405 | color5: '"cyan"' 406 | color6: '"magenta"' 407 | color7: '"yellow"' 408 | color8: '"dark red"' 409 | color9: '"dark green"' 410 | comment: '' 411 | ctrlpanel: 'False' 412 | fc: '0' 413 | fftsize: '4096' 414 | freqhalf: 'True' 415 | grid: 'False' 416 | gui_hint: '' 417 | label: Relative Gain 418 | label1: '' 419 | label10: '''''' 420 | label2: Sideband downconverted to baseband 421 | label3: '''''' 422 | label4: '''''' 423 | label5: '''''' 424 | label6: '''''' 425 | label7: '''''' 426 | label8: '''''' 427 | label9: '''''' 428 | legend: 'True' 429 | maxoutbuf: '0' 430 | minoutbuf: '0' 431 | name: '""' 432 | nconnections: '1' 433 | norm_window: 'False' 434 | showports: 'False' 435 | tr_chan: '0' 436 | tr_level: '0.0' 437 | tr_mode: qtgui.TRIG_MODE_FREE 438 | tr_tag: '""' 439 | type: complex 440 | units: dB 441 | update_time: '0.10' 442 | width1: '1' 443 | width10: '1' 444 | width2: '1' 445 | width3: '1' 446 | width4: '1' 447 | width5: '1' 448 | width6: '1' 449 | width7: '1' 450 | width8: '1' 451 | width9: '1' 452 | wintype: window.WIN_BLACKMAN_hARRIS 453 | ymax: '0' 454 | ymin: '-60' 455 | states: 456 | bus_sink: false 457 | bus_source: false 458 | bus_structure: null 459 | coordinate: [1944, 668.0] 460 | rotation: 0 461 | state: enabled 462 | - name: satellites_rms_agc_0 463 | id: satellites_rms_agc 464 | parameters: 465 | affinity: '' 466 | alias: '' 467 | alpha: 1e-4 468 | comment: '' 469 | maxoutbuf: '0' 470 | minoutbuf: '0' 471 | reference: '1.0' 472 | states: 473 | bus_sink: false 474 | bus_source: false 475 | bus_structure: null 476 | coordinate: [1000, 176.0] 477 | rotation: 0 478 | state: enabled 479 | 480 | connections: 481 | - [analog_pll_carriertracking_cc_0, '0', blocks_complex_to_arg_0, '0'] 482 | - [analog_sig_source_x_0, '0', blocks_multiply_conjugate_cc_0, '1'] 483 | - [blocks_complex_to_arg_0, '0', hilbert_fc_0, '0'] 484 | - [blocks_delay_0, '0', blocks_multiply_conjugate_cc_1, '1'] 485 | - [blocks_float_to_complex_0, '0', blocks_throttle_0, '0'] 486 | - [blocks_multiply_conjugate_cc_0, '0', blocks_delay_0, '0'] 487 | - [blocks_multiply_conjugate_cc_0, '0', blocks_multiply_conjugate_cc_1, '0'] 488 | - [blocks_multiply_conjugate_cc_1, '0', freq_xlating_fir_filter_xxx_0, '0'] 489 | - [blocks_multiply_conjugate_cc_1, '0', qtgui_freq_sink_x_0, '0'] 490 | - [blocks_throttle_0, '0', satellites_rms_agc_0, '0'] 491 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 492 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 493 | - [freq_xlating_fir_filter_xxx_0, '0', qtgui_freq_sink_x_0_0, '0'] 494 | - [hilbert_fc_0, '0', blocks_multiply_conjugate_cc_0, '0'] 495 | - [satellites_rms_agc_0, '0', analog_pll_carriertracking_cc_0, '0'] 496 | 497 | metadata: 498 | file_format: 1 499 | grc_version: v3.10.1.1-58-g637fcda4 500 | -------------------------------------------------------------------------------- /handson_06_clock_carrier_recovery.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_06_clock_carrier_recovery 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: clock and carrier recovery' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: pll_bw 37 | id: variable 38 | parameters: 39 | comment: '' 40 | value: '100' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [424, 4.0] 46 | rotation: 0 47 | state: true 48 | - name: pll_limit 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: 10e3 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [424, 76.0] 58 | rotation: 0 59 | state: true 60 | - name: samp_rate 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: '2016129' 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [264, 4.0] 70 | rotation: 0 71 | state: enabled 72 | - name: sps 73 | id: variable 74 | parameters: 75 | comment: '' 76 | value: samp_rate/symbol_rate 77 | states: 78 | bus_sink: false 79 | bus_source: false 80 | bus_structure: null 81 | coordinate: [656, 76.0] 82 | rotation: 0 83 | state: true 84 | - name: symbol_rate 85 | id: variable 86 | parameters: 87 | comment: '' 88 | value: '555555' 89 | states: 90 | bus_sink: false 91 | bus_source: false 92 | bus_structure: null 93 | coordinate: [656, 4.0] 94 | rotation: 0 95 | state: true 96 | - name: analog_pll_carriertracking_cc_0 97 | id: analog_pll_carriertracking_cc 98 | parameters: 99 | affinity: '' 100 | alias: '' 101 | comment: '' 102 | max_freq: 2 * pi * pll_limit / samp_rate 103 | maxoutbuf: '0' 104 | min_freq: -2 * pi * pll_limit / samp_rate 105 | minoutbuf: '0' 106 | w: 2 * pi * pll_bw / samp_rate 107 | states: 108 | bus_sink: false 109 | bus_source: false 110 | bus_structure: null 111 | coordinate: [1280, 164.0] 112 | rotation: 0 113 | state: enabled 114 | - name: analog_sig_source_x_0 115 | id: analog_sig_source_x 116 | parameters: 117 | affinity: '' 118 | alias: '' 119 | amp: '1' 120 | comment: '' 121 | freq: 555.555e3 122 | maxoutbuf: '0' 123 | minoutbuf: '0' 124 | offset: '0' 125 | phase: '0' 126 | samp_rate: samp_rate 127 | type: complex 128 | waveform: analog.GR_COS_WAVE 129 | states: 130 | bus_sink: false 131 | bus_source: false 132 | bus_structure: null 133 | coordinate: [120, 416.0] 134 | rotation: 0 135 | state: true 136 | - name: blocks_complex_to_arg_0 137 | id: blocks_complex_to_arg 138 | parameters: 139 | affinity: '' 140 | alias: '' 141 | comment: '' 142 | maxoutbuf: '0' 143 | minoutbuf: '0' 144 | vlen: '1' 145 | states: 146 | bus_sink: false 147 | bus_source: false 148 | bus_structure: null 149 | coordinate: [96, 328.0] 150 | rotation: 0 151 | state: enabled 152 | - name: blocks_complex_to_real_0 153 | id: blocks_complex_to_real 154 | parameters: 155 | affinity: '' 156 | alias: '' 157 | comment: '' 158 | maxoutbuf: '0' 159 | minoutbuf: '0' 160 | vlen: '1' 161 | states: 162 | bus_sink: false 163 | bus_source: false 164 | bus_structure: null 165 | coordinate: [1160, 652.0] 166 | rotation: 180 167 | state: true 168 | - name: blocks_float_to_complex_0 169 | id: blocks_float_to_complex 170 | parameters: 171 | affinity: '' 172 | alias: '' 173 | comment: '' 174 | maxoutbuf: '0' 175 | minoutbuf: '0' 176 | vlen: '1' 177 | states: 178 | bus_sink: false 179 | bus_source: false 180 | bus_structure: null 181 | coordinate: [376, 196.0] 182 | rotation: 0 183 | state: true 184 | - name: blocks_multiply_conjugate_cc_0 185 | id: blocks_multiply_conjugate_cc 186 | parameters: 187 | affinity: '' 188 | alias: '' 189 | comment: '' 190 | maxoutbuf: '0' 191 | minoutbuf: '0' 192 | vlen: '1' 193 | states: 194 | bus_sink: false 195 | bus_source: false 196 | bus_structure: null 197 | coordinate: [984, 332.0] 198 | rotation: 0 199 | state: true 200 | - name: blocks_throttle_0 201 | id: blocks_throttle 202 | parameters: 203 | affinity: '' 204 | alias: '' 205 | comment: '' 206 | ignoretag: 'True' 207 | maxoutbuf: '0' 208 | minoutbuf: '0' 209 | samples_per_second: samp_rate 210 | type: complex 211 | vlen: '1' 212 | states: 213 | bus_sink: false 214 | bus_source: false 215 | bus_structure: null 216 | coordinate: [704, 188.0] 217 | rotation: 0 218 | state: true 219 | - name: blocks_wavfile_source_0 220 | id: blocks_wavfile_source 221 | parameters: 222 | affinity: '' 223 | alias: '' 224 | comment: '' 225 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 226 | maxoutbuf: '0' 227 | minoutbuf: '0' 228 | nchan: '2' 229 | repeat: 'True' 230 | states: 231 | bus_sink: false 232 | bus_source: false 233 | bus_structure: null 234 | coordinate: [24, 176.0] 235 | rotation: 0 236 | state: true 237 | - name: digital_costas_loop_cc_0 238 | id: digital_costas_loop_cc 239 | parameters: 240 | affinity: '' 241 | alias: '' 242 | comment: '' 243 | maxoutbuf: '0' 244 | minoutbuf: '0' 245 | order: '2' 246 | use_snr: 'False' 247 | w: '0.001' 248 | states: 249 | bus_sink: false 250 | bus_source: false 251 | bus_structure: null 252 | coordinate: [1728, 644.0] 253 | rotation: 180 254 | state: true 255 | - name: digital_symbol_sync_xx_0 256 | id: digital_symbol_sync_xx 257 | parameters: 258 | affinity: '' 259 | alias: '' 260 | comment: '' 261 | constellation: digital.constellation_bpsk().base() 262 | damping: '1.0' 263 | loop_bw: '0.001' 264 | max_dev: '0.001' 265 | maxoutbuf: '0' 266 | minoutbuf: '0' 267 | nfilters: '128' 268 | osps: '1' 269 | pfb_mf_taps: '[]' 270 | resamp_type: digital.IR_MMSE_8TAP 271 | sps: sps 272 | ted_gain: '1.0' 273 | ted_type: digital.TED_GARDNER 274 | type: cc 275 | states: 276 | bus_sink: false 277 | bus_source: false 278 | bus_structure: null 279 | coordinate: [1648, 392.0] 280 | rotation: 0 281 | state: true 282 | - name: fir_filter_xxx_0 283 | id: fir_filter_xxx 284 | parameters: 285 | affinity: '' 286 | alias: '' 287 | comment: '' 288 | decim: '1' 289 | maxoutbuf: '0' 290 | minoutbuf: '0' 291 | samp_delay: '0' 292 | taps: np.ones(int(sps))/int(sps) / 1.57 293 | type: ccc 294 | states: 295 | bus_sink: false 296 | bus_source: false 297 | bus_structure: null 298 | coordinate: [1320, 312.0] 299 | rotation: 0 300 | state: true 301 | - name: hilbert_fc_0 302 | id: hilbert_fc 303 | parameters: 304 | affinity: '' 305 | alias: '' 306 | beta: '6.76' 307 | comment: '' 308 | maxoutbuf: '0' 309 | minoutbuf: '0' 310 | num_taps: '65' 311 | win: window.WIN_HAMMING 312 | states: 313 | bus_sink: false 314 | bus_source: false 315 | bus_structure: null 316 | coordinate: [512, 332.0] 317 | rotation: 0 318 | state: true 319 | - name: import_0 320 | id: import 321 | parameters: 322 | alias: '' 323 | comment: '' 324 | imports: from math import pi 325 | states: 326 | bus_sink: false 327 | bus_source: false 328 | bus_structure: null 329 | coordinate: [264, 76.0] 330 | rotation: 0 331 | state: true 332 | - name: import_1 333 | id: import 334 | parameters: 335 | alias: '' 336 | comment: '' 337 | imports: import numpy as np 338 | states: 339 | bus_sink: false 340 | bus_source: false 341 | bus_structure: null 342 | coordinate: [536, 4.0] 343 | rotation: 0 344 | state: true 345 | - name: qtgui_const_sink_x_0 346 | id: qtgui_const_sink_x 347 | parameters: 348 | affinity: '' 349 | alias: '' 350 | alpha1: '1.0' 351 | alpha10: '1.0' 352 | alpha2: '1.0' 353 | alpha3: '1.0' 354 | alpha4: '1.0' 355 | alpha5: '1.0' 356 | alpha6: '1.0' 357 | alpha7: '1.0' 358 | alpha8: '1.0' 359 | alpha9: '1.0' 360 | autoscale: 'False' 361 | axislabels: 'True' 362 | color1: '"blue"' 363 | color10: '"red"' 364 | color2: '"red"' 365 | color3: '"red"' 366 | color4: '"red"' 367 | color5: '"red"' 368 | color6: '"red"' 369 | color7: '"red"' 370 | color8: '"red"' 371 | color9: '"red"' 372 | comment: '' 373 | grid: 'False' 374 | gui_hint: '' 375 | label1: '' 376 | label10: '' 377 | label2: '' 378 | label3: '' 379 | label4: '' 380 | label5: '' 381 | label6: '' 382 | label7: '' 383 | label8: '' 384 | label9: '' 385 | legend: 'True' 386 | marker1: '0' 387 | marker10: '0' 388 | marker2: '0' 389 | marker3: '0' 390 | marker4: '0' 391 | marker5: '0' 392 | marker6: '0' 393 | marker7: '0' 394 | marker8: '0' 395 | marker9: '0' 396 | name: '""' 397 | nconnections: '1' 398 | size: '1024' 399 | style1: '0' 400 | style10: '0' 401 | style2: '0' 402 | style3: '0' 403 | style4: '0' 404 | style5: '0' 405 | style6: '0' 406 | style7: '0' 407 | style8: '0' 408 | style9: '0' 409 | tr_chan: '0' 410 | tr_level: '0.0' 411 | tr_mode: qtgui.TRIG_MODE_FREE 412 | tr_slope: qtgui.TRIG_SLOPE_POS 413 | tr_tag: '""' 414 | type: complex 415 | update_time: '0.10' 416 | width1: '1' 417 | width10: '1' 418 | width2: '1' 419 | width3: '1' 420 | width4: '1' 421 | width5: '1' 422 | width6: '1' 423 | width7: '1' 424 | width8: '1' 425 | width9: '1' 426 | xmax: '2' 427 | xmin: '-2' 428 | ymax: '2' 429 | ymin: '-2' 430 | states: 431 | bus_sink: false 432 | bus_source: false 433 | bus_structure: null 434 | coordinate: [1168, 504.0] 435 | rotation: 180 436 | state: true 437 | - name: qtgui_time_sink_x_0 438 | id: qtgui_time_sink_x 439 | parameters: 440 | affinity: '' 441 | alias: '' 442 | alpha1: '1.0' 443 | alpha10: '1.0' 444 | alpha2: '1.0' 445 | alpha3: '1.0' 446 | alpha4: '1.0' 447 | alpha5: '1.0' 448 | alpha6: '1.0' 449 | alpha7: '1.0' 450 | alpha8: '1.0' 451 | alpha9: '1.0' 452 | autoscale: 'False' 453 | axislabels: 'True' 454 | color1: blue 455 | color10: dark blue 456 | color2: red 457 | color3: green 458 | color4: black 459 | color5: cyan 460 | color6: magenta 461 | color7: yellow 462 | color8: dark red 463 | color9: dark green 464 | comment: '' 465 | ctrlpanel: 'False' 466 | entags: 'True' 467 | grid: 'False' 468 | gui_hint: '' 469 | label1: Signal 1 470 | label10: Signal 10 471 | label2: Signal 2 472 | label3: Signal 3 473 | label4: Signal 4 474 | label5: Signal 5 475 | label6: Signal 6 476 | label7: Signal 7 477 | label8: Signal 8 478 | label9: Signal 9 479 | legend: 'True' 480 | marker1: '0' 481 | marker10: '-1' 482 | marker2: '-1' 483 | marker3: '-1' 484 | marker4: '-1' 485 | marker5: '-1' 486 | marker6: '-1' 487 | marker7: '-1' 488 | marker8: '-1' 489 | marker9: '-1' 490 | name: '""' 491 | nconnections: '1' 492 | size: '1024' 493 | srate: symbol_rate 494 | stemplot: 'False' 495 | style1: '0' 496 | style10: '1' 497 | style2: '1' 498 | style3: '1' 499 | style4: '1' 500 | style5: '1' 501 | style6: '1' 502 | style7: '1' 503 | style8: '1' 504 | style9: '1' 505 | tr_chan: '0' 506 | tr_delay: '0' 507 | tr_level: '0.0' 508 | tr_mode: qtgui.TRIG_MODE_FREE 509 | tr_slope: qtgui.TRIG_SLOPE_POS 510 | tr_tag: '""' 511 | type: float 512 | update_time: '0.10' 513 | width1: '1' 514 | width10: '1' 515 | width2: '1' 516 | width3: '1' 517 | width4: '1' 518 | width5: '1' 519 | width6: '1' 520 | width7: '1' 521 | width8: '1' 522 | width9: '1' 523 | ylabel: Amplitude 524 | ymax: '3' 525 | ymin: '-3' 526 | yunit: '""' 527 | states: 528 | bus_sink: false 529 | bus_source: false 530 | bus_structure: null 531 | coordinate: [736, 596.0] 532 | rotation: 180 533 | state: true 534 | - name: satellites_rms_agc_0 535 | id: satellites_rms_agc 536 | parameters: 537 | affinity: '' 538 | alias: '' 539 | alpha: 1e-4 540 | comment: '' 541 | maxoutbuf: '0' 542 | minoutbuf: '0' 543 | reference: '1.0' 544 | states: 545 | bus_sink: false 546 | bus_source: false 547 | bus_structure: null 548 | coordinate: [992, 176.0] 549 | rotation: 0 550 | state: enabled 551 | 552 | connections: 553 | - [analog_pll_carriertracking_cc_0, '0', blocks_complex_to_arg_0, '0'] 554 | - [analog_sig_source_x_0, '0', blocks_multiply_conjugate_cc_0, '1'] 555 | - [blocks_complex_to_arg_0, '0', hilbert_fc_0, '0'] 556 | - [blocks_complex_to_real_0, '0', qtgui_time_sink_x_0, '0'] 557 | - [blocks_float_to_complex_0, '0', blocks_throttle_0, '0'] 558 | - [blocks_multiply_conjugate_cc_0, '0', fir_filter_xxx_0, '0'] 559 | - [blocks_throttle_0, '0', satellites_rms_agc_0, '0'] 560 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 561 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 562 | - [digital_costas_loop_cc_0, '0', blocks_complex_to_real_0, '0'] 563 | - [digital_costas_loop_cc_0, '0', qtgui_const_sink_x_0, '0'] 564 | - [digital_symbol_sync_xx_0, '0', digital_costas_loop_cc_0, '0'] 565 | - [fir_filter_xxx_0, '0', digital_symbol_sync_xx_0, '0'] 566 | - [hilbert_fc_0, '0', blocks_multiply_conjugate_cc_0, '0'] 567 | - [satellites_rms_agc_0, '0', analog_pll_carriertracking_cc_0, '0'] 568 | 569 | metadata: 570 | file_format: 1 571 | grc_version: v3.10.1.1-58-g637fcda4 572 | -------------------------------------------------------------------------------- /handson_07_syncword.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_07_syncword 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: finding the syncword' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: access_code 37 | id: variable 38 | parameters: 39 | comment: '' 40 | value: '''''.join([str(i) for i in (syncword+1)//2])' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [1216, 28.0] 46 | rotation: 0 47 | state: true 48 | - name: pll_bw 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: '100' 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [352, 12.0] 58 | rotation: 0 59 | state: true 60 | - name: pll_limit 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: 10e3 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [352, 84.0] 70 | rotation: 0 71 | state: true 72 | - name: samp_rate 73 | id: variable 74 | parameters: 75 | comment: '' 76 | value: '2016129' 77 | states: 78 | bus_sink: false 79 | bus_source: false 80 | bus_structure: null 81 | coordinate: [192, 12.0] 82 | rotation: 0 83 | state: enabled 84 | - name: sps 85 | id: variable 86 | parameters: 87 | comment: '' 88 | value: samp_rate/symbol_rate 89 | states: 90 | bus_sink: false 91 | bus_source: false 92 | bus_structure: null 93 | coordinate: [560, 84.0] 94 | rotation: 0 95 | state: true 96 | - name: symbol_rate 97 | id: variable 98 | parameters: 99 | comment: '' 100 | value: '555555' 101 | states: 102 | bus_sink: false 103 | bus_source: false 104 | bus_structure: null 105 | coordinate: [560, 12.0] 106 | rotation: 0 107 | state: true 108 | - name: syncword 109 | id: variable 110 | parameters: 111 | comment: '' 112 | value: 2*np.unpackbits(np.frombuffer(bytes.fromhex(syncword_hex), dtype = 'uint8')).astype('int')-1 113 | states: 114 | bus_sink: false 115 | bus_source: false 116 | bus_structure: null 117 | coordinate: [960, 92.0] 118 | rotation: 0 119 | state: true 120 | - name: syncword_hex 121 | id: variable 122 | parameters: 123 | comment: '' 124 | value: '''034776C7272895B0''' 125 | states: 126 | bus_sink: false 127 | bus_source: false 128 | bus_structure: null 129 | coordinate: [960, 20.0] 130 | rotation: 0 131 | state: true 132 | - name: analog_pll_carriertracking_cc_0 133 | id: analog_pll_carriertracking_cc 134 | parameters: 135 | affinity: '' 136 | alias: '' 137 | comment: '' 138 | max_freq: 2 * pi * pll_limit / samp_rate 139 | maxoutbuf: '0' 140 | min_freq: -2 * pi * pll_limit / samp_rate 141 | minoutbuf: '0' 142 | w: 2 * pi * pll_bw / samp_rate 143 | states: 144 | bus_sink: false 145 | bus_source: false 146 | bus_structure: null 147 | coordinate: [1232, 164.0] 148 | rotation: 0 149 | state: enabled 150 | - name: analog_sig_source_x_0 151 | id: analog_sig_source_x 152 | parameters: 153 | affinity: '' 154 | alias: '' 155 | amp: '1' 156 | comment: '' 157 | freq: 555.555e3 158 | maxoutbuf: '0' 159 | minoutbuf: '0' 160 | offset: '0' 161 | phase: '0' 162 | samp_rate: samp_rate 163 | type: complex 164 | waveform: analog.GR_COS_WAVE 165 | states: 166 | bus_sink: false 167 | bus_source: false 168 | bus_structure: null 169 | coordinate: [136, 408.0] 170 | rotation: 0 171 | state: true 172 | - name: blocks_complex_to_arg_0 173 | id: blocks_complex_to_arg 174 | parameters: 175 | affinity: '' 176 | alias: '' 177 | comment: '' 178 | maxoutbuf: '0' 179 | minoutbuf: '0' 180 | vlen: '1' 181 | states: 182 | bus_sink: false 183 | bus_source: false 184 | bus_structure: null 185 | coordinate: [96, 328.0] 186 | rotation: 0 187 | state: enabled 188 | - name: blocks_complex_to_real_0 189 | id: blocks_complex_to_real 190 | parameters: 191 | affinity: '' 192 | alias: '' 193 | comment: '' 194 | maxoutbuf: '0' 195 | minoutbuf: '0' 196 | vlen: '1' 197 | states: 198 | bus_sink: false 199 | bus_source: false 200 | bus_structure: null 201 | coordinate: [696, 588.0] 202 | rotation: 0 203 | state: true 204 | - name: blocks_float_to_complex_0 205 | id: blocks_float_to_complex 206 | parameters: 207 | affinity: '' 208 | alias: '' 209 | comment: '' 210 | maxoutbuf: '0' 211 | minoutbuf: '0' 212 | vlen: '1' 213 | states: 214 | bus_sink: false 215 | bus_source: false 216 | bus_structure: null 217 | coordinate: [368, 196.0] 218 | rotation: 0 219 | state: true 220 | - name: blocks_multiply_conjugate_cc_0 221 | id: blocks_multiply_conjugate_cc 222 | parameters: 223 | affinity: '' 224 | alias: '' 225 | comment: '' 226 | maxoutbuf: '0' 227 | minoutbuf: '0' 228 | vlen: '1' 229 | states: 230 | bus_sink: false 231 | bus_source: false 232 | bus_structure: null 233 | coordinate: [888, 340.0] 234 | rotation: 0 235 | state: true 236 | - name: blocks_throttle_0 237 | id: blocks_throttle 238 | parameters: 239 | affinity: '' 240 | alias: '' 241 | comment: '' 242 | ignoretag: 'True' 243 | maxoutbuf: '0' 244 | minoutbuf: '0' 245 | samples_per_second: samp_rate 246 | type: complex 247 | vlen: '1' 248 | states: 249 | bus_sink: false 250 | bus_source: false 251 | bus_structure: null 252 | coordinate: [672, 188.0] 253 | rotation: 0 254 | state: true 255 | - name: blocks_wavfile_source_0 256 | id: blocks_wavfile_source 257 | parameters: 258 | affinity: '' 259 | alias: '' 260 | comment: '' 261 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 262 | maxoutbuf: '0' 263 | minoutbuf: '0' 264 | nchan: '2' 265 | repeat: 'True' 266 | states: 267 | bus_sink: false 268 | bus_source: false 269 | bus_structure: null 270 | coordinate: [24, 176.0] 271 | rotation: 0 272 | state: true 273 | - name: digital_costas_loop_cc_0 274 | id: digital_costas_loop_cc 275 | parameters: 276 | affinity: '' 277 | alias: '' 278 | comment: '' 279 | maxoutbuf: '0' 280 | minoutbuf: '0' 281 | order: '2' 282 | use_snr: 'False' 283 | w: '0.001' 284 | states: 285 | bus_sink: false 286 | bus_source: false 287 | bus_structure: null 288 | coordinate: [152, 620.0] 289 | rotation: 0 290 | state: true 291 | - name: digital_symbol_sync_xx_0 292 | id: digital_symbol_sync_xx 293 | parameters: 294 | affinity: '' 295 | alias: '' 296 | comment: '' 297 | constellation: digital.constellation_bpsk().base() 298 | damping: '1.0' 299 | loop_bw: '0.001' 300 | max_dev: '0.001' 301 | maxoutbuf: '0' 302 | minoutbuf: '0' 303 | nfilters: '128' 304 | osps: '1' 305 | pfb_mf_taps: '[]' 306 | resamp_type: digital.IR_MMSE_8TAP 307 | sps: sps 308 | ted_gain: '1.0' 309 | ted_type: digital.TED_GARDNER 310 | type: cc 311 | states: 312 | bus_sink: false 313 | bus_source: false 314 | bus_structure: null 315 | coordinate: [1440, 352.0] 316 | rotation: 0 317 | state: true 318 | - name: fir_filter_xxx_0 319 | id: fir_filter_xxx 320 | parameters: 321 | affinity: '' 322 | alias: '' 323 | comment: '' 324 | decim: '1' 325 | maxoutbuf: '0' 326 | minoutbuf: '0' 327 | samp_delay: '0' 328 | taps: np.ones(int(sps))/int(sps) / 1.57 329 | type: ccc 330 | states: 331 | bus_sink: false 332 | bus_source: false 333 | bus_structure: null 334 | coordinate: [1072, 336.0] 335 | rotation: 0 336 | state: true 337 | - name: fir_filter_xxx_1 338 | id: fir_filter_xxx 339 | parameters: 340 | affinity: '' 341 | alias: '' 342 | comment: '' 343 | decim: '1' 344 | maxoutbuf: '0' 345 | minoutbuf: '0' 346 | samp_delay: '0' 347 | taps: syncword[::-1]/syncword.size 348 | type: fff 349 | states: 350 | bus_sink: false 351 | bus_source: false 352 | bus_structure: null 353 | coordinate: [968, 688.0] 354 | rotation: 0 355 | state: true 356 | - name: hilbert_fc_0 357 | id: hilbert_fc 358 | parameters: 359 | affinity: '' 360 | alias: '' 361 | beta: '6.76' 362 | comment: '' 363 | maxoutbuf: '0' 364 | minoutbuf: '0' 365 | num_taps: '65' 366 | win: window.WIN_HAMMING 367 | states: 368 | bus_sink: false 369 | bus_source: false 370 | bus_structure: null 371 | coordinate: [488, 348.0] 372 | rotation: 0 373 | state: true 374 | - name: import_0 375 | id: import 376 | parameters: 377 | alias: '' 378 | comment: '' 379 | imports: from math import pi 380 | states: 381 | bus_sink: false 382 | bus_source: false 383 | bus_structure: null 384 | coordinate: [192, 84.0] 385 | rotation: 0 386 | state: true 387 | - name: import_1 388 | id: import 389 | parameters: 390 | alias: '' 391 | comment: '' 392 | imports: import numpy as np 393 | states: 394 | bus_sink: false 395 | bus_source: false 396 | bus_structure: null 397 | coordinate: [464, 12.0] 398 | rotation: 0 399 | state: true 400 | - name: qtgui_const_sink_x_0 401 | id: qtgui_const_sink_x 402 | parameters: 403 | affinity: '' 404 | alias: '' 405 | alpha1: '1.0' 406 | alpha10: '1.0' 407 | alpha2: '1.0' 408 | alpha3: '1.0' 409 | alpha4: '1.0' 410 | alpha5: '1.0' 411 | alpha6: '1.0' 412 | alpha7: '1.0' 413 | alpha8: '1.0' 414 | alpha9: '1.0' 415 | autoscale: 'False' 416 | axislabels: 'True' 417 | color1: '"blue"' 418 | color10: '"red"' 419 | color2: '"red"' 420 | color3: '"red"' 421 | color4: '"red"' 422 | color5: '"red"' 423 | color6: '"red"' 424 | color7: '"red"' 425 | color8: '"red"' 426 | color9: '"red"' 427 | comment: '' 428 | grid: 'False' 429 | gui_hint: '' 430 | label1: '' 431 | label10: '' 432 | label2: '' 433 | label3: '' 434 | label4: '' 435 | label5: '' 436 | label6: '' 437 | label7: '' 438 | label8: '' 439 | label9: '' 440 | legend: 'True' 441 | marker1: '0' 442 | marker10: '0' 443 | marker2: '0' 444 | marker3: '0' 445 | marker4: '0' 446 | marker5: '0' 447 | marker6: '0' 448 | marker7: '0' 449 | marker8: '0' 450 | marker9: '0' 451 | name: '""' 452 | nconnections: '1' 453 | size: '1024' 454 | style1: '0' 455 | style10: '0' 456 | style2: '0' 457 | style3: '0' 458 | style4: '0' 459 | style5: '0' 460 | style6: '0' 461 | style7: '0' 462 | style8: '0' 463 | style9: '0' 464 | tr_chan: '0' 465 | tr_level: '0.0' 466 | tr_mode: qtgui.TRIG_MODE_FREE 467 | tr_slope: qtgui.TRIG_SLOPE_POS 468 | tr_tag: '""' 469 | type: complex 470 | update_time: '0.10' 471 | width1: '1' 472 | width10: '1' 473 | width2: '1' 474 | width3: '1' 475 | width4: '1' 476 | width5: '1' 477 | width6: '1' 478 | width7: '1' 479 | width8: '1' 480 | width9: '1' 481 | xmax: '2' 482 | xmin: '-2' 483 | ymax: '2' 484 | ymin: '-2' 485 | states: 486 | bus_sink: false 487 | bus_source: false 488 | bus_structure: null 489 | coordinate: [600, 704.0] 490 | rotation: 0 491 | state: true 492 | - name: qtgui_time_sink_x_0 493 | id: qtgui_time_sink_x 494 | parameters: 495 | affinity: '' 496 | alias: '' 497 | alpha1: '1.0' 498 | alpha10: '1.0' 499 | alpha2: '1.0' 500 | alpha3: '1.0' 501 | alpha4: '1.0' 502 | alpha5: '1.0' 503 | alpha6: '1.0' 504 | alpha7: '1.0' 505 | alpha8: '1.0' 506 | alpha9: '1.0' 507 | autoscale: 'False' 508 | axislabels: 'True' 509 | color1: blue 510 | color10: dark blue 511 | color2: red 512 | color3: green 513 | color4: black 514 | color5: cyan 515 | color6: magenta 516 | color7: yellow 517 | color8: dark red 518 | color9: dark green 519 | comment: '' 520 | ctrlpanel: 'False' 521 | entags: 'True' 522 | grid: 'False' 523 | gui_hint: '' 524 | label1: Signal 1 525 | label10: Signal 10 526 | label2: Signal 2 527 | label3: Signal 3 528 | label4: Signal 4 529 | label5: Signal 5 530 | label6: Signal 6 531 | label7: Signal 7 532 | label8: Signal 8 533 | label9: Signal 9 534 | legend: 'True' 535 | marker1: '0' 536 | marker10: '-1' 537 | marker2: '-1' 538 | marker3: '-1' 539 | marker4: '-1' 540 | marker5: '-1' 541 | marker6: '-1' 542 | marker7: '-1' 543 | marker8: '-1' 544 | marker9: '-1' 545 | name: '""' 546 | nconnections: '2' 547 | size: '100000' 548 | srate: symbol_rate 549 | stemplot: 'False' 550 | style1: '0' 551 | style10: '1' 552 | style2: '1' 553 | style3: '1' 554 | style4: '1' 555 | style5: '1' 556 | style6: '1' 557 | style7: '1' 558 | style8: '1' 559 | style9: '1' 560 | tr_chan: '1' 561 | tr_delay: 1e-4 562 | tr_level: '-0.8' 563 | tr_mode: qtgui.TRIG_MODE_NORM 564 | tr_slope: qtgui.TRIG_SLOPE_POS 565 | tr_tag: '""' 566 | type: float 567 | update_time: '0.10' 568 | width1: '1' 569 | width10: '1' 570 | width2: '1' 571 | width3: '1' 572 | width4: '1' 573 | width5: '1' 574 | width6: '1' 575 | width7: '1' 576 | width8: '1' 577 | width9: '1' 578 | ylabel: Amplitude 579 | ymax: '3' 580 | ymin: '-3' 581 | yunit: '""' 582 | states: 583 | bus_sink: false 584 | bus_source: false 585 | bus_structure: null 586 | coordinate: [1288, 596.0] 587 | rotation: 0 588 | state: true 589 | - name: satellites_rms_agc_0 590 | id: satellites_rms_agc 591 | parameters: 592 | affinity: '' 593 | alias: '' 594 | alpha: 1e-4 595 | comment: '' 596 | maxoutbuf: '0' 597 | minoutbuf: '0' 598 | reference: '1.0' 599 | states: 600 | bus_sink: false 601 | bus_source: false 602 | bus_structure: null 603 | coordinate: [952, 176.0] 604 | rotation: 0 605 | state: enabled 606 | 607 | connections: 608 | - [analog_pll_carriertracking_cc_0, '0', blocks_complex_to_arg_0, '0'] 609 | - [analog_sig_source_x_0, '0', blocks_multiply_conjugate_cc_0, '1'] 610 | - [blocks_complex_to_arg_0, '0', hilbert_fc_0, '0'] 611 | - [blocks_complex_to_real_0, '0', fir_filter_xxx_1, '0'] 612 | - [blocks_complex_to_real_0, '0', qtgui_time_sink_x_0, '0'] 613 | - [blocks_float_to_complex_0, '0', blocks_throttle_0, '0'] 614 | - [blocks_multiply_conjugate_cc_0, '0', fir_filter_xxx_0, '0'] 615 | - [blocks_throttle_0, '0', satellites_rms_agc_0, '0'] 616 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 617 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 618 | - [digital_costas_loop_cc_0, '0', blocks_complex_to_real_0, '0'] 619 | - [digital_costas_loop_cc_0, '0', qtgui_const_sink_x_0, '0'] 620 | - [digital_symbol_sync_xx_0, '0', digital_costas_loop_cc_0, '0'] 621 | - [fir_filter_xxx_0, '0', digital_symbol_sync_xx_0, '0'] 622 | - [fir_filter_xxx_1, '0', qtgui_time_sink_x_0, '1'] 623 | - [hilbert_fc_0, '0', blocks_multiply_conjugate_cc_0, '0'] 624 | - [satellites_rms_agc_0, '0', analog_pll_carriertracking_cc_0, '0'] 625 | 626 | metadata: 627 | file_format: 1 628 | grc_version: v3.10.1.1-58-g637fcda4 629 | -------------------------------------------------------------------------------- /handson_08_framesize.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_08_framesize 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: finding the codeword size' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: access_code 37 | id: variable 38 | parameters: 39 | comment: '' 40 | value: '''''.join([str(i) for i in (syncword+1)//2])' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [1224, 92.0] 46 | rotation: 0 47 | state: true 48 | - name: pll_bw 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: '100' 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [352, 12.0] 58 | rotation: 0 59 | state: true 60 | - name: pll_limit 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: 10e3 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [352, 84.0] 70 | rotation: 0 71 | state: true 72 | - name: samp_rate 73 | id: variable 74 | parameters: 75 | comment: '' 76 | value: '2016129' 77 | states: 78 | bus_sink: false 79 | bus_source: false 80 | bus_structure: null 81 | coordinate: [192, 12.0] 82 | rotation: 0 83 | state: enabled 84 | - name: sps 85 | id: variable 86 | parameters: 87 | comment: '' 88 | value: samp_rate/symbol_rate 89 | states: 90 | bus_sink: false 91 | bus_source: false 92 | bus_structure: null 93 | coordinate: [560, 84.0] 94 | rotation: 0 95 | state: true 96 | - name: symbol_rate 97 | id: variable 98 | parameters: 99 | comment: '' 100 | value: '555555' 101 | states: 102 | bus_sink: false 103 | bus_source: false 104 | bus_structure: null 105 | coordinate: [560, 12.0] 106 | rotation: 0 107 | state: true 108 | - name: syncword 109 | id: variable 110 | parameters: 111 | comment: '' 112 | value: 2*np.unpackbits(np.frombuffer(bytes.fromhex(syncword_hex), dtype = 'uint8')).astype('int')-1 113 | states: 114 | bus_sink: false 115 | bus_source: false 116 | bus_structure: null 117 | coordinate: [960, 92.0] 118 | rotation: 0 119 | state: true 120 | - name: syncword_hex 121 | id: variable 122 | parameters: 123 | comment: '' 124 | value: '''034776C7272895B0''' 125 | states: 126 | bus_sink: false 127 | bus_source: false 128 | bus_structure: null 129 | coordinate: [960, 20.0] 130 | rotation: 0 131 | state: true 132 | - name: analog_pll_carriertracking_cc_0 133 | id: analog_pll_carriertracking_cc 134 | parameters: 135 | affinity: '' 136 | alias: '' 137 | comment: '' 138 | max_freq: 2 * pi * pll_limit / samp_rate 139 | maxoutbuf: '0' 140 | min_freq: -2 * pi * pll_limit / samp_rate 141 | minoutbuf: '0' 142 | w: 2 * pi * pll_bw / samp_rate 143 | states: 144 | bus_sink: false 145 | bus_source: false 146 | bus_structure: null 147 | coordinate: [1272, 164.0] 148 | rotation: 0 149 | state: enabled 150 | - name: analog_sig_source_x_0 151 | id: analog_sig_source_x 152 | parameters: 153 | affinity: '' 154 | alias: '' 155 | amp: '1' 156 | comment: '' 157 | freq: 555.555e3 158 | maxoutbuf: '0' 159 | minoutbuf: '0' 160 | offset: '0' 161 | phase: '0' 162 | samp_rate: samp_rate 163 | type: complex 164 | waveform: analog.GR_COS_WAVE 165 | states: 166 | bus_sink: false 167 | bus_source: false 168 | bus_structure: null 169 | coordinate: [120, 384.0] 170 | rotation: 0 171 | state: true 172 | - name: blocks_complex_to_arg_0 173 | id: blocks_complex_to_arg 174 | parameters: 175 | affinity: '' 176 | alias: '' 177 | comment: '' 178 | maxoutbuf: '0' 179 | minoutbuf: '0' 180 | vlen: '1' 181 | states: 182 | bus_sink: false 183 | bus_source: false 184 | bus_structure: null 185 | coordinate: [40, 316.0] 186 | rotation: 0 187 | state: enabled 188 | - name: blocks_complex_to_real_0 189 | id: blocks_complex_to_real 190 | parameters: 191 | affinity: '' 192 | alias: '' 193 | comment: '' 194 | maxoutbuf: '0' 195 | minoutbuf: '0' 196 | vlen: '1' 197 | states: 198 | bus_sink: false 199 | bus_source: false 200 | bus_structure: null 201 | coordinate: [608, 716.0] 202 | rotation: 0 203 | state: true 204 | - name: blocks_float_to_complex_0 205 | id: blocks_float_to_complex 206 | parameters: 207 | affinity: '' 208 | alias: '' 209 | comment: '' 210 | maxoutbuf: '0' 211 | minoutbuf: '0' 212 | vlen: '1' 213 | states: 214 | bus_sink: false 215 | bus_source: false 216 | bus_structure: null 217 | coordinate: [384, 196.0] 218 | rotation: 0 219 | state: true 220 | - name: blocks_multiply_conjugate_cc_0 221 | id: blocks_multiply_conjugate_cc 222 | parameters: 223 | affinity: '' 224 | alias: '' 225 | comment: '' 226 | maxoutbuf: '0' 227 | minoutbuf: '0' 228 | vlen: '1' 229 | states: 230 | bus_sink: false 231 | bus_source: false 232 | bus_structure: null 233 | coordinate: [576, 332.0] 234 | rotation: 0 235 | state: true 236 | - name: blocks_multiply_const_vxx_0 237 | id: blocks_multiply_const_vxx 238 | parameters: 239 | affinity: '' 240 | alias: '' 241 | comment: '' 242 | const: '-1' 243 | maxoutbuf: '0' 244 | minoutbuf: '0' 245 | type: float 246 | vlen: '1' 247 | states: 248 | bus_sink: false 249 | bus_source: false 250 | bus_structure: null 251 | coordinate: [1136, 892.0] 252 | rotation: 0 253 | state: true 254 | - name: blocks_tag_debug_0 255 | id: blocks_tag_debug 256 | parameters: 257 | affinity: '' 258 | alias: '' 259 | comment: '' 260 | display: 'True' 261 | filter: '"syncword"' 262 | name: '' 263 | num_inputs: '2' 264 | type: float 265 | vlen: '1' 266 | states: 267 | bus_sink: false 268 | bus_source: false 269 | bus_structure: null 270 | coordinate: [2000, 716.0] 271 | rotation: 0 272 | state: true 273 | - name: blocks_throttle_0 274 | id: blocks_throttle 275 | parameters: 276 | affinity: '' 277 | alias: '' 278 | comment: '' 279 | ignoretag: 'True' 280 | maxoutbuf: '0' 281 | minoutbuf: '0' 282 | samples_per_second: samp_rate 283 | type: complex 284 | vlen: '1' 285 | states: 286 | bus_sink: false 287 | bus_source: false 288 | bus_structure: null 289 | coordinate: [704, 188.0] 290 | rotation: 0 291 | state: true 292 | - name: blocks_wavfile_source_0 293 | id: blocks_wavfile_source 294 | parameters: 295 | affinity: '' 296 | alias: '' 297 | comment: '' 298 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 299 | maxoutbuf: '0' 300 | minoutbuf: '0' 301 | nchan: '2' 302 | repeat: 'True' 303 | states: 304 | bus_sink: false 305 | bus_source: false 306 | bus_structure: null 307 | coordinate: [24, 176.0] 308 | rotation: 0 309 | state: true 310 | - name: digital_correlate_access_code_tag_xx_0 311 | id: digital_correlate_access_code_tag_xx 312 | parameters: 313 | access_code: access_code 314 | affinity: '' 315 | alias: '' 316 | comment: '' 317 | maxoutbuf: '0' 318 | minoutbuf: '0' 319 | tagname: syncword 320 | threshold: '4' 321 | type: float 322 | states: 323 | bus_sink: false 324 | bus_source: false 325 | bus_structure: null 326 | coordinate: [1624, 532.0] 327 | rotation: 0 328 | state: true 329 | - name: digital_correlate_access_code_tag_xx_0_0 330 | id: digital_correlate_access_code_tag_xx 331 | parameters: 332 | access_code: access_code 333 | affinity: '' 334 | alias: '' 335 | comment: '' 336 | maxoutbuf: '0' 337 | minoutbuf: '0' 338 | tagname: syncword 339 | threshold: '4' 340 | type: float 341 | states: 342 | bus_sink: false 343 | bus_source: false 344 | bus_structure: null 345 | coordinate: [1640, 836.0] 346 | rotation: 0 347 | state: true 348 | - name: digital_costas_loop_cc_0 349 | id: digital_costas_loop_cc 350 | parameters: 351 | affinity: '' 352 | alias: '' 353 | comment: '' 354 | maxoutbuf: '0' 355 | minoutbuf: '0' 356 | order: '2' 357 | use_snr: 'False' 358 | w: '0.001' 359 | states: 360 | bus_sink: false 361 | bus_source: false 362 | bus_structure: null 363 | coordinate: [160, 604.0] 364 | rotation: 0 365 | state: true 366 | - name: digital_symbol_sync_xx_0 367 | id: digital_symbol_sync_xx 368 | parameters: 369 | affinity: '' 370 | alias: '' 371 | comment: '' 372 | constellation: digital.constellation_bpsk().base() 373 | damping: '1.0' 374 | loop_bw: '0.001' 375 | max_dev: '0.001' 376 | maxoutbuf: '0' 377 | minoutbuf: '0' 378 | nfilters: '128' 379 | osps: '1' 380 | pfb_mf_taps: '[]' 381 | resamp_type: digital.IR_MMSE_8TAP 382 | sps: sps 383 | ted_gain: '1.0' 384 | ted_type: digital.TED_GARDNER 385 | type: cc 386 | states: 387 | bus_sink: false 388 | bus_source: false 389 | bus_structure: null 390 | coordinate: [1320, 288.0] 391 | rotation: 0 392 | state: true 393 | - name: fir_filter_xxx_0 394 | id: fir_filter_xxx 395 | parameters: 396 | affinity: '' 397 | alias: '' 398 | comment: '' 399 | decim: '1' 400 | maxoutbuf: '0' 401 | minoutbuf: '0' 402 | samp_delay: '0' 403 | taps: np.ones(int(sps))/int(sps) / 1.57 404 | type: ccc 405 | states: 406 | bus_sink: false 407 | bus_source: false 408 | bus_structure: null 409 | coordinate: [904, 312.0] 410 | rotation: 0 411 | state: true 412 | - name: fir_filter_xxx_1 413 | id: fir_filter_xxx 414 | parameters: 415 | affinity: '' 416 | alias: '' 417 | comment: '' 418 | decim: '1' 419 | maxoutbuf: '0' 420 | minoutbuf: '0' 421 | samp_delay: '0' 422 | taps: syncword[::-1]/syncword.size 423 | type: fff 424 | states: 425 | bus_sink: false 426 | bus_source: false 427 | bus_structure: null 428 | coordinate: [1016, 744.0] 429 | rotation: 0 430 | state: true 431 | - name: hilbert_fc_0 432 | id: hilbert_fc 433 | parameters: 434 | affinity: '' 435 | alias: '' 436 | beta: '6.76' 437 | comment: '' 438 | maxoutbuf: '0' 439 | minoutbuf: '0' 440 | num_taps: '65' 441 | win: window.WIN_HAMMING 442 | states: 443 | bus_sink: false 444 | bus_source: false 445 | bus_structure: null 446 | coordinate: [368, 308.0] 447 | rotation: 0 448 | state: true 449 | - name: import_0 450 | id: import 451 | parameters: 452 | alias: '' 453 | comment: '' 454 | imports: from math import pi 455 | states: 456 | bus_sink: false 457 | bus_source: false 458 | bus_structure: null 459 | coordinate: [192, 84.0] 460 | rotation: 0 461 | state: true 462 | - name: import_1 463 | id: import 464 | parameters: 465 | alias: '' 466 | comment: '' 467 | imports: import numpy as np 468 | states: 469 | bus_sink: false 470 | bus_source: false 471 | bus_structure: null 472 | coordinate: [464, 12.0] 473 | rotation: 0 474 | state: true 475 | - name: qtgui_const_sink_x_0 476 | id: qtgui_const_sink_x 477 | parameters: 478 | affinity: '' 479 | alias: '' 480 | alpha1: '1.0' 481 | alpha10: '1.0' 482 | alpha2: '1.0' 483 | alpha3: '1.0' 484 | alpha4: '1.0' 485 | alpha5: '1.0' 486 | alpha6: '1.0' 487 | alpha7: '1.0' 488 | alpha8: '1.0' 489 | alpha9: '1.0' 490 | autoscale: 'False' 491 | axislabels: 'True' 492 | color1: '"blue"' 493 | color10: '"red"' 494 | color2: '"red"' 495 | color3: '"red"' 496 | color4: '"red"' 497 | color5: '"red"' 498 | color6: '"red"' 499 | color7: '"red"' 500 | color8: '"red"' 501 | color9: '"red"' 502 | comment: '' 503 | grid: 'False' 504 | gui_hint: '' 505 | label1: '' 506 | label10: '' 507 | label2: '' 508 | label3: '' 509 | label4: '' 510 | label5: '' 511 | label6: '' 512 | label7: '' 513 | label8: '' 514 | label9: '' 515 | legend: 'True' 516 | marker1: '0' 517 | marker10: '0' 518 | marker2: '0' 519 | marker3: '0' 520 | marker4: '0' 521 | marker5: '0' 522 | marker6: '0' 523 | marker7: '0' 524 | marker8: '0' 525 | marker9: '0' 526 | name: '""' 527 | nconnections: '1' 528 | size: '1024' 529 | style1: '0' 530 | style10: '0' 531 | style2: '0' 532 | style3: '0' 533 | style4: '0' 534 | style5: '0' 535 | style6: '0' 536 | style7: '0' 537 | style8: '0' 538 | style9: '0' 539 | tr_chan: '0' 540 | tr_level: '0.0' 541 | tr_mode: qtgui.TRIG_MODE_FREE 542 | tr_slope: qtgui.TRIG_SLOPE_POS 543 | tr_tag: '""' 544 | type: complex 545 | update_time: '0.10' 546 | width1: '1' 547 | width10: '1' 548 | width2: '1' 549 | width3: '1' 550 | width4: '1' 551 | width5: '1' 552 | width6: '1' 553 | width7: '1' 554 | width8: '1' 555 | width9: '1' 556 | xmax: '2' 557 | xmin: '-2' 558 | ymax: '2' 559 | ymin: '-2' 560 | states: 561 | bus_sink: false 562 | bus_source: false 563 | bus_structure: null 564 | coordinate: [600, 584.0] 565 | rotation: 0 566 | state: true 567 | - name: qtgui_time_sink_x_0 568 | id: qtgui_time_sink_x 569 | parameters: 570 | affinity: '' 571 | alias: '' 572 | alpha1: '1.0' 573 | alpha10: '1.0' 574 | alpha2: '1.0' 575 | alpha3: '1.0' 576 | alpha4: '1.0' 577 | alpha5: '1.0' 578 | alpha6: '1.0' 579 | alpha7: '1.0' 580 | alpha8: '1.0' 581 | alpha9: '1.0' 582 | autoscale: 'False' 583 | axislabels: 'True' 584 | color1: blue 585 | color10: dark blue 586 | color2: red 587 | color3: green 588 | color4: black 589 | color5: cyan 590 | color6: magenta 591 | color7: yellow 592 | color8: dark red 593 | color9: dark green 594 | comment: '' 595 | ctrlpanel: 'False' 596 | entags: 'True' 597 | grid: 'False' 598 | gui_hint: '' 599 | label1: Signal 1 600 | label10: Signal 10 601 | label2: Signal 2 602 | label3: Signal 3 603 | label4: Signal 4 604 | label5: Signal 5 605 | label6: Signal 6 606 | label7: Signal 7 607 | label8: Signal 8 608 | label9: Signal 9 609 | legend: 'True' 610 | marker1: '0' 611 | marker10: '-1' 612 | marker2: '-1' 613 | marker3: '-1' 614 | marker4: '-1' 615 | marker5: '-1' 616 | marker6: '-1' 617 | marker7: '-1' 618 | marker8: '-1' 619 | marker9: '-1' 620 | name: '""' 621 | nconnections: '2' 622 | size: '100000' 623 | srate: symbol_rate 624 | stemplot: 'False' 625 | style1: '0' 626 | style10: '1' 627 | style2: '1' 628 | style3: '1' 629 | style4: '1' 630 | style5: '1' 631 | style6: '1' 632 | style7: '1' 633 | style8: '1' 634 | style9: '1' 635 | tr_chan: '1' 636 | tr_delay: 1e-4 637 | tr_level: '-0.8' 638 | tr_mode: qtgui.TRIG_MODE_NORM 639 | tr_slope: qtgui.TRIG_SLOPE_POS 640 | tr_tag: '""' 641 | type: float 642 | update_time: '0.10' 643 | width1: '1' 644 | width10: '1' 645 | width2: '1' 646 | width3: '1' 647 | width4: '1' 648 | width5: '1' 649 | width6: '1' 650 | width7: '1' 651 | width8: '1' 652 | width9: '1' 653 | ylabel: Amplitude 654 | ymax: '3' 655 | ymin: '-3' 656 | yunit: '""' 657 | states: 658 | bus_sink: false 659 | bus_source: false 660 | bus_structure: null 661 | coordinate: [1376, 644.0] 662 | rotation: 0 663 | state: true 664 | - name: satellites_rms_agc_0 665 | id: satellites_rms_agc 666 | parameters: 667 | affinity: '' 668 | alias: '' 669 | alpha: 1e-4 670 | comment: '' 671 | maxoutbuf: '0' 672 | minoutbuf: '0' 673 | reference: '1.0' 674 | states: 675 | bus_sink: false 676 | bus_source: false 677 | bus_structure: null 678 | coordinate: [984, 176.0] 679 | rotation: 0 680 | state: enabled 681 | 682 | connections: 683 | - [analog_pll_carriertracking_cc_0, '0', blocks_complex_to_arg_0, '0'] 684 | - [analog_sig_source_x_0, '0', blocks_multiply_conjugate_cc_0, '1'] 685 | - [blocks_complex_to_arg_0, '0', hilbert_fc_0, '0'] 686 | - [blocks_complex_to_real_0, '0', blocks_multiply_const_vxx_0, '0'] 687 | - [blocks_complex_to_real_0, '0', digital_correlate_access_code_tag_xx_0, '0'] 688 | - [blocks_complex_to_real_0, '0', fir_filter_xxx_1, '0'] 689 | - [blocks_complex_to_real_0, '0', qtgui_time_sink_x_0, '0'] 690 | - [blocks_float_to_complex_0, '0', blocks_throttle_0, '0'] 691 | - [blocks_multiply_conjugate_cc_0, '0', fir_filter_xxx_0, '0'] 692 | - [blocks_multiply_const_vxx_0, '0', digital_correlate_access_code_tag_xx_0_0, '0'] 693 | - [blocks_throttle_0, '0', satellites_rms_agc_0, '0'] 694 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 695 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 696 | - [digital_correlate_access_code_tag_xx_0, '0', blocks_tag_debug_0, '0'] 697 | - [digital_correlate_access_code_tag_xx_0_0, '0', blocks_tag_debug_0, '1'] 698 | - [digital_costas_loop_cc_0, '0', blocks_complex_to_real_0, '0'] 699 | - [digital_costas_loop_cc_0, '0', qtgui_const_sink_x_0, '0'] 700 | - [digital_symbol_sync_xx_0, '0', digital_costas_loop_cc_0, '0'] 701 | - [fir_filter_xxx_0, '0', digital_symbol_sync_xx_0, '0'] 702 | - [fir_filter_xxx_1, '0', qtgui_time_sink_x_0, '1'] 703 | - [hilbert_fc_0, '0', blocks_multiply_conjugate_cc_0, '0'] 704 | - [satellites_rms_agc_0, '0', analog_pll_carriertracking_cc_0, '0'] 705 | 706 | metadata: 707 | file_format: 1 708 | grc_version: v3.10.1.1-58-g637fcda4 709 | -------------------------------------------------------------------------------- /handson_09_turbo_decode.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: Daniel Estevez 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: handson_09_turbo_decode 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: 'GRCon20 workshop hands-on: Turbo decoding' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: access_code 37 | id: variable 38 | parameters: 39 | comment: '' 40 | value: '''''.join([str(i) for i in (syncword+1)//2])' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [1232, 92.0] 46 | rotation: 0 47 | state: true 48 | - name: pll_bw 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: '100' 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [352, 12.0] 58 | rotation: 0 59 | state: true 60 | - name: pll_limit 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: 10e3 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [352, 84.0] 70 | rotation: 0 71 | state: true 72 | - name: samp_rate 73 | id: variable 74 | parameters: 75 | comment: '' 76 | value: '2016129' 77 | states: 78 | bus_sink: false 79 | bus_source: false 80 | bus_structure: null 81 | coordinate: [192, 12.0] 82 | rotation: 0 83 | state: enabled 84 | - name: sps 85 | id: variable 86 | parameters: 87 | comment: '' 88 | value: samp_rate/symbol_rate 89 | states: 90 | bus_sink: false 91 | bus_source: false 92 | bus_structure: null 93 | coordinate: [560, 84.0] 94 | rotation: 0 95 | state: true 96 | - name: symbol_rate 97 | id: variable 98 | parameters: 99 | comment: '' 100 | value: '555555' 101 | states: 102 | bus_sink: false 103 | bus_source: false 104 | bus_structure: null 105 | coordinate: [560, 12.0] 106 | rotation: 0 107 | state: true 108 | - name: syncword 109 | id: variable 110 | parameters: 111 | comment: '' 112 | value: 2*np.unpackbits(np.frombuffer(bytes.fromhex(syncword_hex), dtype = 'uint8')).astype('int')-1 113 | states: 114 | bus_sink: false 115 | bus_source: false 116 | bus_structure: null 117 | coordinate: [960, 92.0] 118 | rotation: 0 119 | state: true 120 | - name: syncword_hex 121 | id: variable 122 | parameters: 123 | comment: '' 124 | value: '''034776C7272895B0''' 125 | states: 126 | bus_sink: false 127 | bus_source: false 128 | bus_structure: null 129 | coordinate: [960, 20.0] 130 | rotation: 0 131 | state: true 132 | - name: analog_pll_carriertracking_cc_0 133 | id: analog_pll_carriertracking_cc 134 | parameters: 135 | affinity: '' 136 | alias: '' 137 | comment: '' 138 | max_freq: 2 * pi * pll_limit / samp_rate 139 | maxoutbuf: '0' 140 | min_freq: -2 * pi * pll_limit / samp_rate 141 | minoutbuf: '0' 142 | w: 2 * pi * pll_bw / samp_rate 143 | states: 144 | bus_sink: false 145 | bus_source: false 146 | bus_structure: null 147 | coordinate: [1008, 164.0] 148 | rotation: 0 149 | state: enabled 150 | - name: analog_sig_source_x_0 151 | id: analog_sig_source_x 152 | parameters: 153 | affinity: '' 154 | alias: '' 155 | amp: '1' 156 | comment: '' 157 | freq: 555.555e3 158 | maxoutbuf: '0' 159 | minoutbuf: '0' 160 | offset: '0' 161 | phase: '0' 162 | samp_rate: samp_rate 163 | type: complex 164 | waveform: analog.GR_COS_WAVE 165 | states: 166 | bus_sink: false 167 | bus_source: false 168 | bus_structure: null 169 | coordinate: [248, 416.0] 170 | rotation: 0 171 | state: true 172 | - name: blocks_complex_to_arg_0 173 | id: blocks_complex_to_arg 174 | parameters: 175 | affinity: '' 176 | alias: '' 177 | comment: '' 178 | maxoutbuf: '0' 179 | minoutbuf: '0' 180 | vlen: '1' 181 | states: 182 | bus_sink: false 183 | bus_source: false 184 | bus_structure: null 185 | coordinate: [96, 328.0] 186 | rotation: 0 187 | state: enabled 188 | - name: blocks_complex_to_real_0 189 | id: blocks_complex_to_real 190 | parameters: 191 | affinity: '' 192 | alias: '' 193 | comment: '' 194 | maxoutbuf: '0' 195 | minoutbuf: '0' 196 | vlen: '1' 197 | states: 198 | bus_sink: false 199 | bus_source: false 200 | bus_structure: null 201 | coordinate: [624, 572.0] 202 | rotation: 0 203 | state: true 204 | - name: blocks_file_sink_0 205 | id: blocks_file_sink 206 | parameters: 207 | affinity: '' 208 | alias: '' 209 | append: 'False' 210 | comment: '' 211 | file: frames.u8 212 | type: byte 213 | unbuffered: 'False' 214 | vlen: '1' 215 | states: 216 | bus_sink: false 217 | bus_source: false 218 | bus_structure: null 219 | coordinate: [1712, 972.0] 220 | rotation: 0 221 | state: true 222 | - name: blocks_float_to_complex_0 223 | id: blocks_float_to_complex 224 | parameters: 225 | affinity: '' 226 | alias: '' 227 | comment: '' 228 | maxoutbuf: '0' 229 | minoutbuf: '0' 230 | vlen: '1' 231 | states: 232 | bus_sink: false 233 | bus_source: false 234 | bus_structure: null 235 | coordinate: [384, 196.0] 236 | rotation: 0 237 | state: true 238 | - name: blocks_multiply_conjugate_cc_0 239 | id: blocks_multiply_conjugate_cc 240 | parameters: 241 | affinity: '' 242 | alias: '' 243 | comment: '' 244 | maxoutbuf: '0' 245 | minoutbuf: '0' 246 | vlen: '1' 247 | states: 248 | bus_sink: false 249 | bus_source: false 250 | bus_structure: null 251 | coordinate: [704, 356.0] 252 | rotation: 0 253 | state: true 254 | - name: blocks_multiply_const_vxx_0 255 | id: blocks_multiply_const_vxx 256 | parameters: 257 | affinity: '' 258 | alias: '' 259 | comment: '' 260 | const: '-1' 261 | maxoutbuf: '0' 262 | minoutbuf: '0' 263 | type: float 264 | vlen: '1' 265 | states: 266 | bus_sink: false 267 | bus_source: false 268 | bus_structure: null 269 | coordinate: [96, 900.0] 270 | rotation: 0 271 | state: true 272 | - name: blocks_wavfile_source_0 273 | id: blocks_wavfile_source 274 | parameters: 275 | affinity: '' 276 | alias: '' 277 | comment: '' 278 | file: recordings/solarorbiter-8427070000Hz_20200213_164325.wav 279 | maxoutbuf: '0' 280 | minoutbuf: '0' 281 | nchan: '2' 282 | repeat: 'False' 283 | states: 284 | bus_sink: false 285 | bus_source: false 286 | bus_structure: null 287 | coordinate: [24, 176.0] 288 | rotation: 0 289 | state: true 290 | - name: digital_correlate_access_code_tag_xx_0 291 | id: digital_correlate_access_code_tag_xx 292 | parameters: 293 | access_code: access_code 294 | affinity: '' 295 | alias: '' 296 | comment: '' 297 | maxoutbuf: '0' 298 | minoutbuf: '0' 299 | tagname: syncword 300 | threshold: '4' 301 | type: float 302 | states: 303 | bus_sink: false 304 | bus_source: false 305 | bus_structure: null 306 | coordinate: [960, 628.0] 307 | rotation: 0 308 | state: true 309 | - name: digital_correlate_access_code_tag_xx_0_0 310 | id: digital_correlate_access_code_tag_xx 311 | parameters: 312 | access_code: access_code 313 | affinity: '' 314 | alias: '' 315 | comment: '' 316 | maxoutbuf: '0' 317 | minoutbuf: '0' 318 | tagname: syncword 319 | threshold: '4' 320 | type: float 321 | states: 322 | bus_sink: false 323 | bus_source: false 324 | bus_structure: null 325 | coordinate: [472, 876.0] 326 | rotation: 0 327 | state: true 328 | - name: digital_costas_loop_cc_0 329 | id: digital_costas_loop_cc 330 | parameters: 331 | affinity: '' 332 | alias: '' 333 | comment: '' 334 | maxoutbuf: '0' 335 | minoutbuf: '0' 336 | order: '2' 337 | use_snr: 'False' 338 | w: '0.001' 339 | states: 340 | bus_sink: false 341 | bus_source: false 342 | bus_structure: null 343 | coordinate: [152, 612.0] 344 | rotation: 0 345 | state: true 346 | - name: digital_symbol_sync_xx_0 347 | id: digital_symbol_sync_xx 348 | parameters: 349 | affinity: '' 350 | alias: '' 351 | comment: '' 352 | constellation: digital.constellation_bpsk().base() 353 | damping: '1.0' 354 | loop_bw: '0.001' 355 | max_dev: '0.001' 356 | maxoutbuf: '0' 357 | minoutbuf: '0' 358 | nfilters: '128' 359 | osps: '1' 360 | pfb_mf_taps: '[]' 361 | resamp_type: digital.IR_MMSE_8TAP 362 | sps: sps 363 | ted_gain: '1.0' 364 | ted_type: digital.TED_GARDNER 365 | type: cc 366 | states: 367 | bus_sink: false 368 | bus_source: false 369 | bus_structure: null 370 | coordinate: [1480, 296.0] 371 | rotation: 0 372 | state: true 373 | - name: dslwp_ccsds_pseudo_randomizer_0 374 | id: dslwp_ccsds_pseudo_randomizer 375 | parameters: 376 | affinity: '' 377 | alias: '' 378 | comment: '' 379 | data_format: '3' 380 | maxoutbuf: '0' 381 | minoutbuf: '0' 382 | states: 383 | bus_sink: false 384 | bus_source: false 385 | bus_structure: null 386 | coordinate: [1240, 772.0] 387 | rotation: 0 388 | state: true 389 | - name: dslwp_ccsds_turbo_decode_0 390 | id: dslwp_ccsds_turbo_decode 391 | parameters: 392 | affinity: '' 393 | alias: '' 394 | base: '223' 395 | code_type: '2' 396 | comment: '' 397 | iterations: '2' 398 | maxoutbuf: '0' 399 | minoutbuf: '0' 400 | octets: '5' 401 | sigma: '0.707' 402 | update_sigma: '1' 403 | states: 404 | bus_sink: false 405 | bus_source: false 406 | bus_structure: null 407 | coordinate: [1576, 720.0] 408 | rotation: 0 409 | state: true 410 | - name: dslwp_frame_spliter_f_0 411 | id: dslwp_frame_spliter_f 412 | parameters: 413 | affinity: '' 414 | alias: '' 415 | comment: '' 416 | frame_length: '17848' 417 | key: syncword 418 | maxoutbuf: '0' 419 | minoutbuf: '0' 420 | states: 421 | bus_sink: false 422 | bus_source: false 423 | bus_structure: null 424 | coordinate: [872, 776.0] 425 | rotation: 0 426 | state: true 427 | - name: dslwp_frame_spliter_f_0_0 428 | id: dslwp_frame_spliter_f 429 | parameters: 430 | affinity: '' 431 | alias: '' 432 | comment: '' 433 | frame_length: '17848' 434 | key: syncword 435 | maxoutbuf: '0' 436 | minoutbuf: '0' 437 | states: 438 | bus_sink: false 439 | bus_source: false 440 | bus_structure: null 441 | coordinate: [920, 928.0] 442 | rotation: 0 443 | state: true 444 | - name: fir_filter_xxx_0 445 | id: fir_filter_xxx 446 | parameters: 447 | affinity: '' 448 | alias: '' 449 | comment: '' 450 | decim: '1' 451 | maxoutbuf: '0' 452 | minoutbuf: '0' 453 | samp_delay: '0' 454 | taps: np.ones(int(sps))/int(sps) / 1.57 455 | type: ccc 456 | states: 457 | bus_sink: false 458 | bus_source: false 459 | bus_structure: null 460 | coordinate: [1016, 336.0] 461 | rotation: 0 462 | state: true 463 | - name: fir_filter_xxx_1 464 | id: fir_filter_xxx 465 | parameters: 466 | affinity: '' 467 | alias: '' 468 | comment: '' 469 | decim: '1' 470 | maxoutbuf: '0' 471 | minoutbuf: '0' 472 | samp_delay: '0' 473 | taps: syncword[::-1]/syncword.size 474 | type: fff 475 | states: 476 | bus_sink: false 477 | bus_source: false 478 | bus_structure: null 479 | coordinate: [1000, 504.0] 480 | rotation: 0 481 | state: true 482 | - name: hilbert_fc_0 483 | id: hilbert_fc 484 | parameters: 485 | affinity: '' 486 | alias: '' 487 | beta: '6.76' 488 | comment: '' 489 | maxoutbuf: '0' 490 | minoutbuf: '0' 491 | num_taps: '65' 492 | win: window.WIN_HAMMING 493 | states: 494 | bus_sink: false 495 | bus_source: false 496 | bus_structure: null 497 | coordinate: [456, 332.0] 498 | rotation: 0 499 | state: true 500 | - name: import_0 501 | id: import 502 | parameters: 503 | alias: '' 504 | comment: '' 505 | imports: from math import pi 506 | states: 507 | bus_sink: false 508 | bus_source: false 509 | bus_structure: null 510 | coordinate: [192, 84.0] 511 | rotation: 0 512 | state: true 513 | - name: import_1 514 | id: import 515 | parameters: 516 | alias: '' 517 | comment: '' 518 | imports: import numpy as np 519 | states: 520 | bus_sink: false 521 | bus_source: false 522 | bus_structure: null 523 | coordinate: [464, 12.0] 524 | rotation: 0 525 | state: true 526 | - name: pdu_pdu_to_tagged_stream_0 527 | id: pdu_pdu_to_tagged_stream 528 | parameters: 529 | affinity: '' 530 | alias: '' 531 | comment: '' 532 | maxoutbuf: '0' 533 | minoutbuf: '0' 534 | tag: packet_len 535 | type: byte 536 | states: 537 | bus_sink: false 538 | bus_source: false 539 | bus_structure: null 540 | coordinate: [1296, 956.0] 541 | rotation: 0 542 | state: true 543 | - name: qtgui_const_sink_x_0 544 | id: qtgui_const_sink_x 545 | parameters: 546 | affinity: '' 547 | alias: '' 548 | alpha1: '1.0' 549 | alpha10: '1.0' 550 | alpha2: '1.0' 551 | alpha3: '1.0' 552 | alpha4: '1.0' 553 | alpha5: '1.0' 554 | alpha6: '1.0' 555 | alpha7: '1.0' 556 | alpha8: '1.0' 557 | alpha9: '1.0' 558 | autoscale: 'False' 559 | axislabels: 'True' 560 | color1: '"blue"' 561 | color10: '"red"' 562 | color2: '"red"' 563 | color3: '"red"' 564 | color4: '"red"' 565 | color5: '"red"' 566 | color6: '"red"' 567 | color7: '"red"' 568 | color8: '"red"' 569 | color9: '"red"' 570 | comment: '' 571 | grid: 'False' 572 | gui_hint: '' 573 | label1: '' 574 | label10: '' 575 | label2: '' 576 | label3: '' 577 | label4: '' 578 | label5: '' 579 | label6: '' 580 | label7: '' 581 | label8: '' 582 | label9: '' 583 | legend: 'True' 584 | marker1: '0' 585 | marker10: '0' 586 | marker2: '0' 587 | marker3: '0' 588 | marker4: '0' 589 | marker5: '0' 590 | marker6: '0' 591 | marker7: '0' 592 | marker8: '0' 593 | marker9: '0' 594 | name: '""' 595 | nconnections: '1' 596 | size: '1024' 597 | style1: '0' 598 | style10: '0' 599 | style2: '0' 600 | style3: '0' 601 | style4: '0' 602 | style5: '0' 603 | style6: '0' 604 | style7: '0' 605 | style8: '0' 606 | style9: '0' 607 | tr_chan: '0' 608 | tr_level: '0.0' 609 | tr_mode: qtgui.TRIG_MODE_FREE 610 | tr_slope: qtgui.TRIG_SLOPE_POS 611 | tr_tag: '""' 612 | type: complex 613 | update_time: '0.10' 614 | width1: '1' 615 | width10: '1' 616 | width2: '1' 617 | width3: '1' 618 | width4: '1' 619 | width5: '1' 620 | width6: '1' 621 | width7: '1' 622 | width8: '1' 623 | width9: '1' 624 | xmax: '2' 625 | xmin: '-2' 626 | ymax: '2' 627 | ymin: '-2' 628 | states: 629 | bus_sink: false 630 | bus_source: false 631 | bus_structure: null 632 | coordinate: [608, 640.0] 633 | rotation: 0 634 | state: true 635 | - name: qtgui_time_sink_x_0 636 | id: qtgui_time_sink_x 637 | parameters: 638 | affinity: '' 639 | alias: '' 640 | alpha1: '1.0' 641 | alpha10: '1.0' 642 | alpha2: '1.0' 643 | alpha3: '1.0' 644 | alpha4: '1.0' 645 | alpha5: '1.0' 646 | alpha6: '1.0' 647 | alpha7: '1.0' 648 | alpha8: '1.0' 649 | alpha9: '1.0' 650 | autoscale: 'False' 651 | axislabels: 'True' 652 | color1: blue 653 | color10: dark blue 654 | color2: red 655 | color3: green 656 | color4: black 657 | color5: cyan 658 | color6: magenta 659 | color7: yellow 660 | color8: dark red 661 | color9: dark green 662 | comment: '' 663 | ctrlpanel: 'False' 664 | entags: 'True' 665 | grid: 'False' 666 | gui_hint: '' 667 | label1: Signal 1 668 | label10: Signal 10 669 | label2: Signal 2 670 | label3: Signal 3 671 | label4: Signal 4 672 | label5: Signal 5 673 | label6: Signal 6 674 | label7: Signal 7 675 | label8: Signal 8 676 | label9: Signal 9 677 | legend: 'True' 678 | marker1: '0' 679 | marker10: '-1' 680 | marker2: '-1' 681 | marker3: '-1' 682 | marker4: '-1' 683 | marker5: '-1' 684 | marker6: '-1' 685 | marker7: '-1' 686 | marker8: '-1' 687 | marker9: '-1' 688 | name: '""' 689 | nconnections: '2' 690 | size: '100000' 691 | srate: symbol_rate 692 | stemplot: 'False' 693 | style1: '0' 694 | style10: '1' 695 | style2: '1' 696 | style3: '1' 697 | style4: '1' 698 | style5: '1' 699 | style6: '1' 700 | style7: '1' 701 | style8: '1' 702 | style9: '1' 703 | tr_chan: '1' 704 | tr_delay: 1e-4 705 | tr_level: '-0.8' 706 | tr_mode: qtgui.TRIG_MODE_NORM 707 | tr_slope: qtgui.TRIG_SLOPE_POS 708 | tr_tag: '""' 709 | type: float 710 | update_time: '0.10' 711 | width1: '1' 712 | width10: '1' 713 | width2: '1' 714 | width3: '1' 715 | width4: '1' 716 | width5: '1' 717 | width6: '1' 718 | width7: '1' 719 | width8: '1' 720 | width9: '1' 721 | ylabel: Amplitude 722 | ymax: '3' 723 | ymin: '-3' 724 | yunit: '""' 725 | states: 726 | bus_sink: false 727 | bus_source: false 728 | bus_structure: null 729 | coordinate: [1416, 556.0] 730 | rotation: 0 731 | state: true 732 | - name: satellites_rms_agc_0 733 | id: satellites_rms_agc 734 | parameters: 735 | affinity: '' 736 | alias: '' 737 | alpha: 1e-4 738 | comment: '' 739 | maxoutbuf: '0' 740 | minoutbuf: '0' 741 | reference: '1.0' 742 | states: 743 | bus_sink: false 744 | bus_source: false 745 | bus_structure: null 746 | coordinate: [712, 176.0] 747 | rotation: 0 748 | state: enabled 749 | 750 | connections: 751 | - [analog_pll_carriertracking_cc_0, '0', blocks_complex_to_arg_0, '0'] 752 | - [analog_sig_source_x_0, '0', blocks_multiply_conjugate_cc_0, '1'] 753 | - [blocks_complex_to_arg_0, '0', hilbert_fc_0, '0'] 754 | - [blocks_complex_to_real_0, '0', blocks_multiply_const_vxx_0, '0'] 755 | - [blocks_complex_to_real_0, '0', digital_correlate_access_code_tag_xx_0, '0'] 756 | - [blocks_complex_to_real_0, '0', fir_filter_xxx_1, '0'] 757 | - [blocks_complex_to_real_0, '0', qtgui_time_sink_x_0, '0'] 758 | - [blocks_float_to_complex_0, '0', satellites_rms_agc_0, '0'] 759 | - [blocks_multiply_conjugate_cc_0, '0', fir_filter_xxx_0, '0'] 760 | - [blocks_multiply_const_vxx_0, '0', digital_correlate_access_code_tag_xx_0_0, '0'] 761 | - [blocks_wavfile_source_0, '0', blocks_float_to_complex_0, '0'] 762 | - [blocks_wavfile_source_0, '1', blocks_float_to_complex_0, '1'] 763 | - [digital_correlate_access_code_tag_xx_0, '0', dslwp_frame_spliter_f_0, '0'] 764 | - [digital_correlate_access_code_tag_xx_0_0, '0', dslwp_frame_spliter_f_0_0, '0'] 765 | - [digital_costas_loop_cc_0, '0', blocks_complex_to_real_0, '0'] 766 | - [digital_costas_loop_cc_0, '0', qtgui_const_sink_x_0, '0'] 767 | - [digital_symbol_sync_xx_0, '0', digital_costas_loop_cc_0, '0'] 768 | - [dslwp_ccsds_pseudo_randomizer_0, out, dslwp_ccsds_turbo_decode_0, in] 769 | - [dslwp_ccsds_turbo_decode_0, out, pdu_pdu_to_tagged_stream_0, pdus] 770 | - [dslwp_frame_spliter_f_0, out, dslwp_ccsds_pseudo_randomizer_0, in] 771 | - [dslwp_frame_spliter_f_0_0, out, dslwp_ccsds_pseudo_randomizer_0, in] 772 | - [fir_filter_xxx_0, '0', digital_symbol_sync_xx_0, '0'] 773 | - [fir_filter_xxx_1, '0', qtgui_time_sink_x_0, '1'] 774 | - [hilbert_fc_0, '0', blocks_multiply_conjugate_cc_0, '0'] 775 | - [pdu_pdu_to_tagged_stream_0, '0', blocks_file_sink_0, '0'] 776 | - [satellites_rms_agc_0, '0', analog_pll_carriertracking_cc_0, '0'] 777 | 778 | metadata: 779 | file_format: 1 780 | grc_version: v3.10.1.1-58-g637fcda4 781 | -------------------------------------------------------------------------------- /recordings/README.md: -------------------------------------------------------------------------------- 1 | ## Recordings 2 | 3 | The IQ recordings that will be used in this workshop can be downloaded 4 | [here](http://eala.destevez.net/~daniel/grcon2020-workshop/). They should be 5 | placed in this `recordings/` folder. These files total to nearly 6 | 1GB, so attendees are recommended to download these before the workshop. 7 | 8 | -------------------------------------------------------------------------------- /slides/slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/slides.pdf -------------------------------------------------------------------------------- /slides/src/10gemedish1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/10gemedish1.jpg -------------------------------------------------------------------------------- /slides/src/BepiColombo_Auto6F.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/BepiColombo_Auto6F.jpeg -------------------------------------------------------------------------------- /slides/src/baseband.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/baseband.png -------------------------------------------------------------------------------- /slides/src/codewords.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/codewords.png -------------------------------------------------------------------------------- /slides/src/grcon20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/grcon20.png -------------------------------------------------------------------------------- /slides/src/hilbert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/hilbert.png -------------------------------------------------------------------------------- /slides/src/iq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/iq.png -------------------------------------------------------------------------------- /slides/src/manchester.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/manchester.png -------------------------------------------------------------------------------- /slides/src/manchester_after_hilb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/manchester_after_hilb.png -------------------------------------------------------------------------------- /slides/src/manchester_before_hilb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/manchester_before_hilb.png -------------------------------------------------------------------------------- /slides/src/manchester_fir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/manchester_fir.png -------------------------------------------------------------------------------- /slides/src/manchester_hilb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/manchester_hilb.png -------------------------------------------------------------------------------- /slides/src/manchester_wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/manchester_wave.png -------------------------------------------------------------------------------- /slides/src/post_matched.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/post_matched.png -------------------------------------------------------------------------------- /slides/src/pre_matched.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/pre_matched.png -------------------------------------------------------------------------------- /slides/src/slides.tex: -------------------------------------------------------------------------------- 1 | % $Header: /Users/joseph/Documents/LaTeX/beamer/solutions/conference-talks/conference-ornate-20min.en.tex,v 90e850259b8b 2007/01/28 20:48:30 tantau $ 2 | 3 | \documentclass[aspectratio=169]{beamer} 4 | 5 | % This file is a solution template for: 6 | 7 | % - Talk at a conference/colloquium. 8 | % - Talk length is about 20min. 9 | % - Style is ornate. 10 | 11 | 12 | 13 | % Copyright 2004 by Till Tantau . 14 | % 15 | % In principle, this file can be redistributed and/or modified under 16 | % the terms of the GNU Public License, version 2. 17 | % 18 | % However, this file is supposed to be a template to be modified 19 | % for your own needs. For this reason, if you use this file as a 20 | % template and not specifically distribute it as part of a another 21 | % package/program, I grant the extra permission to freely copy and 22 | % modify this file as you see fit and even to delete this copyright 23 | % notice. 24 | 25 | 26 | \mode 27 | { 28 | \usetheme{Madrid} 29 | % or ... 30 | 31 | \setbeamercovered{transparent} 32 | % or whatever (possibly just delete it) 33 | } 34 | 35 | \frenchspacing 36 | % or whatever 37 | 38 | \usepackage[utf8]{inputenc} 39 | % or whatever 40 | 41 | 42 | \usepackage{times} 43 | \usepackage[T1]{fontenc} 44 | % Or whatever. Note that the encoding and the font should match. If T1 45 | % does not look nice, try deleting the line with the fontenc. 46 | 47 | \title{Workshop: ``Decoding Interplanetary Spacecraft''} 48 | 49 | \author{Dr. Daniel Est\'evez} 50 | 51 | 52 | \institute 53 | {} 54 | % - Use the \inst command only if there are several affiliations. 55 | % - Keep it simple, no one is interested in your street address. 56 | 57 | \date % (optional, should be abbreviation of conference name) 58 | [GRCon20, September 2020]{14 September 2020\\\vspace{1em}\includegraphics[width=3cm]{grcon20}} 59 | % - Either use conference name or its abbreviation. 60 | % - Not really informative to the audience, more for people (including 61 | % yourself) who are reading the slides online 62 | 63 | \subject{} 64 | % This is only inserted into the PDF information catalog. Can be left 65 | % out. 66 | 67 | % If you have a file called "university-logo-filename.xxx", where xxx 68 | % is a graphic format that can be processed by latex or pdflatex, 69 | % resp., then you can add a logo as follows: 70 | 71 | % \pgfdeclareimage[height=0.5cm]{university-logo}{university-logo-filename} 72 | % \logo{\pgfuseimage{university-logo}} 73 | 74 | 75 | 76 | % Delete this, if you do not want the table of contents to pop up at 77 | % the beginning of each subsection: 78 | \AtBeginSection[] 79 | { 80 | \begin{frame}{Outline} 81 | \tableofcontents[currentsection,currentsubsection] 82 | \end{frame} 83 | } 84 | 85 | 86 | % If you wish to uncover everything in a step-wise fashion, uncomment 87 | % the following command: 88 | 89 | %\beamerdefaultoverlayspecification{<+->} 90 | 91 | \newcommand{\handson}[1]{\begin{frame} 92 | \begin{block}{} 93 | \begin{center} 94 | \vspace{0.5em} 95 | {\bf Hands-on:} #1 96 | \vspace{0.5em} 97 | \end{center} 98 | \end{block} 99 | \end{frame} 100 | } 101 | 102 | 103 | \begin{document} 104 | 105 | \begin{frame} 106 | \titlepage 107 | \end{frame} 108 | 109 | \begin{frame}{Introduction} 110 | In this workshop: 111 | 112 | \begin{itemize} 113 | \item We start off with IQ recordings of some deep-space probes 114 | \item Use GNU Radio to analyze the signal and find its specs (simple 115 | reverse-engineering) 116 | \item Build a decoder to obtain telemetry frames as we go 117 | \end{itemize} 118 | 119 | Why? 120 | \begin{itemize} 121 | \item It is cool! 122 | \item It isn't difficult: probably easier than your average ASK keyfob 123 | \item To learn deep-space communications 124 | \end{itemize} 125 | 126 | The focus is on hands-on with GNU Radio, but there are some slides with the 127 | theoretical background. You can always come back to these later. 128 | \end{frame} 129 | 130 | \begin{frame}{ESA Solar Orbiter} 131 | \begin{center} 132 | \includegraphics[width=8cm]{solar_orbiterTHUMB} 133 | \end{center} 134 | 135 | ESA mission to study the heliosphere and solar wind (some participation of NASA) 136 | 137 | Launched on 10 February 2020 138 | 139 | \begin{flushright} 140 | {\tiny * Image from ESA Science \& Exploration} 141 | \end{flushright} 142 | \end{frame} 143 | 144 | \begin{frame}{BepiColombo} 145 | \begin{center} 146 | \includegraphics[width=6.1cm]{BepiColombo_Auto6F} 147 | \end{center} 148 | 149 | ESA / JAXA mission to Mercury 150 | 151 | Launched on 20 October 2018, Earth flyby on 10 April 2020 152 | 153 | \begin{flushright} 154 | {\tiny * Image from eoPortal Directory} 155 | \end{flushright} 156 | \end{frame} 157 | 158 | \begin{frame}{Receiving deep-space probes signals} 159 | These spacecraft transmit telemetry in the X band, around 8.4GHz 160 | 161 | \medskip 162 | 163 | The signal can be detected with ``small'' dishes from long distances, but to 164 | have enough SNR to demodulate the data, the spacecraft needs to be near Earth 165 | 166 | \medskip 167 | 168 | The recordings used here have been made by Paul Marsh M0EYT: 169 | 170 | \begin{itemize} 171 | \item Solar Orbiter: 3 days after launch, 1.7 million km away 172 | \item BepiColombo: 6 days before Earth flyby, 2 million km away 173 | \end{itemize} 174 | 175 | More is possible: Paul is currently demodulating Tianwen-1 at 16 million km on 176 | its way to Mars 177 | 178 | \medskip 179 | 180 | Put these numbers in perspective: the Earth-Moon distance is 0.4 million km; 181 | light takes 10 seconds to travel 3 million km 182 | 183 | \end{frame} 184 | 185 | \begin{frame} 186 | This is Paul's 2.4m antenna. 187 | 188 | \begin{center} 189 | \includegraphics[width = 9.5cm]{10gemedish1} 190 | \end{center} 191 | \end{frame} 192 | 193 | \begin{frame}{Signal spectrum} 194 | The first step in analyzing a signal is looking at the spectrum and/or waterfall 195 | 196 | This requires computing FFTs to pass from time domain to frequency domain 197 | 198 | \medskip 199 | 200 | The \emph{QT GUI Frequency Sink} and \emph{QT GUI Waterfall Sink} GNU Radio 201 | blocks can be used for this 202 | 203 | \medskip 204 | 205 | inspectrum, by Mike Walters is also a good tool for viewing the waterfall of a 206 | recording 207 | 208 | \url{https://github.com/miek/inspectrum} 209 | \end{frame} 210 | 211 | \handson{Visualizing the spectrum} 212 | 213 | \begin{frame}{Phase modulation in deep-space communications} 214 | Many deep-space comms systems use residual-carrier phase modulation: 215 | 216 | \[ 217 | x(t) = A\cos(2 \pi f_0 t + \varphi(t)) = 218 | \operatorname{Re}(x_{BB}(t) \exp(2 \pi i f_0 t)),\quad x_{BB}(t) = A\exp(i \varphi(t)) 219 | \] 220 | 221 | \[ 222 | \varphi(t) = D s(t) d(t), \quad s(t) = h(\sin(2 \pi f_{sc} t + \varphi_{sc})), 223 | \quad d(t) = \sum_{n \in \mathbb{Z}} d_n p(t/T_s - n), 224 | \] 225 | 226 | where $D$ is the deviation, 227 | $h(t) = t$ for a sine-wave subcarrier, $h(t) = \operatorname{sign}(t)$ 228 | for a square-wave subcarrier, $d_n = \pm 1$, and $p$ is the data pulse shaping 229 | filter, typically $p(t) = 1$ for $0 \leq t \leq 1$, and $p(t) = 0$ otherwise. 230 | 231 | \medskip 232 | 233 | Manchester encoding is a special case, where $h(t) = 234 | \operatorname{sign}(t)$, $f_{sc} = 1/T_s$ and $\varphi_{sc} = 0$. 235 | 236 | \medskip 237 | 238 | The residual carrier can be used to recover the carrier phase 239 | 240 | \medskip 241 | 242 | Suppressed-carrier modulations, such as GMSK/OQPSK are also possible, 243 | especially for high-speed data 244 | \end{frame} 245 | 246 | \begin{frame}{Spectrum depending on the subcarrier} 247 | The subcarrier can be used to push the data power away from the suppressed 248 | carrier, to help suppressed carrier recovery with a PLL 249 | 250 | There are the following possibilities: 251 | \begin{itemize} 252 | \item Subcarrier, $f_{sc} > 1/T_s$ 253 | \item Manchester encoding, $f_{sc} = 1/T_s$ 254 | \item Baseband modulation, $s(t) = 1$ ($f_{sc} = 0$) 255 | \end{itemize} 256 | 257 | \begin{center} 258 | \includegraphics[width=5cm]{subcarrier} 259 | \includegraphics[width=5cm]{manchester} 260 | \includegraphics[width=5cm]{baseband} 261 | \end{center} 262 | \end{frame} 263 | 264 | \begin{frame}{Carrier phase recovery} 265 | We use a PLL to recover the phase of the residual carrier. Given 266 | \[ 267 | y(t) = a(t) e^{i\psi(t)} [1 + z(t)] + n_1(t), 268 | \] 269 | with $|a'(t)|$, $|\psi'(t)|$, $|\psi''(t)|$ small, a PLL produces an estimate 270 | $\widehat{\psi} \approx \psi$. Here $\psi$ accounts for the transmitter and 271 | receiver local oscillator difference and changes in propagation path. 272 | 273 | \medskip 274 | 275 | The \emph{PLL Carrier Tracking} GNU Radio block outputs 276 | \[ 277 | e^{-i\widehat{\psi}(t)} y(t) \approx a(t)[1 + z(t)] + n_2(t). 278 | \] 279 | There are other PLL blocks in GNU Radio which output different things 280 | 281 | \medskip 282 | 283 | The PLL blocks (and many others) assume a signal amplitude of one 284 | ($a(t) \approx 1$), so they are typically used after an AGC. The \emph{RMS AGC} 285 | block from gr-satellites estimates the signal RMS power and divides the signal 286 | by it. 287 | \end{frame} 288 | 289 | \handson{Carrier phase locking with a PLL} 290 | 291 | \begin{frame}{Phase modulation and IQ} 292 | Phase modulation can be approximated by a linear modulation where the data is 293 | in quadrature with the suppressed carrier, since $\exp(i\varphi(t)) \approx 1 294 | + i\varphi(t)$ 295 | 296 | \begin{center} 297 | \includegraphics[width=15cm]{iq} 298 | \end{center} 299 | \end{frame} 300 | 301 | \begin{frame}{Downconversion of the data sideband to baseband} 302 | We take the complex argument (or the imaginary part) at the output of the PLL 303 | and obtain the real Manchester signal $\varphi(t)$. This has two 304 | sidebands. Each of the sidebands looks like BPSK, so we can filter one 305 | sideband, move to baseband, and process as BPSK. 306 | 307 | We use a Hilbert filter to select only one sideband 308 | \begin{center} 309 | \includegraphics[width=5cm]{hilbert} 310 | \end{center} 311 | 312 | Then multiply by a complex exponential to move in frequency. Remember: 313 | multiplication by $\exp(2\pi i f t)$ shifts the frequency by $f$. 314 | \end{frame} 315 | 316 | \handson{Downconverting the data sideband to baseband} 317 | 318 | \begin{frame}{Finding the carrier frequency of BPSK} 319 | A BPSK signal is 320 | \[ 321 | y(t) = d(t)e^{2\pi i f t} + n(t), 322 | \] 323 | with $d(t) = \pm 1$. We square it 324 | \[ 325 | y(t)^2 = e^{4\pi i f t} + 2 n(t) d(t) e^{2\pi i f t} + n(t)^2 326 | \] 327 | and obtain a carrier at frequency $2 f$. 328 | 329 | \medskip 330 | 331 | The same trick can be used for $m$-PSK, by computing the $m$-th power. 332 | \end{frame} 333 | 334 | \handson{Refining our downconversion to baseband} 335 | 336 | \begin{frame}{Finding the symbol rate} 337 | We have a BPSK signal in discrete time 338 | \[ 339 | y[n] = d[n] e^{i \omega n}, 340 | \] 341 | with $d[n] = \pm 1$. We compute 342 | \[ 343 | z[n] = y[n] \overline{y[n-1]} = d[n]d[n-1] e^{i \omega}. 344 | \] 345 | Then $z[n] = e^{i\omega}$ except when $n-1$ and $n$ lie in different and 346 | opposite symbols, in which case $z[n] = -e^{i\omega}$. 347 | 348 | \medskip 349 | 350 | So $z[n]$ is a sequence of pulses that occur on some of the symbol changes of 351 | $y$. The spectrum of $z$ has a strong component at the symbol rate of $y$. 352 | 353 | \medskip 354 | 355 | This trick is a simple example of cyclostationary analysis, which is a very 356 | powerful tool. 357 | \end{frame} 358 | 359 | \handson{Finding the symbol rate} 360 | 361 | \begin{frame}{Clock recovery} 362 | We need to filter the noisy BPSK signal with a matched filter to accumulate 363 | the energy of each symbol and reduce noise. For a square pulse, the matched 364 | filter is just a moving average. We need to find the optimal sampling 365 | locations for the symbols. The \emph{Symbol Sync} GNU Radio block will do that 366 | given an estimate of the symbol rate. 367 | 368 | \begin{center} 369 | \includegraphics[height=4cm]{pre_matched} 370 | \includegraphics[height=4cm]{post_matched} 371 | \end{center} 372 | \end{frame} 373 | 374 | \begin{frame}{Suppressed carrier recovery} 375 | After sampling with the \emph{Symbol Sync} block, our symbols look like 376 | \[S[n] = d_n e^{i\psi_n},\]where $d_n = \pm 1$ and $\psi_n$ changes slowly. We 377 | still have a suppressed carrier $e^{i\psi_n}$. 378 | 379 | \medskip 380 | A 381 | Costas loop will produce an estimate $\widehat{\psi}_n \approx \psi_n$ and 382 | output 383 | \[ 384 | e^{-i\widehat{\psi}_n}S[n] \approx d_n. 385 | \] 386 | 387 | \medskip 388 | 389 | There is a 180º phase ambiguity in the Costas loop, so it may happen that 390 | $\widehat{\psi}_n \approx \psi_n + \pi$ and we get $-d_n$ instead of $d_n$. 391 | 392 | \medskip 393 | 394 | Note that here we are actually using the Costas loop to recover the Manchester 395 | subcarrier, since the carrier was actually recovered by the PLL. 396 | \end{frame} 397 | 398 | \handson{Clock and carrier phase recovery} 399 | 400 | \begin{frame}{Coding in deep-space communications: CCSDS} 401 | Now that we have symbols, we want to decode frames from them 402 | 403 | \medskip 404 | 405 | Space communications protocols are standardized by CCSDS in the Blue Books 406 | 407 | The \emph{TM Synchronization and Channel Coding} blue book describes: 408 | \begin{itemize} 409 | \item FEC (encode the message to correct bit errors on the receive end) 410 | \item Scrambling (make the message look random, for performance) 411 | \item Syncwords (mark the beginning of frames) 412 | \end{itemize} 413 | 414 | These are the possible types of FEC: 415 | \begin{itemize} 416 | \item Convolutional code (Viterbi decoder) 417 | \item Reed-Solomon 418 | \item Concatenated (convolutional + Reed-Solomon) 419 | \item Turbo code 420 | \item LDPC 421 | \end{itemize} 422 | \end{frame} 423 | 424 | \begin{frame}{CCSDS syncwords} 425 | The syncword depends on the FEC used. This can help us guess the FEC type. 426 | 427 | \begin{center} 428 | \includegraphics[width=15cm]{syncwords} 429 | \end{center} 430 | 431 | With convolutional codes, the syncword is sent encoded; with the rest, it is 432 | sent uncoded 433 | 434 | \medskip 435 | 436 | We can try to correlate the symbol stream against these syncwords. Correlation 437 | can be implemented by a FIR filter with the \emph{Decimating FIR filter} block. 438 | \end{frame} 439 | 440 | \handson{Finding the syncword} 441 | 442 | \begin{frame}{Turbo codeword sizes} 443 | We can find the Turbo code parameters from the codeword size, which can be 444 | measured from the distance between syncwords 445 | 446 | \begin{center} 447 | \includegraphics[width=10cm]{codewords} 448 | \end{center} 449 | 450 | We use \emph{Correlate Access Code - Tag} to detect syncwords (add tags) 451 | and \emph{Tag debug} to print their locations 452 | \end{frame} 453 | 454 | \handson{Finding the codeword size} 455 | 456 | \begin{frame}{Turbo decoding with GNU Radio} 457 | We can use the Turbo decoder blocks from gr-dslwp (Longjiang-2 Chinese lunar 458 | microsatellite mission) by Wei Mingchuan from Harbin Institute of Technology (China) 459 | 460 | This uses an open source Turbo code implementation by 461 | Gianluca Marcon, made in 2017 as a course project in Univ.~of Padova (Italy) 462 | 463 | \begin{itemize} 464 | \item gr-dslwp for GNU Radio 3.8 \url{https://github.com/daniestevez/gr-dslwp/tree/maint38} 465 | \item Gianluca's deepspace-turbo \url{https://github.com/geeanlooca/deepspace-turbo} 466 | \end{itemize} 467 | 468 | We use: 469 | \begin{itemize} 470 | \item \emph{Frame Splitter F} to put each codeword in a PDU 471 | \item \emph{CCSDS Pseudo Randomizer} to perform descrambling 472 | \item \emph{CCSDS Turbo Decode} for actual Turbo decoding 473 | \end{itemize} 474 | \end{frame} 475 | 476 | \handson{Turbo decoding} 477 | 478 | \begin{frame}{Where to go from here? Space Data Link protocols} 479 | Frames often use CCSDS protocols: TM Space Data Link or AOS Space Data Link 480 | protocols (see respective Blue Books) 481 | 482 | \medskip 483 | 484 | Space Data Link frames often have a CRC-16 at the end. We can use it to check 485 | that our decoded frames are correct 486 | 487 | \emph{Exception:} Reed-Solomon frames usually don't have a CRC-16, since 488 | Reed-Solomon already does error checking 489 | 490 | \medskip 491 | 492 | The upper layer protocol is usually CCSDS Space Packets 493 | 494 | \medskip 495 | 496 | I typically study these in a Jupyter notebook, but we could also use the CCSDS 497 | blocks from gr-satellites, made by Athanasios Theocharis in ESA Summer of Code 498 | in Space 2019 499 | \end{frame} 500 | 501 | \begin{frame}{Solar Orbiter frames} 502 | Solar Orbiter uses TM Space Data Link frames 503 | 504 | \begin{center} 505 | \includegraphics[width=10.5cm]{tmheader} 506 | \end{center} 507 | 508 | \emph{Hint:} Both the TM Space Data Link frames and AOS Space Data Link frames 509 | start by a Transfer Frame Version Number field. Its value can be used to 510 | distinguish them 511 | \end{frame} 512 | 513 | \handson{Brief look at the frames with Python: CRC's and headers} 514 | 515 | \begin{frame}{About BepiColombo} 516 | BepiColombo's telemetry is very similar to Solar Orbiter 517 | 518 | \begin{center} 519 | \begin{tabular}{r | c | c} 520 | & {\bf Solar Orbiter} & {\bf BepiColombo} \\ 521 | \hline 522 | {\bf Modulation} & PCM/PM/Bi-$\varphi$ & PCM/PM/Bi-$\varphi$ \\ 523 | {\bf Baudrate} & 555.5k & 700k\\ 524 | {\bf Coding} & $r = 1/2$ Turbo & $r = 1/2$ Turbo\\ 525 | {\bf Frame size} & 8920 bits & 8920 bits\\ 526 | {\bf Fames} & TM & TM \\ 527 | \end{tabular} 528 | \end{center} 529 | 530 | The signal in the recording is weaker than Solar Orbiter's, so trying to 531 | decode is a good exercise to check decoder performance 532 | 533 | \medskip 534 | 535 | Most of the frames contain idle data, but they are interesting to analyze, 536 | because they are filled with a PN sequence that resets ``unexpectedly'' 537 | \end{frame} 538 | 539 | \begin{frame}{Further reading} 540 | Mars spacecraft (in collaboration with AMSAT-DL and Bochum observatory) 541 | 542 | Just search in \url{http://destevez.net} 543 | 544 | \begin{center} 545 | \begin{tabular}{r | c | c | c } 546 | & {\bf EMM } & {\bf Tianwen-1} & {\bf Tianwen-1 (high-speed)} \\ 547 | \hline 548 | {\bf Modulation} & PCM/PM/NRZ & PCM/PSK/PM & QPSK \\ 549 | {\bf Baudrate} & 12k & 16384 & 2048k\\ 550 | {\bf Coding} & $r = 1/6$ Turbo & Concatenated & Concatenated \\ 551 | {\bf Frame size} & 1784 bits & 1760 bits & 7136 bits \\ 552 | {\bf Fames} & AOS & AOS & AOS\\ 553 | \end{tabular} 554 | \end{center} 555 | \begin{center} 556 | \begin{tabular}{r | c | c} 557 | & {\bf Mars 2020 (safe mode)} & {\bf Mars 2020} \\ 558 | \hline 559 | {\bf Modulation} & PCM/PSK/PM & PCM/PM/NRZ \\ 560 | {\bf Baudrate} & 80 & 60k \\ 561 | {\bf Coding} & $r = 1/2$ Turbo & $r = 1/6$ Turbo \\ 562 | {\bf Frame size} & 1784 bits & 8920 bits \\ 563 | {\bf Fames} & AOS & AOS \\ 564 | \end{tabular} 565 | \end{center} 566 | \end{frame} 567 | 568 | \begin{frame} 569 | \begin{block}{} 570 | \begin{center} 571 | \vspace{1em} 572 | {\huge Additional material} 573 | \vspace{1em} 574 | \end{center} 575 | \end{block} 576 | \end{frame} 577 | 578 | \begin{frame}{Two other approaches for Manchester demodulation} 579 | We have downconverted a sideband to baseband, which can also be used for 580 | PCM/PSK/PM. To demodulate Manchester, we can instead: 581 | \begin{itemize} 582 | \item Demodulate as twice the symbol rate, then use \emph{Manchester Sync} 583 | from gr-satellites to find and wipe the Manchester clock 584 | \item Use an FIR filter as matched filter to the Manchester pulse 585 | \end{itemize} 586 | 587 | \begin{center} 588 | \includegraphics[width=9.5cm]{manchester_wave} 589 | \end{center} 590 | \end{frame} 591 | 592 | \begin{frame}{Manchester Sync} 593 | The \emph{Manchester sync} block gets an input at twice the symbol rate... 594 | \begin{center} 595 | \texttt{$\cdots$1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0$\cdots$} 596 | \end{center} 597 | ...finds the phase of the Manchester clock, by making pairs that look like 598 | \texttt{01} and \texttt{10}... 599 | \begin{center} 600 | \texttt{$\cdots$1|0 1|1 0|1 0|0 1|0 1|1 0|1 0|0 1|1 0|0 1|1 0|1 0$\cdots$} 601 | \end{center} 602 | ...and ``wipes'' the Manchester block, by replacing each Manchester pair by 603 | the corresponding NRZ symbol... 604 | \begin{center} 605 | \texttt{$\cdots$ | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 $\cdots$} 606 | \end{center} 607 | \end{frame} 608 | 609 | \begin{frame}{Manchester pulse matched filter} 610 | If we use the Manchester pulse \texttt{10} as a matched filter, we wipe the 611 | Manchester clock and obtain the correct symbols at the optimal sampling 612 | locations. 613 | 614 | We also obtain spurious sampling locations between adjacent and equal symbols. 615 | \begin{center} 616 | \includegraphics[width=7cm]{manchester_wave} 617 | \includegraphics[width=7cm]{manchester_fir} 618 | \end{center} 619 | 620 | However, the clock phase for spurious sampling locations is unstable, so a 621 | DTLL (\emph{Symbol Sync}) will tend to lock to the correct optimal sampling 622 | locations phase. 623 | 624 | It is good to resample to an even samples-per-symbol before the FIR filter. 625 | \end{frame} 626 | 627 | % Structuring a talk is a difficult task and the following structure 628 | % may not be suitable. Here are some rules that apply for this 629 | % solution: 630 | 631 | % - Exactly two or three sections (other than the summary). 632 | % - At *most* three subsections per section. 633 | % - Talk about 30s to 2min per frame. So there should be between about 634 | % 15 and 30 frames, all told. 635 | 636 | % - A conference audience is likely to know very little of what you 637 | % are going to talk about. So *simplify*! 638 | % - In a 20min talk, getting the main ideas across is hard 639 | % enough. Leave out details, even if it means being less precise than 640 | % you think necessary. 641 | % - If you omit details that are vital to the proof/implementation, 642 | % just say so once. Everybody will be happy with that. 643 | 644 | 645 | % \section{Motivation} 646 | % 647 | % \subsection{The Basic Problem That We Studied} 648 | % 649 | % \begin{frame}{Make Titles Informative. Use Uppercase Letters.}{Subtitles are optional.} 650 | % % - A title should summarize the slide in an understandable fashion 651 | % % for anyone how does not follow everything on the slide itself. 652 | % 653 | % \begin{itemize} 654 | % \item 655 | % Use \texttt{itemize} a lot. 656 | % \item 657 | % Use very short sentences or short phrases. 658 | % \end{itemize} 659 | % \end{frame} 660 | % 661 | % \begin{frame}{Make Titles Informative.} 662 | % 663 | % You can create overlays\dots 664 | % \begin{itemize} 665 | % \item using the \texttt{pause} command: 666 | % \begin{itemize} 667 | % \item 668 | % First item. 669 | % \pause 670 | % \item 671 | % Second item. 672 | % \end{itemize} 673 | % \item 674 | % using overlay specifications: 675 | % \begin{itemize} 676 | % \item<3-> 677 | % First item. 678 | % \item<4-> 679 | % Second item. 680 | % \end{itemize} 681 | % \item 682 | % using the general \texttt{uncover} command: 683 | % \begin{itemize} 684 | % \uncover<5->{\item 685 | % First item.} 686 | % \uncover<6->{\item 687 | % Second item.} 688 | % \end{itemize} 689 | % \end{itemize} 690 | % \end{frame} 691 | % 692 | % 693 | % \subsection{Previous Work} 694 | % 695 | % \begin{frame}{Make Titles Informative.} 696 | % \end{frame} 697 | % 698 | % \begin{frame}{Make Titles Informative.} 699 | % \end{frame} 700 | % 701 | % 702 | % 703 | % \section{Our Results/Contribution} 704 | % 705 | % \subsection{Main Results} 706 | % 707 | % \begin{frame}{Make Titles Informative.} 708 | % \end{frame} 709 | % 710 | % \begin{frame}{Make Titles Informative.} 711 | % \end{frame} 712 | % 713 | % \begin{frame}{Make Titles Informative.} 714 | % \end{frame} 715 | % 716 | % 717 | % \subsection{Basic Ideas for Proofs/Implementation} 718 | % 719 | % \begin{frame}{Make Titles Informative.} 720 | % \end{frame} 721 | % 722 | % \begin{frame}{Make Titles Informative.} 723 | % \end{frame} 724 | % 725 | % \begin{frame}{Make Titles Informative.} 726 | % \end{frame} 727 | % 728 | % 729 | % 730 | % \section*{Summary} 731 | % 732 | % \begin{frame}{Summary} 733 | % 734 | % % Keep the summary *very short*. 735 | % \begin{itemize} 736 | % \item 737 | % The \alert{first main message} of your talk in one or two lines. 738 | % \item 739 | % The \alert{second main message} of your talk in one or two lines. 740 | % \item 741 | % Perhaps a \alert{third message}, but not more than that. 742 | % \end{itemize} 743 | % 744 | % % The following outlook is optional. 745 | % \vskip0pt plus.5fill 746 | % \begin{itemize} 747 | % \item 748 | % Outlook 749 | % \begin{itemize} 750 | % \item 751 | % Something you haven't solved. 752 | % \item 753 | % Something else you haven't solved. 754 | % \end{itemize} 755 | % \end{itemize} 756 | % \end{frame} 757 | % 758 | % 759 | % 760 | % % All of the following is optional and typically not needed. 761 | % \appendix 762 | % \section*{\appendixname} 763 | % \subsection*{For Further Reading} 764 | % 765 | % \begin{frame}[allowframebreaks] 766 | % \frametitle{For Further Reading} 767 | % 768 | % \begin{thebibliography}{10} 769 | % 770 | % \beamertemplatebookbibitems 771 | % % Start with overview books. 772 | % 773 | % \bibitem{Author1990} 774 | % A.~Author. 775 | % \newblock {\em Handbook of Everything}. 776 | % \newblock Some Press, 1990. 777 | % 778 | % 779 | % \beamertemplatearticlebibitems 780 | % % Followed by interesting articles. Keep the list short. 781 | % 782 | % \bibitem{Someone2000} 783 | % S.~Someone. 784 | % \newblock On this and that. 785 | % \newblock {\em Journal of This and That}, 2(1):50--100, 786 | % 2000. 787 | % \end{thebibliography} 788 | % \end{frame} 789 | 790 | \end{document} 791 | 792 | 793 | -------------------------------------------------------------------------------- /slides/src/solar_orbiterTHUMB.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/solar_orbiterTHUMB.jpg -------------------------------------------------------------------------------- /slides/src/subcarrier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/subcarrier.png -------------------------------------------------------------------------------- /slides/src/syncwords.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/syncwords.png -------------------------------------------------------------------------------- /slides/src/tmheader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daniestevez/grcon2020-workshop/4c1341e9de8e091120a568c251f0caf649e31c54/slides/src/tmheader.png --------------------------------------------------------------------------------