Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commiteebf1194a4981fad9ea21db70bc79ce5ad739087 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-08-09 09:17:29 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-08-09 09:17:29 +0300
Files488218e74f5a78585b9cffb25b949e5cffd7d73a
sdr-projects-eebf1194a4981fad9ea21db70bc79ce5ad739087.tar
sdr-projects-eebf1194a4981fad9ea21db70bc79ce5ad739087.tar.gz
sdr-projects-eebf1194a4981fad9ea21db70bc79ce5ad739087.zip
Parent26255af9c928a9c9ddc5c81ef9d5a800776bb8d9 (diff)
feat(gnuradio): Add a hello world (FM reciever) flowgraph
2 files changed, 589 insertions, 0 deletions
-rw-r--r--.gitignore2
-rw-r--r--gnuradio/01HelloWorld.grc587
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