From version < 26.1 >
edited by Jean-Yves Dupertuis
on 27-03-2018, 17:03
To version < 30.1 >
edited by Jean-Yves Dupertuis
on 27-03-2018, 17:23
< >
Change comment: Ajout de l'image terminalDirectPython.png

Summary

Details

Page properties
Content
... ... @@ -178,4 +178,20 @@
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 +[[image:DJtestDaarioSDR.png||height="545" width="562"]]
190 +
191 +
192 +Normalement on doit pouvoir lancer directement avec le fichier python :
193 +
194 +[[DJTestRadioSDR.py>>attach:DJTestRadioSDR.py||title="fonctionne avec python 2.7"]]
195 +
196 +
197 +[[image:testRadioSDR.png||height="358" width="599"]]
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 +
DJtestDaarioSDR.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.Dupertuis
Size
... ... @@ -1,0 +1,1 @@
1 +107.0 KB
Content
terminalDirectPython.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.Dupertuis
Size
... ... @@ -1,0 +1,1 @@
1 +46.8 KB
Content
testRadioSDR.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.Dupertuis
Size
... ... @@ -1,0 +1,1 @@
1 +279.5 KB
Content