使用gnuradio
播放自己的音乐,安装必要的软件
$ sudo apt-get install hackrf $ sudo apt-get install gr-osmosdr $ sudo apt-get install gnuradio
点击展开代码,保存为wbfm_tx_hackrf.grc
,然后双击打开
<?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.10'?> <flow_graph> <timestamp>Tue May 6 16:27:36 2014</timestamp> <block> <key>options</key> <param> <key>author</key> <value></value> </param> <param> <key>window_size</key> <value>1280, 1024</value> </param> <param> <key>category</key> <value>Custom</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>description</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(186, 53)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>wx_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>wbfm_tx_hackrf</value> </param> <param> <key>max_nouts</key> <value>0</value> </param> <param> <key>qt_qss_theme</key> <value></value> </param> <param> <key>realtime_scheduling</key> <value></value> </param> <param> <key>run_command</key> <value>{python} -u {filename}</value> </param> <param> <key>run_options</key> <value>prompt</value> </param> <param> <key>run</key> <value>True</value> </param> <param> <key>thread_safe_setters</key> <value></value> </param> <param> <key>title</key> <value></value> </param> </block> <block> <key>analog_wfm_tx</key> <param> <key>audio_rate</key> <value>32000</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(281, 374)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>analog_wfm_tx_0</value> </param> <param> <key>max_dev</key> <value>75e3</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>fh</key> <value>5</value> </param> <param> <key>quad_rate</key> <value>320000</value> </param> <param> <key>tau</key> <value>300e-6</value> </param> </block> <block> <key>blocks_stream_mux</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(423, 184)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_stream_mux_0</value> </param> <param> <key>lengths</key> <value>1, 1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>num_inputs</key> <value>2</value> </param> <param> <key>type</key> <value>float</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_wavfile_source</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>file</key> <value>music.wav</value> </param> <param> <key>_coordinate</key> <value>(211, 184)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_wavfile_source_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>nchan</key> <value>2</value> </param> <param> <key>repeat</key> <value>True</value> </param> </block> <block> <key>fractional_interpolator_xx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(662, 189)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>fractional_interpolator_xx_0</value> </param> <param> <key>interp_ratio</key> <value>875e-3</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>phase_shift</key> <value>1</value> </param> <param> <key>type</key> <value>float</value> </param> </block> <block> <key>parameter</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(659, 49)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>freq</value> </param> <param> <key>label</key> <value></value> </param> <param> <key>short_id</key> <value>f</value> </param> <param> <key>type</key> <value>eng_float</value> </param> <param> <key>value</key> <value>98e6</value> </param> </block> <block> <key>parameter</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(466, 54)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>inputfile</value> </param> <param> <key>label</key> <value></value> </param> <param> <key>short_id</key> <value>i</value> </param> <param> <key>type</key> <value>string</value> </param> <param> <key>value</key> <value>music.wav</value> </param> </block> <block> <key>osmosdr_sink</key> <param> <key>alias</key> <value></value> </param> <param> <key>ant0</key> <value></value> </param> <param> <key>bb_gain0</key> <value>20</value> </param> <param> <key>bw0</key> <value>250e3</value> </param> <param> <key>corr0</key> <value>0</value> </param> <param> <key>freq0</key> <value>freq</value> </param> <param> <key>if_gain0</key> <value>40</value> </param> <param> <key>gain0</key> <value>14</value> </param> <param> <key>ant10</key> <value></value> </param> <param> <key>bb_gain10</key> <value>20</value> </param> <param> <key>bw10</key> <value>0</value> </param> <param> <key>corr10</key> <value>0</value> </param> <param> <key>freq10</key> <value>100e6</value> </param> <param> <key>if_gain10</key> <value>20</value> </param> <param> <key>gain10</key> <value>10</value> </param> <param> <key>ant11</key> <value></value> </param> <param> <key>bb_gain11</key> <value>20</value> </param> <param> <key>bw11</key> <value>0</value> </param> <param> <key>corr11</key> <value>0</value> </param> <param> <key>freq11</key> <value>100e6</value> </param> <param> <key>if_gain11</key> <value>20</value> </param> <param> <key>gain11</key> <value>10</value> </param> <param> <key>ant12</key> <value></value> </param> <param> <key>bb_gain12</key> <value>20</value> </param> <param> <key>bw12</key> <value>0</value> </param> <param> <key>corr12</key> <value>0</value> </param> <param> <key>freq12</key> <value>100e6</value> </param> <param> <key>if_gain12</key> <value>20</value> </param> <param> <key>gain12</key> <value>10</value> </param> <param> <key>ant13</key> <value></value> </param> <param> <key>bb_gain13</key> <value>20</value> </param> <param> <key>bw13</key> <value>0</value> </param> <param> <key>corr13</key> <value>0</value> </param> <param> <key>freq13</key> <value>100e6</value> </param> <param> <key>if_gain13</key> <value>20</value> </param> <param> <key>gain13</key> <value>10</value> </param> <param> <key>ant14</key> <value></value> </param> <param> <key>bb_gain14</key> <value>20</value> </param> <param> <key>bw14</key> <value>0</value> </param> <param> <key>corr14</key> <value>0</value> </param> <param> <key>freq14</key> <value>100e6</value> </param> <param> <key>if_gain14</key> <value>20</value> </param> <param> <key>gain14</key> <value>10</value> </param> <param> <key>ant15</key> <value></value> </param> <param> <key>bb_gain15</key> <value>20</value> </param> <param> <key>bw15</key> <value>0</value> </param> <param> <key>corr15</key> <value>0</value> </param> <param> <key>freq15</key> <value>100e6</value> </param> <param> <key>if_gain15</key> <value>20</value> </param> <param> <key>gain15</key> <value>10</value> </param> <param> <key>ant16</key> <value></value> </param> <param> <key>bb_gain16</key> <value>20</value> </param> <param> <key>bw16</key> <value>0</value> </param> <param> <key>corr16</key> <value>0</value> </param> <param> <key>freq16</key> <value>100e6</value> </param> <param> <key>if_gain16</key> <value>20</value> </param> <param> <key>gain16</key> <value>10</value> </param> <param> <key>ant17</key> <value></value> </param> <param> <key>bb_gain17</key> <value>20</value> </param> <param> <key>bw17</key> <value>0</value> </param> <param> <key>corr17</key> <value>0</value> </param> <param> <key>freq17</key> <value>100e6</value> </param> <param> <key>if_gain17</key> <value>20</value> </param> <param> <key>gain17</key> <value>10</value> </param> <param> <key>ant18</key> <value></value> </param> <param> <key>bb_gain18</key> <value>20</value> </param> <param> <key>bw18</key> <value>0</value> </param> <param> <key>corr18</key> <value>0</value> </param> <param> <key>freq18</key> <value>100e6</value> </param> <param> <key>if_gain18</key> <value>20</value> </param> <param> <key>gain18</key> <value>10</value> </param> <param> <key>ant19</key> <value></value> </param> <param> <key>bb_gain19</key> <value>20</value> </param> <param> <key>bw19</key> <value>0</value> </param> <param> <key>corr19</key> <value>0</value> </param> <param> <key>freq19</key> <value>100e6</value> </param> <param> <key>if_gain19</key> <value>20</value> </param> <param> <key>gain19</key> <value>10</value> </param> <param> <key>ant1</key> <value></value> </param> <param> <key>bb_gain1</key> <value>20</value> </param> <param> <key>bw1</key> <value>0</value> </param> <param> <key>corr1</key> <value>0</value> </param> <param> <key>freq1</key> <value>100e6</value> </param> <param> <key>if_gain1</key> <value>20</value> </param> <param> <key>gain1</key> <value>10</value> </param> <param> <key>ant20</key> <value></value> </param> <param> <key>bb_gain20</key> <value>20</value> </param> <param> <key>bw20</key> <value>0</value> </param> <param> <key>corr20</key> <value>0</value> </param> <param> <key>freq20</key> <value>100e6</value> </param> <param> <key>if_gain20</key> <value>20</value> </param> <param> <key>gain20</key> <value>10</value> </param> <param> <key>ant21</key> <value></value> </param> <param> <key>bb_gain21</key> <value>20</value> </param> <param> <key>bw21</key> <value>0</value> </param> <param> <key>corr21</key> <value>0</value> </param> <param> <key>freq21</key> <value>100e6</value> </param> <param> <key>if_gain21</key> <value>20</value> </param> <param> <key>gain21</key> <value>10</value> </param> <param> <key>ant22</key> <value></value> </param> <param> <key>bb_gain22</key> <value>20</value> </param> <param> <key>bw22</key> <value>0</value> </param> <param> <key>corr22</key> <value>0</value> </param> <param> <key>freq22</key> <value>100e6</value> </param> <param> <key>if_gain22</key> <value>20</value> </param> <param> <key>gain22</key> <value>10</value> </param> <param> <key>ant23</key> <value></value> </param> <param> <key>bb_gain23</key> <value>20</value> </param> <param> <key>bw23</key> <value>0</value> </param> <param> <key>corr23</key> <value>0</value> </param> <param> <key>freq23</key> <value>100e6</value> </param> <param> <key>if_gain23</key> <value>20</value> </param> <param> <key>gain23</key> <value>10</value> </param> <param> <key>ant24</key> <value></value> </param> <param> <key>bb_gain24</key> <value>20</value> </param> <param> <key>bw24</key> <value>0</value> </param> <param> <key>corr24</key> <value>0</value> </param> <param> <key>freq24</key> <value>100e6</value> </param> <param> <key>if_gain24</key> <value>20</value> </param> <param> <key>gain24</key> <value>10</value> </param> <param> <key>ant25</key> <value></value> </param> <param> <key>bb_gain25</key> <value>20</value> </param> <param> <key>bw25</key> <value>0</value> </param> <param> <key>corr25</key> <value>0</value> </param> <param> <key>freq25</key> <value>100e6</value> </param> <param> <key>if_gain25</key> <value>20</value> </param> <param> <key>gain25</key> <value>10</value> </param> <param> <key>ant26</key> <value></value> </param> <param> <key>bb_gain26</key> <value>20</value> </param> <param> <key>bw26</key> <value>0</value> </param> <param> <key>corr26</key> <value>0</value> </param> <param> <key>freq26</key> <value>100e6</value> </param> <param> <key>if_gain26</key> <value>20</value> </param> <param> <key>gain26</key> <value>10</value> </param> <param> <key>ant27</key> <value></value> </param> <param> <key>bb_gain27</key> <value>20</value> </param> <param> <key>bw27</key> <value>0</value> </param> <param> <key>corr27</key> <value>0</value> </param> <param> <key>freq27</key> <value>100e6</value> </param> <param> <key>if_gain27</key> <value>20</value> </param> <param> <key>gain27</key> <value>10</value> </param> <param> <key>ant28</key> <value></value> </param> <param> <key>bb_gain28</key> <value>20</value> </param> <param> <key>bw28</key> <value>0</value> </param> <param> <key>corr28</key> <value>0</value> </param> <param> <key>freq28</key> <value>100e6</value> </param> <param> <key>if_gain28</key> <value>20</value> </param> <param> <key>gain28</key> <value>10</value> </param> <param> <key>ant29</key> <value></value> </param> <param> <key>bb_gain29</key> <value>20</value> </param> <param> <key>bw29</key> <value>0</value> </param> <param> <key>corr29</key> <value>0</value> </param> <param> <key>freq29</key> <value>100e6</value> </param> <param> <key>if_gain29</key> <value>20</value> </param> <param> <key>gain29</key> <value>10</value> </param> <param> <key>ant2</key> <value></value> </param> <param> <key>bb_gain2</key> <value>20</value> </param> <param> <key>bw2</key> <value>0</value> </param> <param> <key>corr2</key> <value>0</value> </param> <param> <key>freq2</key> <value>100e6</value> </param> <param> <key>if_gain2</key> <value>20</value> </param> <param> <key>gain2</key> <value>10</value> </param> <param> <key>ant30</key> <value></value> </param> <param> <key>bb_gain30</key> <value>20</value> </param> <param> <key>bw30</key> <value>0</value> </param> <param> <key>corr30</key> <value>0</value> </param> <param> <key>freq30</key> <value>100e6</value> </param> <param> <key>if_gain30</key> <value>20</value> </param> <param> <key>gain30</key> <value>10</value> </param> <param> <key>ant31</key> <value></value> </param> <param> <key>bb_gain31</key> <value>20</value> </param> <param> <key>bw31</key> <value>0</value> </param> <param> <key>corr31</key> <value>0</value> </param> <param> <key>freq31</key> <value>100e6</value> </param> <param> <key>if_gain31</key> <value>20</value> </param> <param> <key>gain31</key> <value>10</value> </param> <param> <key>ant3</key> <value></value> </param> <param> <key>bb_gain3</key> <value>20</value> </param> <param> <key>bw3</key> <value>0</value> </param> <param> <key>corr3</key> <value>0</value> </param> <param> <key>freq3</key> <value>100e6</value> </param> <param> <key>if_gain3</key> <value>20</value> </param> <param> <key>gain3</key> <value>10</value> </param> <param> <key>ant4</key> <value></value> </param> <param> <key>bb_gain4</key> <value>20</value> </param> <param> <key>bw4</key> <value>0</value> </param> <param> <key>corr4</key> <value>0</value> </param> <param> <key>freq4</key> <value>100e6</value> </param> <param> <key>if_gain4</key> <value>20</value> </param> <param> <key>gain4</key> <value>10</value> </param> <param> <key>ant5</key> <value></value> </param> <param> <key>bb_gain5</key> <value>20</value> </param> <param> <key>bw5</key> <value>0</value> </param> <param> <key>corr5</key> <value>0</value> </param> <param> <key>freq5</key> <value>100e6</value> </param> <param> <key>if_gain5</key> <value>20</value> </param> <param> <key>gain5</key> <value>10</value> </param> <param> <key>ant6</key> <value></value> </param> <param> <key>bb_gain6</key> <value>20</value> </param> <param> <key>bw6</key> <value>0</value> </param> <param> <key>corr6</key> <value>0</value> </param> <param> <key>freq6</key> <value>100e6</value> </param> <param> <key>if_gain6</key> <value>20</value> </param> <param> <key>gain6</key> <value>10</value> </param> <param> <key>ant7</key> <value></value> </param> <param> <key>bb_gain7</key> <value>20</value> </param> <param> <key>bw7</key> <value>0</value> </param> <param> <key>corr7</key> <value>0</value> </param> <param> <key>freq7</key> <value>100e6</value> </param> <param> <key>if_gain7</key> <value>20</value> </param> <param> <key>gain7</key> <value>10</value> </param> <param> <key>ant8</key> <value></value> </param> <param> <key>bb_gain8</key> <value>20</value> </param> <param> <key>bw8</key> <value>0</value> </param> <param> <key>corr8</key> <value>0</value> </param> <param> <key>freq8</key> <value>100e6</value> </param> <param> <key>if_gain8</key> <value>20</value> </param> <param> <key>gain8</key> <value>10</value> </param> <param> <key>ant9</key> <value></value> </param> <param> <key>bb_gain9</key> <value>20</value> </param> <param> <key>bw9</key> <value>0</value> </param> <param> <key>corr9</key> <value>0</value> </param> <param> <key>freq9</key> <value>100e6</value> </param> <param> <key>if_gain9</key> <value>20</value> </param> <param> <key>gain9</key> <value>10</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>args</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(743, 350)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>osmosdr_sink_0</value> </param> <param> <key>type</key> <value>fc32</value> </param> <param> <key>clock_source0</key> <value></value> </param> <param> <key>time_source0</key> <value></value> </param> <param> <key>clock_source1</key> <value></value> </param> <param> <key>time_source1</key> <value></value> </param> <param> <key>clock_source2</key> <value></value> </param> <param> <key>time_source2</key> <value></value> </param> <param> <key>clock_source3</key> <value></value> </param> <param> <key>time_source3</key> <value></value> </param> <param> <key>clock_source4</key> <value></value> </param> <param> <key>time_source4</key> <value></value> </param> <param> <key>clock_source5</key> <value></value> </param> <param> <key>time_source5</key> <value></value> </param> <param> <key>clock_source6</key> <value></value> </param> <param> <key>time_source6</key> <value></value> </param> <param> <key>clock_source7</key> <value></value> </param> <param> <key>time_source7</key> <value></value> </param> <param> <key>nchan</key> <value>1</value> </param> <param> <key>num_mboards</key> <value>1</value> </param> <param> <key>sample_rate</key> <value>8e6</value> </param> <param> <key>sync</key> <value></value> </param> </block> <block> <key>parameter</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(772, 45)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>ppm</value> </param> <param> <key>label</key> <value>ppm</value> </param> <param> <key>short_id</key> <value>p</value> </param> <param> <key>type</key> <value>eng_float</value> </param> <param> <key>value</key> <value>0</value> </param> </block> <block> <key>rational_resampler_xxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>decim</key> <value>1</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(532, 374)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rational_resampler_xxx_0</value> </param> <param> <key>interp</key> <value>8</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>taps</key> <value></value> </param> <param> <key>type</key> <value>ccc</value> </param> </block> <connection> <source_block_id>analog_wfm_tx_0</source_block_id> <sink_block_id>rational_resampler_xxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_stream_mux_0</source_block_id> <sink_block_id>fractional_interpolator_xx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_wavfile_source_0</source_block_id> <sink_block_id>blocks_stream_mux_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_wavfile_source_0</source_block_id> <sink_block_id>blocks_stream_mux_0</sink_block_id> <source_key>1</source_key> <sink_key>1</sink_key> </connection> <connection> <source_block_id>fractional_interpolator_xx_0</source_block_id> <sink_block_id>analog_wfm_tx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>rational_resampler_xxx_0</source_block_id> <sink_block_id>osmosdr_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph>
运行的效果图如下:
找一个收音机调整FM
频率到98MHz
上就可以收到播放的音乐了。
上面的不够直观,本人来说,还是看实际生成的代码来的简单,代码如下:
#!/usr/bin/env python2 # -*- coding: utf-8 -*- ################################################## # GNU Radio Python Flow Graph # Title: Wbfm Tx Hackrf # Generated: Mon Apr 9 15:17:07 2018 ################################################## if __name__ == '__main__': import ctypes import sys if sys.platform.startswith('linux'): try: x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: print "Warning: failed to XInitThreads()" from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation from gnuradio import filter from gnuradio import gr from gnuradio.eng_option import eng_option from gnuradio.filter import firdes from grc_gnuradio import wxgui as grc_wxgui from optparse import OptionParser import osmosdr import time import wx class wbfm_tx_hackrf(grc_wxgui.top_block_gui): def __init__(self, freq=98e6, inputfile="music.wav", ppm=0): grc_wxgui.top_block_gui.__init__(self, title="Wbfm Tx Hackrf") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Parameters ################################################## self.freq = freq self.inputfile = inputfile self.ppm = ppm ################################################## # Blocks ################################################## self.rational_resampler_xxx_0 = filter.rational_resampler_ccc( interpolation=8, decimation=1, taps=None, fractional_bw=None, ) self.osmosdr_sink_0 = osmosdr.sink( args="numchan=" + str(1) + " " + "" ) self.osmosdr_sink_0.set_sample_rate(8e6) self.osmosdr_sink_0.set_center_freq(freq, 0) self.osmosdr_sink_0.set_freq_corr(0, 0) self.osmosdr_sink_0.set_gain(14, 0) self.osmosdr_sink_0.set_if_gain(40, 0) self.osmosdr_sink_0.set_bb_gain(20, 0) self.osmosdr_sink_0.set_antenna("", 0) self.osmosdr_sink_0.set_bandwidth(250e3, 0) self.fractional_interpolator_xx_0 = filter.fractional_interpolator_ff(1, 875e-3) self.blocks_wavfile_source_0 = blocks.wavfile_source("music.wav", True) self.blocks_stream_mux_0 = blocks.stream_mux(gr.sizeof_float*1, (1, 1)) self.analog_wfm_tx_0 = analog.wfm_tx( audio_rate=32000, quad_rate=320000, tau=300e-6, max_dev=75e3, ) ################################################## # Connections ################################################## self.connect((self.analog_wfm_tx_0, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.blocks_stream_mux_0, 0), (self.fractional_interpolator_xx_0, 0)) self.connect((self.blocks_wavfile_source_0, 0), (self.blocks_stream_mux_0, 0)) self.connect((self.blocks_wavfile_source_0, 1), (self.blocks_stream_mux_0, 1)) self.connect((self.fractional_interpolator_xx_0, 0), (self.analog_wfm_tx_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.osmosdr_sink_0, 0)) def get_freq(self): return self.freq def set_freq(self, freq): self.freq = freq self.osmosdr_sink_0.set_center_freq(self.freq, 0) def get_inputfile(self): return self.inputfile def set_inputfile(self, inputfile): self.inputfile = inputfile def get_ppm(self): return self.ppm def set_ppm(self, ppm): self.ppm = ppm def argument_parser(): parser = OptionParser(option_class=eng_option, usage="%prog: [options]") parser.add_option( "-f", "--freq", dest="freq", type="eng_float", default=eng_notation.num_to_str(98e6), help="Set freq [default=%default]") parser.add_option( "-i", "--inputfile", dest="inputfile", type="string", default="music.wav", help="Set inputfile [default=%default]") parser.add_option( "-p", "--ppm", dest="ppm", type="eng_float", default=eng_notation.num_to_str(0), help="Set ppm [default=%default]") return parser def main(top_block_cls=wbfm_tx_hackrf, options=None): if options is None: options, _ = argument_parser().parse_args() tb = top_block_cls(freq=options.freq, inputfile=options.inputfile, ppm=options.ppm) tb.Start(True) tb.Wait() if __name__ == '__main__': main()
这样只要保证跟脚本相同目录下有一个music.wav
文件,然后执行
$ python wbfm_tx_hackrf.py
找一个收音机调整FM
频率到98MHz
上即可。