📜 ⬆️ ⬇️

Software Defined Radio - how does it work? Part 7

Hi, Habr.

In the previous part about transmitting to GNU Radio , the question was asked whether the LoRa protocol (data transfer for low-power devices) can be decoded using SDR. I found this topic interesting, especially since the signal from LoRa is rather unusual - the so-called Chirp Spread Spectrum modulation, or “chirp modulation”.


')
How it works, continued under the cut.

By the way, the literal translation of Chirp modulation would sound like “modulation by chirping,” but this sounds quite surreal, so I'd rather leave the simple word “chirp” (as suggested in the comments, in Russian this is called linear-frequency modulation ).

LoRa modulation


As mentioned above, when transmitting LoRa, the modulation method using “chirps” is used, which, by the way, is patented by Semtech. If anyone wants implementation details with formulas, you can read the PDF on the semtech website or here , well, if it's very rough, then one “chirp” is one frequency change, and the bitstream is encoded by such changes, as shown in the picture above. The signal parameters in LoRa are SF (spreading factor - in fact, the duration of one “chirp”) and bandwidth is the transmission bandwidth. The parameter SF is set by the predefined values ​​of SF7 - SF12, where 7 is the fastest and 12 is the slowest mode (for example, you can see a picture with different speeds of “chirping” with a researchgate ).

Obviously, the shorter the length of the “chirp” and the wider the band, the more you can get the transmission rate. All this is connected approximately by such table:



From the point of view of range and noise immunity, it is advantageous to transfer slowly and sadly, but at the same time we lose speed first, second we lose in time, and according to the rules of LoRa, the device can transmit no more than 1% of the time so as not to interfere with others devices. So the choice of the optimal transmission rate for low-power devices is also not an easy task.

With the general principle, I hope, clearly, we now turn to SDR and decoding.

Iron


For testing, I used the LoRa Click RN2483 and Arduino M0, simply because they were available.



This is quite a convenient form factor for prototyping, since makes it easy to replace the board with one another without soldering (in this format, called MikroBUS , many different peripherals are available).

A draft code that does not pretend to production has been added under the spoiler. The value 1234 is transmitted as a test.

rn2483_tx.ino
// RN2483 Modem and LoRa Click test TX. Tested with Arduino M0 int reset = A2; int rts = 9; // CS int cts = 3; // INT // the setup routine runs once when you press reset: void setup() { Serial1.begin(57600); // Serial port to radio // output LED pin pinMode(LED_BUILTIN, OUTPUT); pinMode(cts, INPUT); pinMode(rts, OUTPUT); digitalWrite(rts, HIGH); // Reset rn2483 pinMode(reset, OUTPUT); digitalWrite(reset, LOW); delay(100); digitalWrite(reset, HIGH); delay(100); sendCommand("sys get ver\r\n"); sendCommand("sys get hweui\r\n"); sendCommand("mac pause\r\n"); sendCommand("radio set mod lora\r\n"); sendCommand("radio set pwr -3\r\n"); // the transceiver output power, from -3 to 15 sendCommand("radio set sf sf8\r\n"); // sf7..sf12, sf7 the fastest spreading factor but gives the shortest range // sendCommand("mac set dr 0\r\n"); // data rate: 0-4, 4 faster sendCommand("radio set freq 869100000\r\n"); // sendCommand("radio set afcbw 41.7\r\n"); sendCommand("radio set rxbw 125\r\n"); // sendCommand("radio set prlen 8\r\n"); sendCommand("radio set crc on\r\n"); // sendCommand("radio set iqi off\r\n"); sendCommand("radio set cr 4/8\r\n"); // sendCommand("radio set wdt 60000\r\n"); // disable for continuous reception // sendCommand("radio set sync 12\r\n"); sendCommand("radio set bw 125\r\n"); } void sendCommand(const char *cmd) { Serial1.print(cmd); String incoming = Serial1.readString(); // SerialUSB.print(cmd); // SerialUSB.println(incoming); } // the loop routine runs over and over again forever: void loop() { char data[64] = {0}; // hexadecimal value representing the data to be transmitted, from 0 to 255 bytes for LoRa modulation and from 0 to 64 bytes for FSK modulation. sprintf(data, "radio tx 1234\r\n"); sendCommand(data); if (msg_num > 10000) msg_num=0; digitalWrite(LED_BUILTIN, 1); delay(400); digitalWrite(LED_BUILTIN, 0); delay(600); } 

By the way, the maximum declared transmission distance for RN2483 is up to 15 km, in practice, in the presence of one-story building, the signal disappears as early as 1 km, and can be no more than 100 m in urban “anthills”.

Run the modem, and proceed to decoding.

Decoding


GNU Radio itself does not support LoRa, so you have to use third-party components. There were only two of them, and unfortunately, both authors showed no imagination in the title, and called them exactly the same - gr-lora ( https://github.com/rpp0/gr-lora and https://github.com/ BastilleResearch / gr-lora, respectively). “Unfortunately” because in GNU Radio it’s impossible to have both components at once, the installer of one component overwrites the files of the other.

rpp0 / gr-lora

You can download decoder sources from github , the build is standard and does not cause any difficulties:

 git clone https://github.com/rpp0/gr-lora.git cd gr-lora mkdir build cd build cmake .. make && sudo make install && sudo ldconfig 

After installation in GNU Radio, additional blocks appear, from which it is easy to assemble a decoder. As the parameters of the decoder, you must specify the bandwidth of the transmission, spreading factor, the center frequency of the SDR and the frequency of reception.



Blocks in GNU Radio are standardized, so you can use any receiver, such as RTL-SDR. I used SDRPlay. A simple Python program was used to output data to the console.

udp_receive.py
 import socket UDP_IP = "127.0.0.1" UDP_PORT = 40868 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((UDP_IP, UDP_PORT)) sock.settimeout(0.5) while True: try: data, addr = sock.recvfrom(128) # buffer size is 1024 bytes print("Msg:", ' '.join('{:02x}'.format(x) for x in data)) except socket.timeout: pass 

The result of the work is shown in the figure.



As you can see, there are header and end blocks in the row, and in the middle we see our data “1234”.

BastilleResearch / gr-lora

This module is remarkable in that it can work not only on reception, but also on transmission. The installation is about the same: the component needs to be assembled from source.

 git clone git://github.com/BastilleResearch/gr-lora.git cd gr-lora mkdir build cd build cmake .. make && sudo make install && sudo ldconfig 

Connection Graph for this decoder is shown in the figure.



As you can see, there are more blocks. Rotator and Polyphase Resampler allocate the desired frequency and cut off the excess, the Demodulator converts "chirps" into a binary code (the output is a sequence like "17 00 3e 00 38 00 2f 00 00 00 39 00 2c 00 30 00 c6 00 18 00 7e 00 d5 00 85 00 e9 00 d8 00 67 00 c4 00 ”), and the Decoder forms the final packet.

Unfortunately, normally it did not work. Decoding definitely works, while the modem is running, data appears, but received messages have nothing to do with the transmitted ones.



I still did not understand the reason, either I was mistaken in the settings somewhere, or this decoder is compatible only with my own encoder. Those interested can check their own using Channel Model.

LoRaWAN


As you can see, the lower, physical transmission layer was considered here. In the higher-level protocol LoRaWAN, another logical level is placed on top - with encryption, keys and other services. Those who want to see how the encoding works can try the online decoder here .

By the way, it follows from this that even if we receive a LoRaWAN signal using SDR, without the presence of encryption keys (one of which is stored on the provider's server), we still will not know the contents of the package.

Conclusion


As you can see, LoRa decoding with SDR is quite possible. Of course, it is hardly advisable to make a real gateway based on SDR - its sensitivity will be worse than the sensitivity of “real” modems, which are specifically designed to receive weak signals, and have more narrow-band filters and LNA. But for testing or research this can be quite interesting.

For those who want to try it out on their own, the GNU Radio source grc files are under the spoiler.

receive1.grc
 <?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.11'?> <flow_graph> <timestamp>Mon Jun 3 09:39:45 2019</timestamp> <block> <key>options</key> <param> <key>author</key> <value></value> </param> <param> <key>window_size</key> <value></value> </param> <param> <key>category</key> <value>[GRC Hier Blocks]</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>description</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(8, 8)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>wx_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>top_block</value> </param> <param> <key>max_nouts</key> <value>0</value> </param> <param> <key>qt_qss_theme</key> <value></value> </param> <param> <key>realtime_scheduling</key> <value></value> </param> <param> <key>run_command</key> <value>{python} -u {filename}</value> </param> <param> <key>run_options</key> <value>prompt</value> </param> <param> <key>run</key> <value>True</value> </param> <param> <key>thread_safe_setters</key> <value></value> </param> <param> <key>title</key> <value></value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(760, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>bw</value> </param> <param> <key>value</key> <value>125000.0</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(936, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>code_rate</value> </param> <param> <key>value</key> <value>4</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(848, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>header</value> </param> <param> <key>value</key> <value>True</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(680, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>ldr</value> </param> <param> <key>value</key> <value>True</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(400, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>offset</value> </param> <param> <key>value</key> <value>-100000.0</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(8, 76)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>samp_rate</value> </param> <param> <key>value</key> <value>1000000</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(544, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>spreading_factor</value> </param> <param> <key>value</key> <value>8</value> </param> </block> <block> <key>blocks_rotator_cc</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(416, 252)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_rotator_cc_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>phase_inc</key> <value>(2 * math.pi * offset) / samp_rate</value> </param> </block> <block> <key>blocks_socket_pdu</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(944, 452)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>host</key> <value>127.0.0.1</value> </param> <param> <key>id</key> <value>blocks_socket_pdu_0</value> </param> <param> <key>mtu</key> <value>10000</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>port</key> <value>40868</value> </param> <param> <key>tcp_no_delay</key> <value>False</value> </param> <param> <key>type</key> <value>"UDP_CLIENT"</value> </param> </block> <block> <key>import</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(296, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>import_0</value> </param> <param> <key>import</key> <value>import math</value> </param> </block> <block> <key>lora_decode</key> <param> <key>alias</key> <value></value> </param> <param> <key>code_rate</key> <value>code_rate</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>header</key> <value>header</value> </param> <param> <key>_coordinate</key> <value>(648, 452)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>lora_decode_0</value> </param> <param> <key>low_data_rate</key> <value>ldr</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>spreading_factor</key> <value>spreading_factor</value> </param> </block> <block> <key>lora_demod</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>fft_factor</key> <value>2</value> </param> <param> <key>beta</key> <value>25.0</value> </param> <param> <key>_coordinate</key> <value>(384, 452)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>lora_demod_0</value> </param> <param> <key>low_data_rate</key> <value>ldr</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>spreading_factor</key> <value>spreading_factor</value> </param> </block> <block> <key>pfb_arb_resampler_xxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(656, 292)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>pfb_arb_resampler_xxx_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>nfilts</key> <value>32</value> </param> <param> <key>rrate</key> <value>bw/samp_rate</value> </param> <param> <key>samp_delay</key> <value>0</value> </param> <param> <key>atten</key> <value>100</value> </param> <param> <key>taps</key> <value></value> </param> <param> <key>type</key> <value>ccf</value> </param> </block> <block> <key>sdrplay_rsp2_source</key> <param> <key>agc_enabled</key> <value>False</value> </param> <param> <key>antenna</key> <value>'A'</value> </param> <param> <key>bw</key> <value>400</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>dc_offset_mode</key> <value>True</value> </param> <param> <key>debug_enabled</key> <value>False</value> </param> <param> <key>device_serial</key> <value>'0'</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(144, 196)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sdrplay_rsp2_source_0</value> </param> <param> <key>if_atten_db</key> <value>30</value> </param> <param> <key>ifType</key> <value>0</value> </param> <param> <key>iq_balance_mode</key> <value>True</value> </param> <param> <key>lna_atten_step</key> <value>3</value> </param> <param> <key>lo_mode</key> <value>1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>rf_freq</key> <value>869.0e6</value> </param> <param> <key>sample_rate</key> <value>samp_rate</value> </param> </block> <block> <key>wxgui_fftsink2</key> <param> <key>avg_alpha</key> <value>0</value> </param> <param> <key>average</key> <value>False</value> </param> <param> <key>baseband_freq</key> <value>0</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fft_size</key> <value>1024</value> </param> <param> <key>freqvar</key> <value>None</value> </param> <param> <key>_coordinate</key> <value>(1000, 116)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>grid_pos</key> <value></value> </param> <param> <key>id</key> <value>wxgui_fftsink2_0</value> </param> <param> <key>notebook</key> <value></value> </param> <param> <key>peak_hold</key> <value>False</value> </param> <param> <key>ref_level</key> <value>0</value> </param> <param> <key>ref_scale</key> <value>2.0</value> </param> <param> <key>fft_rate</key> <value>15</value> </param> <param> <key>samp_rate</key> <value>samp_rate</value> </param> <param> <key>title</key> <value>FFT Plot</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>win_size</key> <value></value> </param> <param> <key>win</key> <value>None</value> </param> <param> <key>y_divs</key> <value>10</value> </param> <param> <key>y_per_div</key> <value>10</value> </param> </block> <connection> <source_block_id>blocks_rotator_cc_0</source_block_id> <sink_block_id>pfb_arb_resampler_xxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_rotator_cc_0</source_block_id> <sink_block_id>wxgui_fftsink2_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>lora_decode_0</source_block_id> <sink_block_id>blocks_socket_pdu_0</sink_block_id> <source_key>out</source_key> <sink_key>pdus</sink_key> </connection> <connection> <source_block_id>lora_demod_0</source_block_id> <sink_block_id>lora_decode_0</sink_block_id> <source_key>out</source_key> <sink_key>in</sink_key> </connection> <connection> <source_block_id>pfb_arb_resampler_xxx_0</source_block_id> <sink_block_id>lora_demod_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>sdrplay_rsp2_source_0</source_block_id> <sink_block_id>blocks_rotator_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph> 


receive2.grc
 <?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.11'?> <flow_graph> <timestamp>Mon Jun 3 09:39:45 2019</timestamp> <block> <key>options</key> <param> <key>author</key> <value></value> </param> <param> <key>window_size</key> <value></value> </param> <param> <key>category</key> <value>[GRC Hier Blocks]</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>description</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(8, 8)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>wx_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>top_block</value> </param> <param> <key>max_nouts</key> <value>0</value> </param> <param> <key>qt_qss_theme</key> <value></value> </param> <param> <key>realtime_scheduling</key> <value></value> </param> <param> <key>run_command</key> <value>{python} -u {filename}</value> </param> <param> <key>run_options</key> <value>prompt</value> </param> <param> <key>run</key> <value>True</value> </param> <param> <key>thread_safe_setters</key> <value></value> </param> <param> <key>title</key> <value></value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(184, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>samp_rate</value> </param> <param> <key>value</key> <value>1000000</value> </param> </block> <block> <key>lora_lora_receiver</key> <param> <key>bandwidth</key> <value>125000</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>crc</key> <value>True</value> </param> <param> <key>center_freq</key> <value>869e6</value> </param> <param> <key>channel_list</key> <value>[869.1e6]</value> </param> <param> <key>cr</key> <value>4</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>conj</key> <value>False</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>decimation</key> <value>1</value> </param> <param> <key>disable_channelization</key> <value>False</value> </param> <param> <key>disable_drift_correction</key> <value>False</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(456, 332)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>lora_lora_receiver_0</value> </param> <param> <key>implicit</key> <value>False</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>reduced_rate</key> <value>False</value> </param> <param> <key>samp_rate</key> <value>1e6</value> </param> <param> <key>sf</key> <value>8</value> </param> </block> <block> <key>lora_message_socket_sink</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(696, 364)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>lora_message_socket_sink_0</value> </param> <param> <key>ip</key> <value>127.0.0.1</value> </param> <param> <key>layer</key> <value>1</value> </param> <param> <key>port</key> <value>40868</value> </param> </block> <block> <key>sdrplay_rsp2_source</key> <param> <key>agc_enabled</key> <value>False</value> </param> <param> <key>antenna</key> <value>'A'</value> </param> <param> <key>bw</key> <value>400</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>dc_offset_mode</key> <value>True</value> </param> <param> <key>debug_enabled</key> <value>False</value> </param> <param> <key>device_serial</key> <value>'0'</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(72, 148)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sdrplay_rsp2_source_0</value> </param> <param> <key>if_atten_db</key> <value>30</value> </param> <param> <key>ifType</key> <value>0</value> </param> <param> <key>iq_balance_mode</key> <value>True</value> </param> <param> <key>lna_atten_step</key> <value>3</value> </param> <param> <key>lo_mode</key> <value>1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>rf_freq</key> <value>869.0e6</value> </param> <param> <key>sample_rate</key> <value>samp_rate</value> </param> </block> <block> <key>wxgui_fftsink2</key> <param> <key>avg_alpha</key> <value>0</value> </param> <param> <key>average</key> <value>True</value> </param> <param> <key>baseband_freq</key> <value>0</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fft_size</key> <value>1024</value> </param> <param> <key>freqvar</key> <value>None</value> </param> <param> <key>_coordinate</key> <value>(688, 108)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>grid_pos</key> <value></value> </param> <param> <key>id</key> <value>wxgui_fftsink2_0</value> </param> <param> <key>notebook</key> <value></value> </param> <param> <key>peak_hold</key> <value>True</value> </param> <param> <key>ref_level</key> <value>0</value> </param> <param> <key>ref_scale</key> <value>2.0</value> </param> <param> <key>fft_rate</key> <value>15</value> </param> <param> <key>samp_rate</key> <value>samp_rate</value> </param> <param> <key>title</key> <value>FFT Plot</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>win_size</key> <value></value> </param> <param> <key>win</key> <value>None</value> </param> <param> <key>y_divs</key> <value>10</value> </param> <param> <key>y_per_div</key> <value>10</value> </param> </block> <connection> <source_block_id>lora_lora_receiver_0</source_block_id> <sink_block_id>lora_message_socket_sink_0</sink_block_id> <source_key>frames</source_key> <sink_key>in</sink_key> </connection> <connection> <source_block_id>sdrplay_rsp2_source_0</source_block_id> <sink_block_id>lora_lora_receiver_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>sdrplay_rsp2_source_0</source_block_id> <sink_block_id>wxgui_fftsink2_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph> 


All successful experiments.

Source: https://habr.com/ru/post/454666/


All Articles