Commit 6ece6f5212eaa62e8b789ea4d9f8e597a8a8672f
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() |