diff options
| Commit | eebf1194a4981fad9ea21db70bc79ce5ad739087 (patch) | |
|---|---|---|
| Author | 2025-08-09 09:17:29 +0300 | |
| Committer | 2025-08-09 09:17:29 +0300 | |
| Files | 488218e74f5a78585b9cffb25b949e5cffd7d73a | |
| sdr-projects-eebf1194a4981fad9ea21db70bc79ce5ad739087.tar sdr-projects-eebf1194a4981fad9ea21db70bc79ce5ad739087.tar.gz sdr-projects-eebf1194a4981fad9ea21db70bc79ce5ad739087.zip | ||
| Parent | 26255af9c928a9c9ddc5c81ef9d5a800776bb8d9 (diff) | |
feat(gnuradio): Add a hello world (FM reciever) flowgraph
2 files changed, 589 insertions, 0 deletions
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | gnuradio/01HelloWorld.grc | 587 |
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0c30de9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +gnuradio/*.py +gnuradio/__pycache__ diff --git a/gnuradio/01HelloWorld.grc b/gnuradio/01HelloWorld.grc new file mode 100644 index 0000000..bd65f3f --- /dev/null +++ b/gnuradio/01HelloWorld.grc @@ -0,0 +1,587 @@ +options: + parameters: + author: '' + catch_exceptions: 'True' + category: '[GRC Hier Blocks]' + cmake_opt: '' + comment: '' + copyright: '' + description: https://gallicchio.github.io/learnSDR/lesson01.html + gen_cmake: 'On' + gen_linking: dynamic + generate_options: qt_gui + hier_block_src_path: '.:' + id: RTL_SDR_FM + max_nouts: '0' + output_language: python + placement: (0,0) + qt_qss_theme: '' + realtime_scheduling: '' + run: 'True' + run_command: '{python} -u {filename}' + run_options: prompt + sizing_mode: fixed + thread_safe_setters: '' + title: Hello World + window_size: (1000,1000) + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [8, 4.0] + rotation: 0 + state: enabled + +blocks: +- name: freq + id: variable + parameters: + comment: '' + value: freq_range*1e6 + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [32, 324.0] + rotation: 0 + state: enabled +- name: freq_range + id: variable_qtgui_range + parameters: + comment: '' + gui_hint: '' + label: '' + min_len: '200' + orient: QtCore.Qt.Horizontal + rangeType: float + start: '87.5' + step: '0.1' + stop: '108' + value: '88' + widget: counter_slider + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [328, 388.0] + rotation: 0 + state: enabled +- name: samp_rate + id: variable + parameters: + comment: '' + value: 2.4e6 + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [32, 252.0] + rotation: 0 + state: enabled +- name: analog_wfm_rcv_0 + id: analog_wfm_rcv + parameters: + affinity: '' + alias: '' + audio_decimation: '10' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + quad_rate: samp_rate/5 + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [576, 276.0] + rotation: 0 + state: enabled +- name: audio_sink_0 + id: audio_sink + parameters: + affinity: '' + alias: '' + comment: '' + device_name: '' + num_inputs: '1' + ok_to_block: 'True' + samp_rate: '48000' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [616, 484.0] + rotation: 0 + state: enabled +- name: low_pass_filter_0 + id: low_pass_filter + parameters: + affinity: '' + alias: '' + beta: '6.76' + comment: '' + cutoff_freq: 0.05e6 + decim: '5' + gain: '1' + interp: '1' + maxoutbuf: '0' + minoutbuf: '0' + samp_rate: samp_rate + type: fir_filter_ccf + width: 0.025e6 + win: window.WIN_HAMMING + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [296, 148.0] + rotation: 0 + state: enabled +- name: note_0 + id: note + parameters: + alias: '' + comment: "Decimation \u0441\u0435 \u0432\u043E\u0434\u0438, \u0447\u0435 \"\u043F\ + \u0440\u0435\u043C\u0430\u0445\u0432\u0430 \u0432\u0441\u0435\u043A\u0438 N-\u0442\ + \u0438 sample\" \u043D\u0430 \u0441\u0438\u0433\u043D\u0430\u043B\u0430, \u043E\ + \u0431\u0430\u0447\u0435 \u0438\u043C\u0430 \u043D\u044F\u043A\u043E\u0438 \u0434\ + \u0435\u0442\u0430\u0439\u043B\u0438.\n\u0415\u0444\u0435\u043A\u0442\u0430\ + \ \u043D\u0430 decimation \u0435 \u0440\u0430\u0437\u043B\u0438\u0447\u0435\u043D\ + \ \u043E\u0442 sample rate, \u0437\u0430\u0449\u043E\u0442\u043E \u043F\u0440\ + \u0438 decimation\n\u043D\u0430\u043C\u0430\u043B\u044F\u043C\u0435 \u0432\u0438\ + \u0441\u043E\u043A\u043E\u0447\u0435\u0441\u0442\u043E\u0442\u043D\u0438\u0442\ + \u0435 \u0441\u0438\u0433\u043D\u0430\u043B\u0438 \u0447\u0440\u0435\u0437 \u0441\ + \u0430\u043C\u0438\u044F low pass filter.\n\n\u0421\u043F\u043E\u0440\u0435\u0434\ + \ \u0442\u0435\u043E\u0440\u0435\u043C\u0430\u0442\u0430 \u043D\u0430 Nyquist\u2013\ + Shannon, \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 sample-\u0432\u0430\ + \u043C\u0435 \u043F\u043E\u043D\u0435 2x \u043D\u0430 \u043D\u0430\u0439-\u0432\ + \u0438\u0441\u043E\u043A\u043E\u0447\u0435\u0441\u0442\u043E\u0442\u043D\u0430\ + \u0442\u0430 \u0432\u044A\u043B\u043D\u0430 (\u043F\u043E-\u043A\u043E\u043D\ + \u043A\u0440\u0435\u0442\u043D\u043E bandwidth).\n\u0412 Low Pass Filter \u0431\ + \u044F\u0445 \u0441\u043B\u043E\u0436\u0438\u043B Decimation=1 \u0438 SampleRate=samp_rate/5,\ + \ \u043A\u043E\u0435\u0442\u043E \u0435 \u0440\u0430\u0437\u043B\u0438\u0447\ + \u043D\u043E \u043E\u0442 Decimation=5 \u0438 SampleRate=samp_rate.\n\n\u041F\ + \u0440\u0438 \u043F\u044A\u0440\u0432\u043E\u0442\u043E, \u0443\u0434\u0440\u044F\ + \u043C \u043D\u0430 \u0442\u0435\u043E\u0440\u0435\u043C\u0430\u0442\u0430,\ + \ \u0437\u0430\u0449\u043E\u0442\u043E \u043F\u0440\u0430\u0432\u044F sampling\ + \ \u043D\u0430 480k, \u0434\u043E\u043A\u0430\u0442\u043E bandwidth \u043C\u0438\ + \ \u0435 1.4M (2.4M / 2 ; RTLSDR sample rate = 2 * bandwidth).\n\u041F\u0440\ + \u0438 \u0432\u0442\u043E\u0440\u043E\u0442\u043E, \u043F\u044A\u0440\u0432\u043E\ + \ \u0441\u0438\u0433\u043D\u0430\u043B\u0430 (\u043D\u0430 \u043F\u044A\u043B\ + \u0435\u043D sample rate) \u043C\u0438\u043D\u0430\u0432\u0430 \u043F\u0440\u0435\ + \u0437 \u0444\u0438\u043B\u0442\u044A\u0440\u0430 (\u0442.\u0435. \u0432\u0441\ + \u0438\u0447\u043A\u043E \u043D\u0430\u0434 50k \u0441\u0435 \u043D\u0430\u043C\ + \u0430\u043B\u044F \u0434\u043E 0) \u0438 \u0441\u043B\u0435\u0434 \u0442\u043E\ + \u0432\u0430 \u0441\u0435 \u043D\u0430\u043C\u0430\u043B\u044F sample rate-\u0430\ + \ \u043D\u0430 480k" + note: Decimation vs sample rate + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [8, 468.0] + rotation: 0 + state: enabled +- name: note_1 + id: note + parameters: + alias: '' + comment: "RTLSDR sample rate = 2 * band width\n\u0421\u0438\u0433\u043D\u0430\u043B\ + \u0438\u0442\u0435 \u043E\u0442 \u0446\u0435\u043D\u0442\u0440\u0430\u043B\u043D\ + \u0430\u0442\u0430 \u0447\u0435\u0441\u0442\u043E\u0442\u0430 \u0441\u0435 \u0438\ + \u0437\u0432\u0430\u0436\u0434\u0430\u0442 (\u0446\u0435\u043D\u0442\u0440\u0438\ + \u0440\u0430\u0442),\n\u0442\u0430\u043A\u0430 \u0447\u0435 \u0446\u0435\u043D\ + \u0442\u0440\u0430\u043B\u043D\u0430\u0442\u0430 \u0447\u0435\u0441\u0442\u043E\ + \u0442\u0430 \u0434\u0430 \u0435 0.\n\u0417\u0430\u0442\u043E\u0432\u0430 \u043D\ + \u0435 \u0441\u0442\u0438\u0433\u0430\u043C\u0435 \u0434\u043E \u043F\u0440\u043E\ + \u0431\u043B\u0435\u043C\u0438 (\u0441 Nyquist\u2013Shannon) \u0432\u044A\u043F\ + \u0440\u0435\u043A\u0438, \u0447\u0435\n\u0432\u0437\u0435\u043C\u0430\u043C\ + \u0435 \u0441\u0438\u0433\u043D\u0430\u043B\u0438 \u043E\u0442 (\u043F\u0440\ + \u0438\u043C\u0435\u0440\u043D\u043E) 88M \u0441\u044A\u0441 sample rate \u043E\ + \u0442 2.4M." + note: RTLSDR bandwidth + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [176, 4.0] + rotation: 0 + state: enabled +- name: qtgui_freq_sink_x_0 + id: qtgui_freq_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + average: '1.0' + axislabels: 'True' + bw: samp_rate + color1: '"blue"' + color10: '"dark blue"' + color2: '"red"' + color3: '"green"' + color4: '"black"' + color5: '"cyan"' + color6: '"magenta"' + color7: '"yellow"' + color8: '"dark red"' + color9: '"dark green"' + comment: '' + ctrlpanel: 'False' + fc: freq + fftsize: '1024' + freqhalf: 'True' + grid: 'False' + gui_hint: '' + label: Relative Gain + label1: '' + label10: '''''' + label2: '''''' + label3: '''''' + label4: '''''' + label5: '''''' + label6: '''''' + label7: '''''' + label8: '''''' + label9: '''''' + legend: 'True' + maxoutbuf: '0' + minoutbuf: '0' + name: Entire band + nconnections: '1' + norm_window: 'False' + showports: 'False' + tr_chan: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_tag: '""' + type: complex + units: dB + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + wintype: window.WIN_BLACKMAN_hARRIS + ymax: '10' + ymin: '-140' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [296, 284.0] + rotation: 0 + state: enabled +- name: qtgui_freq_sink_x_1 + id: qtgui_freq_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + average: '1.0' + axislabels: 'True' + bw: samp_rate/5 + color1: '"blue"' + color10: '"dark blue"' + color2: '"red"' + color3: '"green"' + color4: '"black"' + color5: '"cyan"' + color6: '"magenta"' + color7: '"yellow"' + color8: '"dark red"' + color9: '"dark green"' + comment: '' + ctrlpanel: 'False' + fc: '0' + fftsize: '1024' + freqhalf: 'True' + grid: 'False' + gui_hint: '' + label: Relative Gain + label1: '' + label10: '''''' + label2: '''''' + label3: '''''' + label4: '''''' + label5: '''''' + label6: '''''' + label7: '''''' + label8: '''''' + label9: '''''' + legend: 'True' + maxoutbuf: '0' + minoutbuf: '0' + name: After low pass filter + nconnections: '1' + norm_window: 'False' + showports: 'False' + tr_chan: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_tag: '""' + type: complex + units: dB + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + wintype: window.WIN_BLACKMAN_hARRIS + ymax: '10' + ymin: '-140' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [576, 76.0] + rotation: 0 + state: enabled +- name: qtgui_freq_sink_x_2 + id: qtgui_freq_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + average: '1.0' + axislabels: 'True' + bw: samp_rate/5/10 + color1: '"blue"' + color10: '"dark blue"' + color2: '"red"' + color3: '"green"' + color4: '"black"' + color5: '"cyan"' + color6: '"magenta"' + color7: '"yellow"' + color8: '"dark red"' + color9: '"dark green"' + comment: '' + ctrlpanel: 'False' + fc: '0' + fftsize: '1024' + freqhalf: 'True' + grid: 'False' + gui_hint: '' + label: Relative Gain + label1: Audio + label10: '''''' + label2: '''''' + label3: '''''' + label4: '''''' + label5: '''''' + label6: '''''' + label7: '''''' + label8: '''''' + label9: '''''' + legend: 'True' + maxoutbuf: '0' + minoutbuf: '0' + name: Audio + nconnections: '1' + norm_window: 'False' + showports: 'False' + tr_chan: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_tag: '""' + type: float + units: dB + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + wintype: window.WIN_BLACKMAN_hARRIS + ymax: '10' + ymin: '-140' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [608, 388.0] + rotation: 0 + state: enabled +- name: qtgui_time_sink_x_0 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: "\u0412\u0445\u043E\u0434\u043D\u0438\u0442\u0435 \u0434\u0430\u043D\u043D\ + \u0438 \u0441\u0430 \u043A\u043E\u043C\u043F\u043B\u0435\u043A\u0441\u043D\u0438\ + \ \u0447\u0438\u0441\u043B\u0430" + ctrlpanel: 'False' + entags: 'True' + grid: 'False' + gui_hint: '' + label1: Real + label10: Signal 10 + label2: Imag + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '""' + nconnections: '1' + size: '1024' + srate: samp_rate/5 + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: complex + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: Amplitude + ymax: '1' + ymin: '-1' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [576, 172.0] + rotation: 0 + state: enabled +- name: soapy_rtlsdr_source_0 + id: soapy_rtlsdr_source + parameters: + affinity: '' + agc: 'False' + alias: '' + bias: 'False' + bufflen: '16384' + center_freq: freq + comment: '' + dev_args: '' + freq_correction: '0' + gain: '20' + maxoutbuf: '0' + minoutbuf: '0' + samp_rate: samp_rate + type: fc32 + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [32, 180.0] + rotation: 0 + state: enabled + +connections: +- [analog_wfm_rcv_0, '0', audio_sink_0, '0'] +- [analog_wfm_rcv_0, '0', qtgui_freq_sink_x_2, '0'] +- [low_pass_filter_0, '0', analog_wfm_rcv_0, '0'] +- [low_pass_filter_0, '0', qtgui_freq_sink_x_1, '0'] +- [low_pass_filter_0, '0', qtgui_time_sink_x_0, '0'] +- [soapy_rtlsdr_source_0, '0', low_pass_filter_0, '0'] +- [soapy_rtlsdr_source_0, '0', qtgui_freq_sink_x_0, '0'] + +metadata: + file_format: 1 + grc_version: 3.10.12.0 |