1、毕业设计 基于GNU Radio多相滤波器的设计与实现 摘要: 线电是无线通信领域提出的新的通信系统结构,主要以拓展性,结构简单化地硬件作为通用平台,以可替换的软件来实现更多的通信功能。GNU Radio是用软件来定义无线电波发射和接收的方式,与硬件相结合,搭建无线电通信系统的开源软件系统,使得无线电领域所遇到的数字调制问题变成软件问题。本文以GNU Radio为基础,实现多相滤波器系统。对多相滤波器做了简单的介绍,包括滤波器的组成模块,实现原理,同时讨论了多相滤波器如何实现信道化,最后介绍了滤波器的设计步骤,分析实现多相滤波器仿真结果。 关键词: 软件无线电,GNU R
2、adio,多相滤波器 目录 一、引言 3 1.1、软件无线电的介绍 3 1.2、GNU Radio的产生和应用现状 4 1.3、本课题的主要工作 4 二、软件无线电和GNU Radios的原理 5 2.1、软件无线电系统的结构和特征 5 2.2、GNURadio的介绍 6 2.3、GNURadio安装与使用 7 2.3.1、 Ubuntu的安装 7 2.3.2、GNU Radio的安装 8 三、多相滤波器理论原理及其应用 10 3.1、多相滤波器的理论知识 10 3.1.1、采样定律 10 3.1
3、2、多采样滤波器 11 3.1.3 、互换等效性 14 3.1.4、重采样 15 3.2、FIR滤波器的概念与结构 16 3.3、滤波器的信道化选择 18 3.4、多相滤波结构的作用 19 四、GNURadio的多相滤波器系统设计和实现 20 4.1、GNR Radio多相滤波器的基本组建 20 4.2、基于GNU Radio设计多相滤波器设计流程图 21 4.3、相滤波器的设计 21 五、实验结果 25 六、总结 28 参考文献 29 致谢 30 一、引言 1.1、软件无线电的介绍 软件无线电(Software Defined Radio):
4、是无线通信实现的新概念,即是采用现代软件来实现控制传统的“纯硬件电路”无线通信。软件无线电技术首先是运用在军事上,但由于它的优点突出,很快该技术开始运用到民用的无线移动通讯行业。软件无线电新技术的出现,打破了传统的通信功能只能依赖硬件格局发展的单一局面,如今,通信功能以硬件无线通信设备作为基本平台,功能的实现更多地由软件来发挥作用。软件无线电新技术的出现,对于通讯领域来说,是继“固定通信—移动通信”“模拟通信—数学通信”之后的第三次技术变革。因此,如何更好地去研发和运用软件无线电技术,是一项艰巨的任务。 和传统的无线电系统相对比,软件无线电体统有其自身突出的特点。传统的无线电系统的调制方式和
5、频段都有对应的硬件结构,其滤波和基频处理、上/下变频、射频部分都采用了模拟方式,虽然数码无线电系统的低频部分采用了数字电路,但是其射频和中频部分还是离不开模拟电路。软件无线电系统是将D/A、A/D变换移动至中频,尽可能接近射频天线,并是对整个系统进行了采样处理。而且软件无线电是用DSP器件来替代数字电路,这样,系统的功能实现和硬件结构相对独立,整个系统就能基于一个通用、开放的硬件平台,利用各种软件技术实现各种不同的通信功能,并通过软件编程来实现对工作频率、调制方式、系统宽带的选择,极大地提高了系统的灵活性。 软件无线电新概念的提出,引起了无线电领域的广泛关注,成为了未来通讯技术的发展新方向,
6、它不仅在电子战、雷达等国防军事方面得到广泛应用,在智能化家电、数字化通信方面也有它的身影。各国都争先恐后进行相关方面的研究,尤其美国,美国军方已经制定了具体的发展规划。而我国对于软件无线电技术的研究非常重视,设立了多项重点研究项目。现在,人们对软件无线电的研究日趋成熟,已经开始将其应用到我们生活的各个方面。 1.2、GNU Radio的产生和应用现状 GNU Radio是一套免费开源软件的开发工具。它提供了信号处理和运行模块来支持软件无线电,并使用微处理器和低成本的RF(外部射频)去实现软件定义无线电,它广泛应用于无线通信领域的研究。对于GNU Radio,主要是采用Python编
7、程语言,而它的核心的模块是由C++在带浮点运算的微处理器上进行构建的,这也决定了用户能够快速建立一个高吞吐量、实时的无线电系统。虽然GNU Radio的主要功能不是用来模拟仿真的,但是在没有硬件情况下,使用预先生成的数据来进行信号处理研究。 GNU Radios的硬件平台USRP系列产品在世界各地有着各式各样的广泛应用,在商业生活和国防系统中都能看到它的身影。尤其是国防系统,USRP系列产品能够以低预算,快速成型和部署先进等优点已经被发达国家的军事和情报服务机构广泛应用。 1.3、本课题的主要工作 本论文通过设计和研究GNU Radio软件,实现软件无线电的基本方案,其主要的工作
8、是学会使用GNU Radio软件和实现多相滤波器结构。主要内容包括了: l 学习和掌握软件无线电的概念、工作原理和发展状况; l 学习和掌握GNU Radio的安装和使用方法; l 学习和掌握多相滤波器的相关理论知识和设计方法; l 用GNU Radio软件为基础,设计多相滤波器,同时提出基本实现 方案。 二、软件无线电和GNU Radios的原理 2.1、软件无线电系统的结构和特征 构成软件无线电系统的基本部件包括了:多频段射频变换器,含有A/D和D/A转换器的芯片,电源,天线和通用处理器等,这些部件执行了无线通信功能。 软件无线电系统的硬件结构比
9、较简单,通过处理流程图来了解其各个硬件。上图为接收通道,信号由天线通过RF的前端接收,再经过模拟数字转换器ADC进行转换,最后由代码的作用转化为信息。类似的,在发射通道,数字信号由代码处理计算生成,再由DAC将其转为模拟信号,最后再从RF前端发射出去。通过流程我们也可以看出,软件无线电结构完成的主要功能关键在软件无线代码。 处理流程图: 图2.1 软件无线电处理流程图[1] 对于分析软件无线电处理流程,我们还应理解以下特点: l 数字化和编程化,在整个过程中,除了少部分以模拟方式实现,例如低噪声放大,放大功率,滤波,其余部分都是在模数转换后再由代码编程计算处理实现的,例如差
10、错编码、调制解调、信道均衡等。 l 开放性和灵活性,软件无线电采用了模块化地结构,它的硬件在技术不断发展的前提下不断更新,软件模块也不断升级,增加新功能的方法简单,而且软件无线电不仅能和旧体制的电台进行兼容,也能够和新体制的电台进行工作,这样能够最大限度地保证了软件无线电技术的生命周期。 2.2、GNURadio的介绍 GNU Radio的编程是Python脚本语言和C++两者的混合,其中,Python用于实现高级组织、图形界面和一些对运算性能要求不高的功能,C++因执行效率高,可用于信息处理模块的编写,例如信道编译码模块,FFT变换,调制器,时频同步等等模块,这些被称为bloc
11、k。 从另一方面来说:Python就是选择合适的信源,处理模块和信宿,设置正确的参数,再把这些连接起来成为一个完整的应用程序。而所有的信源,信宿和模块都由C++来编写。GNU Radio还有一套零拷贝循环缓存机制,能够保证数据在这些block之间流动,也能通过Python编写能够连接各个block的脚本,称为graph。同时,在GNU Radio进行扩展也比较容易,如果发现缺少一个特定的block,可以快速编写创建,然后添加它。GNU Radio为学习者有方便调试测试的环境,提供了图形界面版GRC,这是一个图形化工具,用于创建信号流图,并生成流图的源代码,里面包含了大量的数字处理模块资源和多
12、种调试工具。 GNU Radio的硬件平台—USRP(通用软件无线电外设)实际上,USRP是充当了无线通信系统的中频和数字基带部分,让普通的计算机能够像高带宽的软件无线电设备那样工作。USRP使得所有波形的相关处理都在主机CPU上完成,例如调制和解调,而例如抽样、上下变频和内插等高速通用操作则都在FPGA(可编程门阵列)上完成。USRP平台的出现,让工程师能够花费少量的精力去为用户创造大量的代码库,并为软硬件提供了很多实际运用,成为了软件无线电开发的理想平台。 2.3、GNURadio安装与使用 2.3.1、 Ubuntu的安装 目前GNU Radio安装GNU
13、 Radio库只支持LINUX操作系统,使用的是Ubuntu12.10。下载链接: XP 和Ubuntu,这样我们就可以根据自己的需求进入想要的系统。最后,要对Ubuntu12.10的源列表进行更新,步骤如下: l 进入终端,输入sudo gedit/etc/apt/sources.list,按回车键。编辑源列表,将原来的内容删除,添加你需要用到的源,复制到列表中,保存列表。代码如下: deb lucid main universe restricted multiverse deb-src lucid main universe restricted multiverse deb
14、 lucid-security universe main multiverse restricted deb-src lucid-security universe main multiverse restricted deb lucid-updates universe main multiverse restricted deb lucid-proposed universe main multiverse restricted deb-src lucid-proposed universe main multiverse restricted deb lucid-
15、backports universe main multiverse restricted deb-src lucid-backports universe main multiverse restricted deb-src lucid-updates universe main multiverse restricted l 关闭sources.list 后,在终端运行 sudo apt-get update,这样,Ubuntu就安装好了。 2.3.2、GNU Radio的安装 一般GNU Radio的安装有两个途径包括手动自源代码安装或者是预购的二进制包。需要注意的是,
16、GNU Radio的开发工作发展迅速,这就有可能导致各个版本的二进制预购包有可能处于过时状态。安装步骤: (1)安装ubuntu12.10,运行“language support”选择“Chinese”注意不要对系统进行任何升级。 (2)采用Script(脚本来安装),先建立一个文件夹,需要建立在全英文的路径中,在终端进入该路径,然后输入“$ wget http://www.sbrac.org/files/build-gnuradio && chmod a+x./build-gnuradio && ./build-gnuradio --verbose.”该命令运行下就会下载安装器(buil
17、d-gnuradio)其状态设置为可运行状态,这个过程是先下载并安装所有相关单元,然后从GIT上下载UHD和GNU Radio,运行”$ sudo make”进行安装,在这个安装过程中需要sudo的密码,这个过程大部分都是自动完成的,而且大多数情况下,通过运行该脚本对GNU Radio的实施自源代码的安装能够满足其要求。 (3)接着输入“$ sudo make install”接着输入“sudo gedit /etc /profile”,然后加上回车键。再输入export 配置路径“$ export PYTHONPATH=$PYTHPNPATH://usr/lib/python2.7/d
18、ist-packages”,然后输入”sudo gedit /etc/ld.so.conf ”接着执行“sudo ldconfig”最后输入“gnuradio-config-info --v”。安装完成后,源代码便会位于硬盘上某处,这样方便日后的修改。 (4)在我安装版本中缺少scipy文件包,所以需要另外安装,先下载scipy和numpy相关安装包,然后输入 “sudo apt-get install libatlas-sse2-dev”和“sudo apt-get install gfortran”,再执行安装命令,进入numpy的目录和scipy目录,执行“python setup.p
19、y build—fcompiler=gnu95”和“sudo python setup.py install—prefix=/usr/local”进行安装。 (5)测试GNU Radio安装是否有问题,我们可以采用“/gnuradio-3.3.0/gnuradio-examples/python/audio”下的一个例子,例如dial-tone.py。该例子能够产生两个sine波形然后将他们输出声卡,其中一个输出到声卡的右声道,一个输到左声道。“$./dial-tone.py”。运行后,能够听到声卡发出的声音,按任意键程序就可以退出。 (6)我们还可以在“/usr/local/bin”下面
20、找到grc,类似Matlab的Simulink,在终端运行grc“$./grc”,就会弹出下图窗口。右边有各种block,双击一个,就会放在左图上,图3.1是一个正弦波的信号源,连接一个示波器,运行,就能够在示波器上显示正弦波形,如图2.3 。 图2.2 GRC界面 图2.3 在GRC中运行一个流图 三、多相滤波器理论原理及其应用 3.1、多相滤波器的理论知识 3.1.1、采样定律 通过对软件无线电的学习,我们知道其核心思想是对天线感应的射频模拟信号进行数字化,使其转换成适合计算机处理的数据流,从而能
21、够通过算法来完成各种功能。在这一过程中面临的主要问题是如何对模拟信号进行采样?如何能够从采样后的数据序列中取重新建立连续的时域信号。 采样速率是将模拟信号准确不失真地转换成数字信号的重要指标。Nyquist采样定律中指出,带限信号中,也就是最大频率fmax以上没有频谱分布的信号,用采样间隔为Ts均匀采样后的样本是唯一确定的,而间隔Ts满足式(3.1) Ts ≤ 1/2 fMAX (sec) 式(3.1) 多数情况下,对频率在[ 0, fH ]的信号来说,采样频率要符合: fs ≥ 2fH
22、 式(3.2) 这样才能保证采集的信号不会有混叠而造成的失真情况。如图所示 图3.1 原始信号[2] 图3.2 无混叠 [2] Nyquist采样理论只是讨论了频谱在(0,fH)上的信号采样问题,但当信号频率分布带宽为B的有限的频带(fL , fH)上,又该如何对待呢?这就提出了带通采样定理:频率带限信号x(t),带宽为B,频带限制在(fL ,fH )内,那么采样速率fs 满足 fH=2 式 (3.3) 式中,f0 为中心频率,k满足fs ≥ 2(fH —fL)最大正整数(0,2,3…),这样fS 进行等间隔采样所
23、得的信号采样值x(nT )能准确地确定原信号x(t)。 又因为中心频率满足: f0=B 式(3.4) 我们可以发现,k的不同会导致中心频率的不同,即使使用同一个采样频率,也是可以对不同的中心频率进行采样。这决定了带通采样定理的使用前提,只能够在其中一个频率上存在信号,不允许其他频带上同时也存在信号,否则会引发混叠现象。带通采样可以降低采样速率的理论值,使得高速采样和处理能够成为现实。 现实中软件无线电只有在宽的频段下才具有较广泛的适应性,这样决定了软件无线电台无法采用Nyquist采样技术采样,而需要采用带通采样。 3.1.2、多采样滤波器 多采样
24、滤波器是指在处理采样信号的时候,能够提高或者降低信号采样率的数字滤波器。其中简单的是实现整数倍的增采样(1:P)滤波器,也就采用内插,同时也称为向上采样。另一种是减采样(Q:1)滤波器,采用抽取,也称为向下采样。较为复杂的是将减采样和增采样应用在同一个信号处理过程,此时,获得的采样率的改变率为P/Q,更为复杂的技术可以用来实现缓慢时变或者是任意比值的采样率变化。 l 整数倍抽取和向下采样 抽取通常也成为向下采样,是降低采样率的过程,是在原始采样序列x(n)每隔(Q-1)个数据取一个,从而能够形成一个全新的序列XQ(m),也就是: XQ(m)=X(mQ) 式(3.5)
25、其中,Q为正整数,而形成的新序列数据长度是原来1/Q。 图3.3 用f Hz采样率对原始信号采样[3] 图3.4 用1/4 f Hz采样率得到新的信号[3] 这一过程实现将采样率降低到原来的频率的1/4,也就是除去每4个原始信号中的3个,只保留1个。 x(n) y(m) 图3.5 抽取器 通过抽取,不仅可以降低输出信号的数据频率,而且还提高了频域的分辨率。但是为了避免我们丢弃的样本中有我们要研究的样本,因此实际应用时我们需要在抽取器前面增加滤波器h(n),可以使用低通数学滤波器也可以是带通数学滤波器,这可以将信号带宽限制到我
26、们要研究的范围之内。 M Low-pass Filter 图3.6 在抽取前对信号进行滤波 l 整数倍内插和向上采样 整数倍内插:在两个原始抽样点之间插入(I-1)个零值,假设原始抽样序列是x(n),那么内插后的序列XI(m)是: XI(m)= 式(3.6) 内插过程如图: 图3.7 采样率f Hz的原始信号[3] 图3.8 用零值样本对原值信号进行扩充,增加采样率为原来的4倍[3] 内插后的信号频谱因为有新的零值样品加入而多了不在研究范围内的高频
27、分量到信号中,所以,我们需要对内插后的新信号进行滤波,除去不用研究的分量,产生更适合的采样值,如图所示: 图3.9 f HZ的最终信号 采样率为4倍[3] 完整的内插器结构如下图,利用内插(加入零点)不但可以提高输出信号的频率,同时也可以提高时域分辨率。此时,采用的滤波器为带通滤波器,取出信号的高频成分。 L Filter 图3.10 内插后对信号进行滤波 3.1.3 、互换等效性 互换的等效性:内插器和抽取器相对滤波器的位置是可以相互调整的,也称作“Noble恒等式” 图3
28、11 Noble 恒等式[3] 如图所示,先用ZD多项式定义的滤波器进行滤波处理,然后进行减采样,与先进行减采样,再进行滤波器处理是完全等效的。事实上,我们将重采样器与滤波器相结合,利用特性用输出采样率上的一个单位延迟来取代输入采样率上D个单位延时。相同的,内插器也一样,不同的是,抽取和滤波器之间的关系研究是分析滤波器组研究的基础,内插和滤波器组的关系则是综合滤波器组研究的基础。Noble等式是多相滤波器设计过程中内插器和抽取器次序交换的理论依据,通过适当的调整,能够使滤波器得到简化。 内插和抽取因子只能为整数值,如果将内插因子为P和抽取因子为Q内插器和抽取器相结合,级联后就可以得
29、到Q:P的重采样,如果此时P和Q是互质数,那么内插器和抽取器就可以互相交换次序,否则不可以。次序的交换是十分有意义的,如果内插器和抽取器能够交换,将抽取器移到滤波器的输入端,这样使整个滤波器能够用二者中较低的处理速率来进行工作。 3.1.4、重采样 如果系统的采样率是一个整数,我们就只需要通过抽取或者内插来实现,如果采样率的比率是一个分数,我们就需要通过抽取和内插进行结合级联,而这样一个过程就称为重采样。 假设重采样因子2.5进行重采样,那么内插因子为5,而抽取因子为2就能够产生输出对输入采样率:5/2=2.5的采样率。重采样因子是输出采样速率和输入采样速率的比值,也可以表示为内插因
30、子和抽取因子之间的比例。 图3.12 重采样 3.2、FIR滤波器的概念与结构 根据滤波器的基本结构特点,可以将数字滤波器分为有限长脉冲响应(FIR)滤波器和无限长脉冲响应(IIR)滤波器。FIR滤波器是指冲激响应函数h(t)是有限个值的数字滤波器,也就是满足 h(n)=0,n≥N2及n<N1 式(3.7) 该式中,N1, N2为有限值,也可以说FIR滤波器的冲激函数h(n)只是在有限范围N1≤K<N2-1内不为零,但在实际中N1=0,而N2=N, y(n)= 式(3.8) FIR数字滤波器的频率响应可以表示为: H(ejw
31、)=-jwk 式(3.9) 而所谓滤波器设计,实际上就是给定H(ejw) (或者某些特征参数)的情况下,从而求出冲激函数h(k)。 IIR滤波器的反馈,一般是模仿模拟滤波器的响应,他们的脉冲是递归型,这比FIR滤波器更少的计算,但是IIR滤波器稳定性比较差。然而,FIR滤波器无反馈,这件使得该种滤波器有恒定的群时延,所有在频率范围中,滤波器完全稳定。FIR滤波器能够在保证幅度特性满足技术要求的同时,很容易做到严格的线性相位特性。而且,总体来说,FIR滤波器的设计技术比较成熟,方法也多,现实应用更为广泛。 设计FIR滤波器的方法之一是用一个窗函数w(k
32、去截取理想滤波器的冲激函数hLP(k),这样就可以得到一个可用的FIR滤波器的冲激函数h(k): h(k)= hLP * w(k) 式(3.10) 实际运用中,窗函数w(k)有各种形式,例如汉宁窗、矩形窗、凯撒(Kaiser)窗,还有这次实验应用的布-哈窗(布莱克曼-哈里斯窗,Blackman-Harris)。布-哈窗的表达式如下: WBH(k)=0.42323-0.49755cos +0.07922cos (0≤k≤N-1) 式(3.11) 对于布-哈窗来说,它具有较低的旁瓣电平,在对动态要求比较高的时
33、候,一般选择布-哈窗。采用窗函数去设计FIR滤波器的优点是简单,容易理解,根据窗函数的表达式,能够容易求出窗函数的的N个w(k)(k=0,1,2…N-1),然后用这些数据和理想的冲激函数相乘就可以得到实际的滤波器的冲激函数h(k)。一般理想的冲激函数是已经知道的,例如,这次实验使用的低通滤波器,其理想的频率响应为 HLP(ejw)= 式(3.12) 那么对应的理想滤波器的冲激响应为 hLP(k)= (k =0,±1,,2,….) 式(3.13) 此时,为了使hLP(k)和窗函数的取值范围(0,N-1)相一致,那么我们可以先把hLP(k)移动到处
34、在频域上只是增加一个固定相移) hLP(k)= 式(3.14) 最后,再和w(k)相乘就可以得到实际的滤波器系数h(k): h(k)= hLP(k-N/2)*w(k) (0≤ k≤ N-1)式(3.15) 此外,数字滤波器的阶数N,和滤波器的归一化过渡带宽度成反比,过渡带越窄,滤波器的阶数也就会越大,从而实现起来难度会越大,在实际应用需要权衡两者的关系,这样决定了用窗函数设计的数字滤波器的特性无法达到最佳状态。 3.3、滤波器的信道化选择 所谓信道是指通过一组覆盖整个频段的滤波器将频段划分成若干个子频段——信道,每个滤波器的输出就是一
35、个信道输出。 如果将每个子频段通过下变频搬移到零中频,再通过低通滤波器(带宽是信道带宽),这种实现方法叫做频率信道化的低通实现。如图3.13。经过低通滤波后每个信道输出再经过D=K倍的抽取后不会出现频谱混频。如以2GHz频段,8信道为例,(图3.14):其中a图表示将2GHz频段分成8个信道,则每个信道的带宽是250MHz,假设把信道3移到零中频再进行低通滤波,就能够得到(b)的频谱,如果再对它进行8倍的抽取,频谱就能够以2G/8=250MHz的周期进行周期拓展,那么就会如(c)所示,此时的频谱刚好没有混叠,并可以获得低采样率的信号。 图中每个信道的输出数据率已经降成原来的K倍,但由于K个
36、信道,所以对于整个模型来说,数据率并没改变,2GHz频段分成8个信道,就是将2G数据转成8路250MHz的数据,所以取任一路信道输出时,就能够实现8倍的降数据率。 对于(图3.13)结构而言,所有的滤波和频移运算都是在抽取操作之前进行,滤波和频移运算都是需要大量的乘法和加法运算,这样现实中不利于信号的实时运输,根据等效性定理,我们可以将抽取操作提前到滤波和和移频运算前面,就能大量减轻系统的运算量,降低后续信号处理的负担。 图3.13 频率信道化的低通实现[4] 图3.14 频率信道化后的抽取[4] 3.4、多相滤波结构的作用 多相滤波技术在软件
37、无线电的数字信道化接收机领域有着广泛的应用,是该领域的关键技术核心。多相滤波结构,能够利用多个阶数较低的滤波来实现阶数高的滤波,每个分支滤波器处理的数据是原来速率的I/D,同时,高速滤波也能够起到抑制邻道干扰和镜像干扰的作用。它的设计直接影响着数字信道化接收机的整体性能。 多相滤波器独特的优点同样适用于电子对抗领域,例如通信电子战跳频信号的快速搜索或者雷达对抗中信号全概率截获等方面。近几年,国内外的电子战行业中的研究所都开始将多相滤波器应用在电子战侦察接收机得研制中,并且取得一定的研究成果。 四、GNURadio的多相滤波器系统设计和实现
38、这一章的内容比较乱而且少,要重新整理。按以下目录重新整理和改写: 4.1 GNURadio的多相滤波器设计方案的整体思路 (1)结合图4.1,讲清楚多相滤波器设计方案要实现的目的是什么。图4.1应该是个测试多相滤波器的设计方案,要叙述其测试的基本思路是什么,要得到什么结果。 (2)这个测试设计方案用到了什么组件,各个组件的基本作用要大致描述; (3)详细介绍测试文件的实现代码和设计思路。 4.2 GNURadio多相滤波器的实现方法 叙述GNURadio多相滤波器的具体实现方法,可以整合原文中的4.1和4.3进行展开说明。这部分是论文的重点,要尽量详细。
39、4.1、GNR Radio多相滤波器的基本组建 多相滤波器组是一个很强大的过滤工具,可以有效地执行多速率信号处理任务,而在GNU Radio中具有一组多相滤波器组中使用的各种应用模块,下面对这几个模块进行简单的叙述下面介绍的模块在4.3节的哪些地方用到?要有所体现,不然单独罗列在这里没什么意义。 。 l gr-pfb-decimator-ccf :多相抽取滤波器,这一个组建可以在一个信号流当中,通过多相滤波器组进行整数倍的降采样(抽取),第一个数是整数,指定要抽取多少,第二个输入端是一个矢量浮点,是源型滤波器的抽头数,第三个是指定要提取哪一个通道。使用时,我们可以在多相滤波器的通
40、道中选择任何一个去进行抽取操作,最后的输出信号将是从通道中抽取后剩下的信号。需要注意的是,滤波器的抽头数应该根据抽取之前的采样率。 l gr-pfb-interpolator-ccf:多相内插滤波器,功能与抽取器相反,信号流通过执行多相滤波器组上的整数倍上采样(内插)。系数的设置和抽取器相似。 l gr-pfb-channelize-ccf:多相滤波器组的信道化,这个模块需要复数型输出和M个带宽相等的信道,而每个信道所得到新的采样率是输入采样率除以信道数M。需要注意的是滤波器的输出情况,其中过采样率等于实际输出的采样率除以正常输出的采样率,例如Fs=9000Hz的9个信道,正常的
41、速率是9000/9=1000Hz ,那么允许的过采样率是9/9、9/8、9/7 …9/2、9/1,其中的9/1的过采样率下的输出采样速率为9000Hz,正常是1000Hz,而9/5是1800Hz。 l gr-pfb-resampler-ccf:多相滤波器的任意重采样,重采样率可以是任意的实数r,重采样是通过构造内插率为N的过滤器,然后再进行计算出D(抽取率):D=N/r,这样,我们就可以根据N和D合理进行重采样,注意N/D要接近输入率r,过程中产生的误差是两个滤波器的插值点之间的量化误差,过滤器使用数量N越大,噪声越小,我们可以设置过滤器数量的大小来确定量化误差,一般默认为32个滤波器。
42、 4.2、基于GNU Radio设计多相滤波器设计流程图 信号源 本地振荡器 波形类型:正弦波 采样率:160KHz 振幅:1 音频频率:8KHz 信号处理 信道化选择 信道数: N=5 信道选择器数目:M=10 带宽:8KHz 过渡带宽:1.6Hz 窗函数:布-哈函数 滤波器:FIR低通滤波器 信宿 矢量信宿 音频频率:8KHz 每个信道器速率:16KHz 图4.1 流程图 4.3、相滤波器的设计 对于GNU Radio来说,一个完整的应用程序包括了信源、信宿和信号处理模块,并将它们逐个连接起来。本设计也是如此,但在进入信号源模块
43、之前,需要对Python语言中特定程序代码进行交代解析。 1、GNU Radio 程序代码第一行基本都是 #!/usr/bin/env python 这一行放在脚本的开头处并且给此文件一个可执行模式,这样就可以直接执行Python脚本文件。 2、导入需要的模块(module) l Python语言中需要导入模块(module),一个模块包括了可执行的函数的定义和声明,每一个模块都有自己的全局变量表,所有在模块内定义的函数都能够使用它。我们作为模块的使用者,就可以利用“modname.itemname”来使用模块的函数和全局变量。注意,这里的“itemname”可以是成员变量,也可以
44、是成员函数。 l 用“import”命令是在模块中导入其他模块,一般是把“import”放到模块的前面,这样的导入操作是很灵活的,我们可以导入一个模块,一个package或者是模块中的定义。例如“import packageA.moduleB”或者“from packageA impot module B”。当使用“from package import item”时,这里的“item”可以是子package,也可以是package模块,或者是其他在模块中定义的名字,例如函数、类等。接下来对模块的介绍 l “gr”是gnuradio中重要的一个子package,这也是GNU Radio软
45、件的核心,“流图(flow graph)”类的类型是在gr中定义的,这对安排信号流向是很重要的。 l “eng notation”模块能够给使用者标记带来方便,它是按照工程惯例来赋一些常量字符或者是常量字。 l “blks2”一般几乎是空的,常用于调制,解调和一些额外的滤波代码重采样或者压缩等 l “math,time,sys,scipy,fftpack”都是Python或者wxPython的内置模块或者subpackage,而不是GNU Radio的一部分。 最后,需要强调的是,以上导入模块包含了可执行语句还有函数和类的定义,模块被导入后那些可执行的语句就会立即执行。也就是说,导入这
46、些packages和模块后,就能够初始化程序的很多变量,模块和类。本设计中需要导入模块的代码如下: #!/usr/bin/env python from gnuradio import gr, eng_notation from gnuradio import blks from gnuradio.eng_option import eng_option from optparse import OptionParser import math, time, sys, scipy, pylab from scipy import fftpack
47、 3、程序所需要的模块导入完毕后,开始对信号源进行设置,根据设计要求,通过本地振荡器产生的信号源波形类型是正弦波,设定的采样率为160KHz,振幅是1.0,音频频率是8KHz。具体步骤说明如下: (1)、顶层模块的定义:class fmtx(gr.hier_block2) (2)、函数初始化:“ __init__”函数在任何类中都很重要,定义一个类后,例如“gr.hier_block2.”,我们可以用这个类去初始化一个实例,“__init__”可以在已知初始化阶段去创建一个对象,那么类初始化就会自动为新创建的类实例去引用__init__函数。 def __init__(self, l
48、o_freq, audio_rate, if_rate):这个语句初始化了函数__init__的四个变量,一般来说,所有函数的第一个变量称作self,它对Python没有什么意义,但是,如果函数要调用其他函数是,就需要用self参量的函数属性,如“self.connect()”。__init__函数第一步要调用初始化函数“gr.hier_block2.”。 (3)、使用“gr.sig_source_c”去产生信号源,其中前缀c表示信号源的类型是复数型,“gr.GR_SIN_WAVE”决定了信号源波形类型为正弦波。 (4)、mixer = gr.multiply_cc () 定义了输入输出数据流的数据类型都是复数型的乘法器。 4、当信号源设定结束后,就开始对信号源进行信道化处理,也就开始了流程框图的信号处理模块。在这个模块,将进行信道划分,然后将信号源均匀地划分为若干段,然后分别移到零中频,在通多多个低通滤波器组成的多相滤波器进行滤出。具体的实施步骤如下: (1)通过信号源的基带和中频频率的情况设置信道的个数,这里设置为5个信道。信道的间隔为16KHz,将频率也分成5份,然后根据不同频率组建一组信号,然后列出。 (2)设计信道选择器。信道选择器(这里指过滤器)的数






