Changes for page SDR
Last modified by Administrator on 10-03-2021, 11:01
edited by Jean-Yves Dupertuis
on 27-03-2018, 17:03
on 27-03-2018, 17:03
edited by Jean-Yves Dupertuis
on 27-03-2018, 17:07
on 27-03-2018, 17:07
Change comment:
Ajout de l'image testRadioSDR.png
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Attachments (0 modified, 2 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -178,4 +178,14 @@ 178 178 Après scan, je trouve une radio sur 98,2 MHz 179 179 180 180 181 -== GNURadio == 181 +== GNURadio == 182 + 183 +En suivant l'excellent document qui se trouve : 184 +http://f0fyf.blogspot.ch/2014/08/recepteur-fm-avec-gnuradio.html 185 +je réalise mon premier programme SDR avec ma clef RTL-SDR. 186 + 187 +[[testSDR.grc>>attach:testSDR.grc]] 188 + 189 +Normalement on doit pouvoir lancer directement avec le fichier python : 190 + 191 +[[DJTestRadioSDR.py>>attach:DJTestRadioSDR.py||title="fonctionne avec python 2.7"]]
- DJTestRadioSDR.py
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.Dupertuis - Size
-
... ... @@ -1,0 +1,1 @@ 1 +7.3 KB - Content
-
... ... @@ -1,0 +1,220 @@ 1 +#!/usr/bin/env python2 2 +# -*- coding: utf-8 -*- 3 +################################################## 4 +# GNU Radio Python Flow Graph 5 +# Title: Test Radion SDR 6 +# Author: Jean-Yves HB9FOU 7 +# Generated: Tue Mar 27 17:01:00 2018 8 +################################################## 9 + 10 +if __name__ == '__main__': 11 + import ctypes 12 + import sys 13 + if sys.platform.startswith('linux'): 14 + try: 15 + x11 = ctypes.cdll.LoadLibrary('libX11.so') 16 + x11.XInitThreads() 17 + except: 18 + print "Warning: failed to XInitThreads()" 19 + 20 +from gnuradio import analog 21 +from gnuradio import audio 22 +from gnuradio import blocks 23 +from gnuradio import eng_notation 24 +from gnuradio import filter 25 +from gnuradio import gr 26 +from gnuradio import wxgui 27 +from gnuradio.eng_option import eng_option 28 +from gnuradio.fft import window 29 +from gnuradio.filter import firdes 30 +from gnuradio.wxgui import forms 31 +from gnuradio.wxgui import waterfallsink2 32 +from grc_gnuradio import wxgui as grc_wxgui 33 +from optparse import OptionParser 34 +import osmosdr 35 +import time 36 +import wx 37 + 38 + 39 +class DJTestRadioSDR(grc_wxgui.top_block_gui): 40 + 41 + def __init__(self): 42 + grc_wxgui.top_block_gui.__init__(self, title="Test Radion SDR") 43 + _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" 44 + self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) 45 + 46 + ################################################## 47 + # Variables 48 + ################################################## 49 + self.samp_rate = samp_rate = 2e6 50 + self.quadrature = quadrature = 500e3 51 + self.freq = freq = 98.2 52 + self.cutoff = cutoff = 100e3 53 + self.audio_dec = audio_dec = 10 54 + self.Volume = Volume = 8 55 + 56 + ################################################## 57 + # Blocks 58 + ################################################## 59 + _freq_sizer = wx.BoxSizer(wx.VERTICAL) 60 + self._freq_text_box = forms.text_box( 61 + parent=self.GetWin(), 62 + sizer=_freq_sizer, 63 + value=self.freq, 64 + callback=self.set_freq, 65 + label="Frequence", 66 + converter=forms.float_converter(), 67 + proportion=0, 68 + ) 69 + self._freq_slider = forms.slider( 70 + parent=self.GetWin(), 71 + sizer=_freq_sizer, 72 + value=self.freq, 73 + callback=self.set_freq, 74 + minimum=88, 75 + maximum=108, 76 + num_steps=100, 77 + style=wx.SL_HORIZONTAL, 78 + cast=float, 79 + proportion=1, 80 + ) 81 + self.Add(_freq_sizer) 82 + _Volume_sizer = wx.BoxSizer(wx.VERTICAL) 83 + self._Volume_text_box = forms.text_box( 84 + parent=self.GetWin(), 85 + sizer=_Volume_sizer, 86 + value=self.Volume, 87 + callback=self.set_Volume, 88 + label="volume", 89 + converter=forms.float_converter(), 90 + proportion=0, 91 + ) 92 + self._Volume_slider = forms.slider( 93 + parent=self.GetWin(), 94 + sizer=_Volume_sizer, 95 + value=self.Volume, 96 + callback=self.set_Volume, 97 + minimum=0, 98 + maximum=100, 99 + num_steps=100, 100 + style=wx.SL_HORIZONTAL, 101 + cast=float, 102 + proportion=1, 103 + ) 104 + self.Add(_Volume_sizer) 105 + self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_c( 106 + self.GetWin(), 107 + baseband_freq=0, 108 + dynamic_range=100, 109 + ref_level=0, 110 + ref_scale=2.0, 111 + sample_rate=samp_rate, 112 + fft_size=512, 113 + fft_rate=15, 114 + average=False, 115 + avg_alpha=None, 116 + title="Waterfall ", 117 + ) 118 + self.Add(self.wxgui_waterfallsink2_0.win) 119 + self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" ) 120 + self.rtlsdr_source_0.set_sample_rate(samp_rate) 121 + self.rtlsdr_source_0.set_center_freq(freq*1e6, 0) 122 + self.rtlsdr_source_0.set_freq_corr(-30, 0) 123 + self.rtlsdr_source_0.set_dc_offset_mode(0, 0) 124 + self.rtlsdr_source_0.set_iq_balance_mode(0, 0) 125 + self.rtlsdr_source_0.set_gain_mode(True, 0) 126 + self.rtlsdr_source_0.set_gain(50, 0) 127 + self.rtlsdr_source_0.set_if_gain(30, 0) 128 + self.rtlsdr_source_0.set_bb_gain(20, 0) 129 + self.rtlsdr_source_0.set_antenna("1", 0) 130 + self.rtlsdr_source_0.set_bandwidth(0, 0) 131 + 132 + self.rational_resampler_xxx_1 = filter.rational_resampler_fff( 133 + interpolation=48, 134 + decimation=int(quadrature/1e3/audio_dec), 135 + taps=None, 136 + fractional_bw=None, 137 + ) 138 + self.rational_resampler_xxx_0 = filter.rational_resampler_ccc( 139 + interpolation=1, 140 + decimation=int(samp_rate/quadrature), 141 + taps=None, 142 + fractional_bw=None, 143 + ) 144 + self.low_pass_filter_0 = filter.fir_filter_ccf(1, firdes.low_pass( 145 + 1, samp_rate, cutoff, 1e6, firdes.WIN_HAMMING, 6.76)) 146 + self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((Volume, )) 147 + self.audio_sink_0 = audio.sink(48000, "", True) 148 + self.analog_wfm_rcv_0 = analog.wfm_rcv( 149 + quad_rate=quadrature, 150 + audio_decimation=audio_dec, 151 + ) 152 + 153 + ################################################## 154 + # Connections 155 + ################################################## 156 + self.connect((self.analog_wfm_rcv_0, 0), (self.rational_resampler_xxx_1, 0)) 157 + self.connect((self.blocks_multiply_const_vxx_0, 0), (self.audio_sink_0, 0)) 158 + self.connect((self.low_pass_filter_0, 0), (self.analog_wfm_rcv_0, 0)) 159 + self.connect((self.rational_resampler_xxx_0, 0), (self.low_pass_filter_0, 0)) 160 + self.connect((self.rational_resampler_xxx_1, 0), (self.blocks_multiply_const_vxx_0, 0)) 161 + self.connect((self.rtlsdr_source_0, 0), (self.rational_resampler_xxx_0, 0)) 162 + self.connect((self.rtlsdr_source_0, 0), (self.wxgui_waterfallsink2_0, 0)) 163 + 164 + def get_samp_rate(self): 165 + return self.samp_rate 166 + 167 + def set_samp_rate(self, samp_rate): 168 + self.samp_rate = samp_rate 169 + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, self.cutoff, 1e6, firdes.WIN_HAMMING, 6.76)) 170 + self.rtlsdr_source_0.set_sample_rate(self.samp_rate) 171 + self.wxgui_waterfallsink2_0.set_sample_rate(self.samp_rate) 172 + 173 + def get_quadrature(self): 174 + return self.quadrature 175 + 176 + def set_quadrature(self, quadrature): 177 + self.quadrature = quadrature 178 + 179 + def get_freq(self): 180 + return self.freq 181 + 182 + def set_freq(self, freq): 183 + self.freq = freq 184 + self._freq_slider.set_value(self.freq) 185 + self._freq_text_box.set_value(self.freq) 186 + self.rtlsdr_source_0.set_center_freq(self.freq*1e6, 0) 187 + 188 + def get_cutoff(self): 189 + return self.cutoff 190 + 191 + def set_cutoff(self, cutoff): 192 + self.cutoff = cutoff 193 + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, self.cutoff, 1e6, firdes.WIN_HAMMING, 6.76)) 194 + 195 + def get_audio_dec(self): 196 + return self.audio_dec 197 + 198 + def set_audio_dec(self, audio_dec): 199 + self.audio_dec = audio_dec 200 + 201 + def get_Volume(self): 202 + return self.Volume 203 + 204 + def set_Volume(self, Volume): 205 + self.Volume = Volume 206 + self._Volume_slider.set_value(self.Volume) 207 + self._Volume_text_box.set_value(self.Volume) 208 + self.blocks_multiply_const_vxx_0.set_k((self.Volume, )) 209 + 210 + 211 +def main(top_block_cls=DJTestRadioSDR, options=None): 212 + 213 + tb = top_block_cls() 214 + tb.Start(True) 215 + tb.Wait() 216 + 217 + 218 +if __name__ == '__main__': 219 + main() 220 +
- testRadioSDR.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.Dupertuis - Size
-
... ... @@ -1,0 +1,1 @@ 1 +279.5 KB - Content