Commit 6ece6f5212eaa62e8b789ea4d9f8e597a8a8672f

Authored by bmarechal
1 parent 3600e4e382
Exists in master

use resamplers instead LP

Showing 2 changed files with 295 additions and 103 deletions Side-by-side Diff

fm_radio/fm_radio.grc
... ... @@ -82,6 +82,33 @@
82 82 </param>
83 83 </block>
84 84 <block>
  85 + <key>variable</key>
  86 + <param>
  87 + <key>comment</key>
  88 + <value></value>
  89 + </param>
  90 + <param>
  91 + <key>_enabled</key>
  92 + <value>True</value>
  93 + </param>
  94 + <param>
  95 + <key>_coordinate</key>
  96 + <value>(176, 160)</value>
  97 + </param>
  98 + <param>
  99 + <key>_rotation</key>
  100 + <value>0</value>
  101 + </param>
  102 + <param>
  103 + <key>id</key>
  104 + <value>decim</value>
  105 + </param>
  106 + <param>
  107 + <key>value</key>
  108 + <value>4</value>
  109 + </param>
  110 + </block>
  111 + <block>
85 112 <key>variable_qtgui_range</key>
86 113 <param>
87 114 <key>comment</key>
... ... @@ -89,7 +116,7 @@
89 116 </param>
90 117 <param>
91 118 <key>value</key>
92   - <value>100e6</value>
  119 + <value>98.7e6</value>
93 120 </param>
94 121 <param>
95 122 <key>_enabled</key>
... ... @@ -168,7 +195,7 @@
168 195 </param>
169 196 <param>
170 197 <key>value</key>
171   - <value>2e6</value>
  198 + <value>48e3</value>
172 199 </param>
173 200 </block>
174 201 <block>
... ... @@ -195,7 +222,7 @@
195 222 </param>
196 223 <param>
197 224 <key>_coordinate</key>
198   - <value>(624, 448)</value>
  225 + <value>(608, 448)</value>
199 226 </param>
200 227 <param>
201 228 <key>_rotation</key>
... ... @@ -215,7 +242,7 @@
215 242 </param>
216 243 <param>
217 244 <key>quad_rate</key>
218   - <value>500e3</value>
  245 + <value>samp_rate*10</value>
219 246 </param>
220 247 </block>
221 248 <block>
... ... @@ -242,7 +269,7 @@
242 269 </param>
243 270 <param>
244 271 <key>_coordinate</key>
245   - <value>(1032, 456)</value>
  272 + <value>(1104, 456)</value>
246 273 </param>
247 274 <param>
248 275 <key>_rotation</key>
249 276  
250 277  
... ... @@ -262,89 +289,14 @@
262 289 </param>
263 290 <param>
264 291 <key>samp_rate</key>
265   - <value>48000</value>
  292 + <value>int(samp_rate)</value>
266 293 </param>
267 294 </block>
268 295 <block>
269   - <key>low_pass_filter</key>
270   - <param>
271   - <key>beta</key>
272   - <value>6.76</value>
273   - </param>
274   - <param>
275   - <key>alias</key>
276   - <value></value>
277   - </param>
278   - <param>
279   - <key>comment</key>
280   - <value></value>
281   - </param>
282   - <param>
283   - <key>affinity</key>
284   - <value></value>
285   - </param>
286   - <param>
287   - <key>cutoff_freq</key>
288   - <value>500e3</value>
289   - </param>
290   - <param>
291   - <key>decim</key>
292   - <value>4</value>
293   - </param>
294   - <param>
295   - <key>_enabled</key>
296   - <value>True</value>
297   - </param>
298   - <param>
299   - <key>type</key>
300   - <value>fir_filter_ccf</value>
301   - </param>
302   - <param>
303   - <key>_coordinate</key>
304   - <value>(408, 408)</value>
305   - </param>
306   - <param>
307   - <key>_rotation</key>
308   - <value>0</value>
309   - </param>
310   - <param>
311   - <key>gain</key>
312   - <value>1</value>
313   - </param>
314   - <param>
315   - <key>id</key>
316   - <value>low_pass_filter_0</value>
317   - </param>
318   - <param>
319   - <key>interp</key>
320   - <value>1</value>
321   - </param>
322   - <param>
323   - <key>maxoutbuf</key>
324   - <value>0</value>
325   - </param>
326   - <param>
327   - <key>minoutbuf</key>
328   - <value>0</value>
329   - </param>
330   - <param>
331   - <key>samp_rate</key>
332   - <value>samp_rate</value>
333   - </param>
334   - <param>
335   - <key>width</key>
336   - <value>1e6</value>
337   - </param>
338   - <param>
339   - <key>win</key>
340   - <value>firdes.WIN_HAMMING</value>
341   - </param>
342   - </block>
343   - <block>
344 296 <key>qtgui_sink_x</key>
345 297 <param>
346 298 <key>bw</key>
347   - <value>samp_rate</value>
  299 + <value>samp_rate*10*4</value>
348 300 </param>
349 301 <param>
350 302 <key>alias</key>
... ... @@ -368,7 +320,7 @@
368 320 </param>
369 321 <param>
370 322 <key>_enabled</key>
371   - <value>True</value>
  323 + <value>0</value>
372 324 </param>
373 325 <param>
374 326 <key>fftsize</key>
... ... @@ -376,7 +328,7 @@
376 328 </param>
377 329 <param>
378 330 <key>_coordinate</key>
379   - <value>(392, 584)</value>
  331 + <value>(392, 184)</value>
380 332 </param>
381 333 <param>
382 334 <key>gui_hint</key>
... ... @@ -443,7 +395,7 @@
443 395 <key>qtgui_sink_x</key>
444 396 <param>
445 397 <key>bw</key>
446   - <value>samp_rate/4</value>
  398 + <value>samp_rate/decim</value>
447 399 </param>
448 400 <param>
449 401 <key>alias</key>
... ... @@ -475,7 +427,7 @@
475 427 </param>
476 428 <param>
477 429 <key>_coordinate</key>
478   - <value>(632, 584)</value>
  430 + <value>(840, 176)</value>
479 431 </param>
480 432 <param>
481 433 <key>gui_hint</key>
... ... @@ -487,7 +439,7 @@
487 439 </param>
488 440 <param>
489 441 <key>id</key>
490   - <value>qtgui_sink_x_0_0</value>
  442 + <value>qtgui_sink_x_1</value>
491 443 </param>
492 444 <param>
493 445 <key>maxoutbuf</key>
... ... @@ -527,7 +479,7 @@
527 479 </param>
528 480 <param>
529 481 <key>type</key>
530   - <value>complex</value>
  482 + <value>float</value>
531 483 </param>
532 484 <param>
533 485 <key>rate</key>
534 486  
... ... @@ -554,11 +506,11 @@
554 506 </param>
555 507 <param>
556 508 <key>decim</key>
557   - <value>500</value>
  509 + <value>10</value>
558 510 </param>
559 511 <param>
560 512 <key>_enabled</key>
561   - <value>True</value>
  513 + <value>1</value>
562 514 </param>
563 515 <param>
564 516 <key>fbw</key>
... ... @@ -566,7 +518,7 @@
566 518 </param>
567 519 <param>
568 520 <key>_coordinate</key>
569   - <value>(824, 432)</value>
  521 + <value>(848, 432)</value>
570 522 </param>
571 523 <param>
572 524 <key>_rotation</key>
... ... @@ -578,7 +530,7 @@
578 530 </param>
579 531 <param>
580 532 <key>interp</key>
581   - <value>48</value>
  533 + <value>1</value>
582 534 </param>
583 535 <param>
584 536 <key>maxoutbuf</key>
... ... @@ -598,6 +550,65 @@
598 550 </param>
599 551 </block>
600 552 <block>
  553 + <key>rational_resampler_xxx</key>
  554 + <param>
  555 + <key>alias</key>
  556 + <value></value>
  557 + </param>
  558 + <param>
  559 + <key>comment</key>
  560 + <value></value>
  561 + </param>
  562 + <param>
  563 + <key>affinity</key>
  564 + <value></value>
  565 + </param>
  566 + <param>
  567 + <key>decim</key>
  568 + <value>4</value>
  569 + </param>
  570 + <param>
  571 + <key>_enabled</key>
  572 + <value>1</value>
  573 + </param>
  574 + <param>
  575 + <key>fbw</key>
  576 + <value>0</value>
  577 + </param>
  578 + <param>
  579 + <key>_coordinate</key>
  580 + <value>(400, 432)</value>
  581 + </param>
  582 + <param>
  583 + <key>_rotation</key>
  584 + <value>0</value>
  585 + </param>
  586 + <param>
  587 + <key>id</key>
  588 + <value>rational_resampler_xxx_0_0</value>
  589 + </param>
  590 + <param>
  591 + <key>interp</key>
  592 + <value>1</value>
  593 + </param>
  594 + <param>
  595 + <key>maxoutbuf</key>
  596 + <value>0</value>
  597 + </param>
  598 + <param>
  599 + <key>minoutbuf</key>
  600 + <value>0</value>
  601 + </param>
  602 + <param>
  603 + <key>taps</key>
  604 + <value></value>
  605 + </param>
  606 + <param>
  607 + <key>type</key>
  608 + <value>ccc</value>
  609 + </param>
  610 + </block>
  611 + <block>
601 612 <key>rtlsdr_source</key>
602 613 <param>
603 614 <key>alias</key>
... ... @@ -1897,7 +1908,7 @@
1897 1908 </param>
1898 1909 <param>
1899 1910 <key>_enabled</key>
1900   - <value>True</value>
  1911 + <value>1</value>
1901 1912 </param>
1902 1913 <param>
1903 1914 <key>_coordinate</key>
... ... @@ -1997,7 +2008,7 @@
1997 2008 </param>
1998 2009 <param>
1999 2010 <key>sample_rate</key>
2000   - <value>samp_rate</value>
  2011 + <value>samp_rate*10*4</value>
2001 2012 </param>
2002 2013 <param>
2003 2014 <key>sync</key>
2004 2015  
2005 2016  
2006 2017  
2007 2018  
2008 2019  
... ... @@ -2006,37 +2017,37 @@
2006 2017 </block>
2007 2018 <connection>
2008 2019 <source_block_id>analog_wfm_rcv_0</source_block_id>
2009   - <sink_block_id>rational_resampler_xxx_0</sink_block_id>
  2020 + <sink_block_id>qtgui_sink_x_1</sink_block_id>
2010 2021 <source_key>0</source_key>
2011 2022 <sink_key>0</sink_key>
2012 2023 </connection>
2013 2024 <connection>
2014   - <source_block_id>low_pass_filter_0</source_block_id>
2015   - <sink_block_id>analog_wfm_rcv_0</sink_block_id>
  2025 + <source_block_id>analog_wfm_rcv_0</source_block_id>
  2026 + <sink_block_id>rational_resampler_xxx_0</sink_block_id>
2016 2027 <source_key>0</source_key>
2017 2028 <sink_key>0</sink_key>
2018 2029 </connection>
2019 2030 <connection>
2020   - <source_block_id>low_pass_filter_0</source_block_id>
2021   - <sink_block_id>qtgui_sink_x_0_0</sink_block_id>
  2031 + <source_block_id>rational_resampler_xxx_0</source_block_id>
  2032 + <sink_block_id>audio_sink_0</sink_block_id>
2022 2033 <source_key>0</source_key>
2023 2034 <sink_key>0</sink_key>
2024 2035 </connection>
2025 2036 <connection>
2026   - <source_block_id>rational_resampler_xxx_0</source_block_id>
2027   - <sink_block_id>audio_sink_0</sink_block_id>
  2037 + <source_block_id>rational_resampler_xxx_0_0</source_block_id>
  2038 + <sink_block_id>analog_wfm_rcv_0</sink_block_id>
2028 2039 <source_key>0</source_key>
2029 2040 <sink_key>0</sink_key>
2030 2041 </connection>
2031 2042 <connection>
2032 2043 <source_block_id>rtlsdr_source_0</source_block_id>
2033   - <sink_block_id>low_pass_filter_0</sink_block_id>
  2044 + <sink_block_id>qtgui_sink_x_0</sink_block_id>
2034 2045 <source_key>0</source_key>
2035 2046 <sink_key>0</sink_key>
2036 2047 </connection>
2037 2048 <connection>
2038 2049 <source_block_id>rtlsdr_source_0</source_block_id>
2039   - <sink_block_id>qtgui_sink_x_0</sink_block_id>
  2050 + <sink_block_id>rational_resampler_xxx_0_0</sink_block_id>
2040 2051 <source_key>0</source_key>
2041 2052 <sink_key>0</sink_key>
2042 2053 </connection>
fm_radio/top_block.py
  1 +#!/usr/bin/env python2
  2 +# -*- coding: utf-8 -*-
  3 +##################################################
  4 +# GNU Radio Python Flow Graph
  5 +# Title: Top Block
  6 +# Generated: Thu Mar 16 08:57:41 2017
  7 +##################################################
  8 +
  9 +if __name__ == '__main__':
  10 + import ctypes
  11 + import sys
  12 + if sys.platform.startswith('linux'):
  13 + try:
  14 + x11 = ctypes.cdll.LoadLibrary('libX11.so')
  15 + x11.XInitThreads()
  16 + except:
  17 + print "Warning: failed to XInitThreads()"
  18 +
  19 +from PyQt4 import Qt
  20 +from gnuradio import analog
  21 +from gnuradio import audio
  22 +from gnuradio import eng_notation
  23 +from gnuradio import filter
  24 +from gnuradio import gr
  25 +from gnuradio import qtgui
  26 +from gnuradio.eng_option import eng_option
  27 +from gnuradio.filter import firdes
  28 +from gnuradio.qtgui import Range, RangeWidget
  29 +from optparse import OptionParser
  30 +import osmosdr
  31 +import sip
  32 +import sys
  33 +import time
  34 +
  35 +
  36 +class top_block(gr.top_block, Qt.QWidget):
  37 +
  38 + def __init__(self):
  39 + gr.top_block.__init__(self, "Top Block")
  40 + Qt.QWidget.__init__(self)
  41 + self.setWindowTitle("Top Block")
  42 + try:
  43 + self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
  44 + except:
  45 + pass
  46 + self.top_scroll_layout = Qt.QVBoxLayout()
  47 + self.setLayout(self.top_scroll_layout)
  48 + self.top_scroll = Qt.QScrollArea()
  49 + self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
  50 + self.top_scroll_layout.addWidget(self.top_scroll)
  51 + self.top_scroll.setWidgetResizable(True)
  52 + self.top_widget = Qt.QWidget()
  53 + self.top_scroll.setWidget(self.top_widget)
  54 + self.top_layout = Qt.QVBoxLayout(self.top_widget)
  55 + self.top_grid_layout = Qt.QGridLayout()
  56 + self.top_layout.addLayout(self.top_grid_layout)
  57 +
  58 + self.settings = Qt.QSettings("GNU Radio", "top_block")
  59 + self.restoreGeometry(self.settings.value("geometry").toByteArray())
  60 +
  61 + ##################################################
  62 + # Variables
  63 + ##################################################
  64 + self.samp_rate = samp_rate = 48e3
  65 + self.freq = freq = 98.7e6
  66 + self.decim = decim = 4
  67 +
  68 + ##################################################
  69 + # Blocks
  70 + ##################################################
  71 + self._freq_range = Range(55e6, 200e6, 0.1e6, 98.7e6, 200)
  72 + self._freq_win = RangeWidget(self._freq_range, self.set_freq, "freq", "counter_slider", float)
  73 + self.top_grid_layout.addWidget(self._freq_win, 0,0)
  74 + self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + '' )
  75 + self.rtlsdr_source_0.set_sample_rate(samp_rate*10*4)
  76 + self.rtlsdr_source_0.set_center_freq(freq, 0)
  77 + self.rtlsdr_source_0.set_freq_corr(0, 0)
  78 + self.rtlsdr_source_0.set_dc_offset_mode(0, 0)
  79 + self.rtlsdr_source_0.set_iq_balance_mode(0, 0)
  80 + self.rtlsdr_source_0.set_gain_mode(False, 0)
  81 + self.rtlsdr_source_0.set_gain(20, 0)
  82 + self.rtlsdr_source_0.set_if_gain(20, 0)
  83 + self.rtlsdr_source_0.set_bb_gain(20, 0)
  84 + self.rtlsdr_source_0.set_antenna('', 0)
  85 + self.rtlsdr_source_0.set_bandwidth(0, 0)
  86 +
  87 + self.rational_resampler_xxx_0_0 = filter.rational_resampler_ccc(
  88 + interpolation=1,
  89 + decimation=4,
  90 + taps=None,
  91 + fractional_bw=None,
  92 + )
  93 + self.rational_resampler_xxx_0 = filter.rational_resampler_fff(
  94 + interpolation=1,
  95 + decimation=10,
  96 + taps=None,
  97 + fractional_bw=None,
  98 + )
  99 + self.qtgui_sink_x_1 = qtgui.sink_f(
  100 + 1024, #fftsize
  101 + firdes.WIN_BLACKMAN_hARRIS, #wintype
  102 + 0, #fc
  103 + samp_rate/decim, #bw
  104 + "", #name
  105 + True, #plotfreq
  106 + True, #plotwaterfall
  107 + True, #plottime
  108 + True, #plotconst
  109 + )
  110 + self.qtgui_sink_x_1.set_update_time(1.0/10)
  111 + self._qtgui_sink_x_1_win = sip.wrapinstance(self.qtgui_sink_x_1.pyqwidget(), Qt.QWidget)
  112 + self.top_grid_layout.addWidget(self._qtgui_sink_x_1_win, 10,0)
  113 +
  114 + self.qtgui_sink_x_1.enable_rf_freq(False)
  115 +
  116 +
  117 +
  118 + self.audio_sink_0 = audio.sink(int(samp_rate), '', True)
  119 + self.analog_wfm_rcv_0 = analog.wfm_rcv(
  120 + quad_rate=samp_rate*10,
  121 + audio_decimation=1,
  122 + )
  123 +
  124 + ##################################################
  125 + # Connections
  126 + ##################################################
  127 + self.connect((self.analog_wfm_rcv_0, 0), (self.qtgui_sink_x_1, 0))
  128 + self.connect((self.analog_wfm_rcv_0, 0), (self.rational_resampler_xxx_0, 0))
  129 + self.connect((self.rational_resampler_xxx_0, 0), (self.audio_sink_0, 0))
  130 + self.connect((self.rational_resampler_xxx_0_0, 0), (self.analog_wfm_rcv_0, 0))
  131 + self.connect((self.rtlsdr_source_0, 0), (self.rational_resampler_xxx_0_0, 0))
  132 +
  133 + def closeEvent(self, event):
  134 + self.settings = Qt.QSettings("GNU Radio", "top_block")
  135 + self.settings.setValue("geometry", self.saveGeometry())
  136 + event.accept()
  137 +
  138 + def get_samp_rate(self):
  139 + return self.samp_rate
  140 +
  141 + def set_samp_rate(self, samp_rate):
  142 + self.samp_rate = samp_rate
  143 + self.rtlsdr_source_0.set_sample_rate(self.samp_rate*10*4)
  144 + self.qtgui_sink_x_1.set_frequency_range(0, self.samp_rate/self.decim)
  145 +
  146 + def get_freq(self):
  147 + return self.freq
  148 +
  149 + def set_freq(self, freq):
  150 + self.freq = freq
  151 + self.rtlsdr_source_0.set_center_freq(self.freq, 0)
  152 +
  153 + def get_decim(self):
  154 + return self.decim
  155 +
  156 + def set_decim(self, decim):
  157 + self.decim = decim
  158 + self.qtgui_sink_x_1.set_frequency_range(0, self.samp_rate/self.decim)
  159 +
  160 +
  161 +def main(top_block_cls=top_block, options=None):
  162 +
  163 + from distutils.version import StrictVersion
  164 + if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
  165 + style = gr.prefs().get_string('qtgui', 'style', 'raster')
  166 + Qt.QApplication.setGraphicsSystem(style)
  167 + qapp = Qt.QApplication(sys.argv)
  168 +
  169 + tb = top_block_cls()
  170 + tb.start()
  171 + tb.show()
  172 +
  173 + def quitting():
  174 + tb.stop()
  175 + tb.wait()
  176 + qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
  177 + qapp.exec_()
  178 +
  179 +
  180 +if __name__ == '__main__':
  181 + main()