GNU RADIO 探秘

2026/4/25 23:20:20

# input: short; output: complex chan_filter1 = \\

gr.freq_xlating_fir_filter_scf (cfir_decimation,

channel_coeffs,

freq1, # 1st station freq input_rate)

(head1, tail1) = build_pipeline (fg, quad_rate, audio_decimation)

# sound card as final sink

audio_sink = audio.sink (int (audio_rate))

# now wire it all together fg.connect (src, chan_filter1) fg.connect (chan_filter1, head1) fg.connect (tail1, (audio_sink, 0))

return fg

def build_pipeline (fg, quad_rate, audio_decimation): '''Given a flow_graph, fg, construct a pipeline for demodulating a broadcast FM signal. The input is the downconverted complex baseband signal. The output is the demodulated audio.

build_pipeline returns a two element tuple containing the input and output endpoints. '''

fm_demod_gain = 2200.0/32768.0

audio_rate = quad_rate / audio_decimation volume = 1.0

# input: complex; output: float

fm_demod = gr.quadrature_demod_cf (volume*fm_demod_gain)

# compute FIR filter taps for audio filter width_of_transition_band = audio_rate / 32

audio_coeffs = gr.firdes.low_pass (1.0, # gain

quad_rate, # sampling rate

audio_rate/2 - width_of_transition_band, width_of_transition_band, gr.firdes.WIN_HAMMING)

# input: float; output: float

audio_filter = gr.fir_filter_fff (audio_decimation, audio_coeffs)

fg.connect (fm_demod, audio_filter) return ((fm_demod, 0), (audio_filter, 0))

def main (args):

nargs = len (args) if nargs == 1:

# get station frequency from command line freq1 = float (args[0]) * 1e6 else:

sys.stderr.write ('usage: fm_demod freq\\n') sys.exit (1)

# connect to RF front end

rf_front_end = gr.microtune_4937_eval_board () if not rf_front_end.board_present_p (): raise IOError, 'RF front end not found'

# set front end gain

rf_front_end.set_AGC (300)

# determine the front end's \ IF_freq = rf_front_end.get_output_freq () # 5.75e6

# Tell the front end to tune to freq1.

# I.e., freq1 is translated down to the IF frequency rf_front_end.set_RF_freq (freq1)

# build the flow graph

fg = build_graph (IF_freq, None)

fg.start () # fork thread(s) and return raw_input ('Press Enter to quit: ') fg.stop ()

if __name__ == '__main__': main (sys.argv[1:])

和Hello World的例子一样,这个例子建立了一个流向图,把所有的信号处理模块连接到了一起然后开始运行。在这个例子中,mc4020.source是一个和 Measurement

Computing PCI-DAS 4020/12 高速 ADC的连接接口。在它后面连接一个gr.freq_xlating_fir_filter_scf,这是一个有限脉冲响应(FIR)滤波器,负责选择 FM广播的电台频段并且把它变频到基带(0HZ,直流)。然后用20M的converter和解调器,我们就能够接收到邻近的6MHZ带宽的频率了,在这个频带中大概能包含10个或者更多频道的FM电台。接着使用gr.freq_xlating_fir_filter_scf来选择一个我们想收听的频道。在这个例子中,我们选择了RF前端精确的中频频率5.75MHZ,gr.freq_xlating_fir_filter_scf的输出是一个经过 160,000次/秒的复采样数据流,然后把复基带信号输出给gr.quadrature_demod_cf进行积分取模,这个模块负责真正的FM解调。 gr.quadrature_demod_cf通过比较每个邻近的复采样信号的角度(by subtracting the angle of each adjacent complex sample)来有效的区分频率,gr.quadrature_demod_cf的输出包含了FM立体声的左加右声道信号(left-plus- right FM mono audio signal),19kHZ的立体声的控制音(pilot tone),中心频率是38KHZ的左减右(left-minus-right)信号和其他的在这个上面的次载波(sub-carriers)信号。在这个简单的接收机中,我们使用低通滤波和抽取滤波,提取出了left-plus-right信号信息,把这个信号送给声卡,经过声卡的32,000HZ的DAC,就能够把数字信号还原成模拟声音,到此我们可以听到FM广播信号了。如果想进一步了解FM接收机的原理,请参考:\by Step.\

图形化用户接口

GNU Radio应用程序的图形化接口是使用python来实现的,接口能使用pyhone的任何toolkit来实现,我们推荐使用wxPython,它能最大化的实现跨平台应用。GNU Radio提供由C++到Python的连接机制。

硬件要求

GNU Radio是硬件独立的,今天带有单独浮点运算单元的上GHZ的CPU已经很常见了,这给台式机实现数字信号处理功能带来了可能。一个3G的 Pentium 或者 Athlon处理器能够每秒处理30亿次浮点FIR运算。我们现在能够在PC上建立软件通讯系统,这是几年前所不敢想象的。你的硬件要求依赖于你想做什么。总的来说,一个1G或者2G带有256M内存的机器应该是足够了。你也需要一些其他的模拟外设连接在你的PC上,包括内置的声卡或者96 kHz, 24-bit高保真声卡。使用这些模拟设备,你只能处理有限的窄带信号。另外的方案是使用高速的PCI模拟到数字的外设,这些设备可以达到20M的抽样率,但是他们是比较昂贵的,差不多是买一台PC的价钱。使用这些高速板,调制解调器可以作为RF前端来使用。 为了有一个更满意的替代产品,现在我们已经设计了一个通用软件无线电外设(USRP)。

通用软件无线电外设

我们首选的硬件解决方案是USRP,USRP是Matt Ettus的杰作,USRP是一个非常灵活的USB设备,它把你的PC连接到RF世界。USRP包含一个小的母板,母板包含4个12bit /64M抽样率的ADC,4个14bit/128M DAC,一个百万门的FPGA芯片和一个可编程的USB2.0控制器。每个USRP母板支持4个子板,2个接收,2个发射。RF前端是实现在子板上的,不同的子板处理不同的频率带宽。作为业余无线电使用,可以选择低能量的能够接收和发送440MHZ和1.24GHZ的子板。一个仅有接收功能的基于 cable modem 调谐的子板覆盖50MHZ到800MHZ频率范围被设计成容易手工来做原型的,目的是为了方便实验。

Figure 2. Universal Software Radio Peripheral

USRP 的灵活性得益于2个可编程的元件,通过他们和PC上的host端交互。为了对USRP有一个初步映像,让我们看一下它的启动过程。USRP本身不含有 ROM,仅仅有一个存储VendorID和productID和版本号信息的EEPROM。当USRP插到PC的USB口上以后,主机上的程序通过 VID,PID和版本号识别这是一个未配置的USRP,主机上的程序第一步要做的是下载一个8051固件到USB控制芯片上,这个固件控制USB的行为。当USB固件下载好后,USRP模拟一个USB设备的重枚举过程,此后主机识别到一个不同的设备,VID,PID和版本号都不同了。现在这个USB固件定义USB端口,接口和用户自定义命令。其中一个命令是load FPGA,收到这个命令后USB设备就能够把FPGA配置bitstream下载到FPGA芯片中开始工作。

FPGA是一个通用硬件,它的行为完全由配置的bitstream来决定,你可以把bitstream看作是一个目标码。这个bitsteam是由一个高级硬件描述语言编译得到的,在USRP里面这是由verilog硬件描述语言来实现的。这些代码是开源的,和其他的GNU Radio代码一样,是基于GNU的GPL协议的。

FPGA职责

FPGA 像一个小的,高性能的并行计算机一样,可以完成你设计的任务,设计FPGA需要一些技能,并且如果不慎还会烧坏你的板子。还好我们已经提供一个标准的适应性很广的FPGA配置。通过使用一个好的USB控制器,USRP能够有32M/s的处理能力,USB是半双工的,基于你的需要,USB能够在传输和接收之间转换。在接收方式下,标准的配置能够允许你选择你感兴趣的频率,同时完成基带化和抽取滤波的工作。和RF前端处理方法一样,但现在做的是在数字域的采样。执行这些功能的代码叫做数字下变频转换器DDC((Figure 3, “Digital Down Converter Block Diagram”),利用这些处理我们能够在数字域快速的改变中心频率。


GNU RADIO 探秘.doc 将本文的Word文档下载到电脑
搜索更多关于: GNU RADIO 探秘 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219