实验4-采样率变换Sample Rate Change
- 前言
- 一、为什么要进行采样率转换
- 二、Interpolation插值-升采样
- 【Interpolation FIR Filter】
- 步骤1:插值-升采样
- 步骤2:低通滤波
- 三、Decimation抽值降采样
- 【Decimating FIR Filter】
- 步骤1:低通滤波
- 步骤2:抽值-降采样
- 四、Rational Resampler有理数因子/分数重采样
- 【Rational Resampler】
- 步骤1:插值-升采样
- 步骤2:低通滤波
- 步骤3:抽值-降采样
前言
采样率转换,包括升采样和降采样,通常使用插值和抽值实现。
Interpolating FIR Filter插值FIR滤波器、Decimating FIR Filter抽值FIR滤波器以及Rational Resampler分数重采样模块是GNU Radio采样率转换的基础性工具,GNU Radio官方在wiki百科Sample Rate Change章节对这3款滤波器的使用方法进行了实验演示。
鉴于原文为英语,且部分插图和叙述可能存在矛盾,博主谨对官方实验进行了复现,在摘录、翻译部分原文的基础上,对GNU Radio采样率转换问题进行展开探讨。
因本人并非通信行业或电子设计出身,本文未能对滤波器专业知识做深入讨论,仅仅在具体操作层面给出通俗讲解,借以抛砖引玉,恳请走过路过的大佬批评指正、不吝赐教。
期待能够为GNU Radio中文社区增添一份贡献!
一、为什么要进行采样率转换
举个栗子。下图是我们搭建的一个简易的仿真AM电台,作用是在200kHz频点上广播邓紫棋的《泡沫》。
首先查看这个wav文件占用多大带宽:如下图所示,因原始信号的采样率为48kHz,所以我们使用采样率为48kHz的【QT GUI Frequency Sink】示波器,可以看到,原始信号的用频集中在10kHz(请记住这个数字) 以内,可以简单理解为在这首歌曲里所有乐器和歌手的最高音调为10kHz。
为了能够在200kHz频点上发送出去信号,我们使用【Signal Source】信号发生器产生200kHz的余弦波信号作为载波,根据奈奎斯特采样定律,【Signal Source】的采样率应当至少设置为400kHz(大于最高用频的2倍以上),否则将发生混叠,我们将之设为480kHz。
但这样一来,负责生成载波的【Signal Source】模块、负责生成待传输信号(基带信号)的【Wav File Source】模块,两者的采样率分别为480kHz、48kHz,差了10倍。如果你这时候找个收音机来听,会发现歌曲唱得极其得快,这是因为我们的AM电台会以480kHz的采样率,也就是10倍于原始wav文件的正常数据流速对其进行采样,然后调制到载波上面。
如下图所示,从时域角度看,语速将提高10倍;而从频域角度来看,最终生成的已调信号的频谱原本应当以200kHz为中心、左右各占10kHz的带宽,但现在变成了以200kHz为中心、左右各占100kHz的带宽,发生了严重的展宽,原始信息被破坏。例如原本歌手唱了歌la(该音调对应的频率假设为500Hz),结果硬生生给告了八度(可能变成了89kHz)。
这样的情况,在我们使用GNU Radio仿真通信系统时会经常遇到。因此我们需要进行采样率转换,使我们设计的通信系统采样率前后匹配。
采样率转换,包括升采样和降采样,通常使用插值和抽值实现。在GNU Radio中常用Interpolating FIR Filter插值FIR滤波器、Decimating FIR Filter抽值FIR滤波器以及Rational Resampler分数重采样模块实现。
为便于开展研究,我们搭建一个适用于这3个模块专用的实验系统,如下图所示。流图左半部分为信号源,支持使用单音或者wav波形文件,【Selector】模块用于切换信号源。绿色区用于实验【Interpolating FIR Filter】模块,蓝色区用于实验【Decimating FIR Filter】模块,橙色区用于实验【Rational Resampler】模块。(这瞅着不比官网那个流图工整得多?)
二、Interpolation插值-升采样
所谓插值,就是在原有采样点集之中,人为地增加一些数据,可以提高采样率、增加可用带宽,解决系统各元件之间采样率不匹配的问题。
(图片来源见水印)不同的滤波器,插值的算法也有所不同。GNU Radio里的【Interpolation FIR Filter】模块所用插值算法如下。GNU Radio wiki百科 Interpolation FIR Filter
具体来看Interpolation插值区。使用【Signal Source】模块以48kHz采样率生成1个余弦波,频率选择范围在生成[0kHz,24kHz]之间可调(Input Index=Output Index=0),或使用【Wav File Source】模块加载本地的《泡沫-邓紫棋.wav》音频文件(Input Index=1,Output Index=0),该文件固有采样率为48kHz,用频范围为[0kHz,10kHz]。
随后信号源生成的信号流入【Interpolation FIR Filter】模块,完成插值升采样后由【Low-pass Filter Taps】模块低通滤波器滤除24kHz以上的信号。
最后分别由采样率设置为480kHz的【Audio Sink】播放器模块和【QT GUI Frequency Sink】示波器模块播放或输出信号。
下面具体来看【Interpolation FIR Filter】模块的用法。
【Interpolation FIR Filter】
这个模块实际上含有两部分步骤:
插值FIR滤波器:升采样
低通滤波器:滤除因插值升采样产生的高频镜像信号
Type:输入输出的数据类型,包括Complex转Complex、Float转Complex、Float转Short、Short转Complex。
Interpolation:插值数。在两个信号点之间插入Interpolation个0值,则采样率将将扩展到samp_rate*Interpolation倍。若输入信号为48kHz采样率,interpolation为10,则输出信号的新采样率就是480kHz。
Taps:建立一个【Low-pass Filter Tap】低通滤波器,将其ID名填入此处,即可使【Interpolation FIR Filter】模块装载了低通滤波的功能,这要比使用【Interpolation FIR Filter】+【Low-pass
Filter】的组合方便得多。
Sample Delay:添加延迟。
步骤1:插值-升采样
按照下图的参数设定,当信号流入【Interpolation FIR Filter】模块后,首先在每两个采样点之间新增10个新的点,采样率由48kHz翻倍到480kHz。
如下图所示,原本在48kHz采样率下生成的8kHz余弦波,采样率翻倍到480kHz后其频率仍为8kHz;《泡沫-邓紫棋.wav》文件的用频范围在插值后仍然在[0kHz,10kHz]之间,原始信息均未被破坏(歌曲原来什么音调,插值后基本不变)。
而假如没有进行插值,直接使用480kHz的【QT GUI Frequency Sink】示波器去读取原始信号,原信号的频率会按照原采样率/示波器采样率的比值翻倍。如下图所示,在32kHz采样率下生成的2kHz信号,在采样率分别为64kHz、32kHz、16kHz的示波器中,分别显示频率为4kHz、2kHz、1kHz。(关于采样率问题可阅读实验3-关于GNU Radio和HackRF的采样率问题)
步骤2:低通滤波
所谓低通滤波,就是截断一部分频谱,只允许指定频率范围的信号通过。如下面所示,拖动滑块使截止频率在0-16kHz移动,大于截止频率的信号统统被滤除。
完成插值后,信号将进入【Low-pass Filter Taps】低通滤波器模块。
为什么要进行低通滤波?
如下图所示,输入1个频点为20kHz的余弦波,在经过插值升采样后,我们发现在频谱上多出了一些信号,它们分别以24kHz、72kHz、120kHz、168kHz、216kHz为中心(原采样率的1半,即samp_rate_interpolation/(interpolation*2)=480kHz/20=24kHz,分别乘以1、3、5、7、9)。这些副产品因为插值操作而产生的,破坏了原有频谱的纯净,我们只需要那个20kHz余弦波信号,因此,所有大于24kHz的信号需要被滤除。
因此,我们需要使用到【Low-pass Filter Taps】低通滤波器模块,如下图所示。
ID:该滤波器的代号,并将ID填到【Interpolation FIR Filter】模块的Taps参数中,可以使其装载低通滤波器功能。
Sample Rate(Hz):输出信号的采样率。信号流入【Low-pass Filter Taps】低通滤波器模块时,已经完成了插值-升采样,为正确处理这个信号,必须采用samp_rateinterpolation=48kHz10=480kHz。
Cutoff Freq(Hz):截止频率。即允许通过的最高频点。设置为24kHz,代表以[0,24kHz]区间内的信号可以通过。插值后需要滤除的范围为samp_rate_interpolation/(interpolation2)=480kHz/(102)=24kHz。
Transition Width(Hz):过渡带宽。在现实世界,滤波器很难做到完整、干净地对频谱进行切割,不是说截止频率设为24kHz,24.1kHz的信号就根本进不来了,多少会向外延展一点。过渡带宽就是用来设定延展有多宽。这个参数需要根据实际的设备进行微调,仿真时设为100Hz也没问题。
Window和Beta:使用的窗口类型。默认即可。
完成滤波后,超过截止频率24kHz的信号强度会被大幅削减,一般认为2个信号的幅度插值达到3dB(功率相差1000倍)即滤波成功。如下图所示。
三、Decimation抽值降采样
所谓抽值,就是对信号每隔decimation个点取一个点保留下来组成新的信号,采样率也将降低为samp_rate/decimation。
需要注意的是,根据奈奎斯特采样定律,当采样率降低,比如由48kHz降低为16kHz(抽值数为3,48kHz/3=16kHz),那么如果原信号中大于16kHz/2=8kHz的成分,会被“折叠”到[0kHz,8kHz],由高频变为低频,例如9kHz的信号会变成7kHz,原始信息遭到破坏,这个现象叫做混叠。
因此,为避免发生混叠,我们首先要进行低通滤波操作,将可能发生混叠的高频信号提前滤除,然后再进行抽值降采样。重点:与【Interpolation FIR Filter】不同的是,【Decimating_FIR_Filte】是先滤波再抽值
【Decimating FIR Filter】
这个模块实际上含有两部分功能:wiki官网Decimating_FIR_Filte低通/高通/带通滤波器:首先滤除原始信号的高频部分,避免混叠
抽值FIR滤波器:降采样
Type:输入输出的数据类型,包括Complex转Complex、Float转Complex、Float转Short、Short转Complex。
Decimation:抽取数。每Decimation个值保留1个,则采样率将将降低到samp_rate/Interpolation倍。若输入信号为48kHz采样率,decimation为3,则输出信号的新采样率就是16kHz。
Taps:建立一个【Low-pass Filter Tap】低通滤波器,将其ID名填入此处,即可使【Interpolation FIR Filter】模块装载了低通滤波的功能.
Sample Delay:添加延迟。
步骤1:低通滤波
选用【Low-pass Filter Taps】模块,对高频部分进行滤波。参数配置方法如下:
ID:命名,并将命名填到【Decimating FIR Filter】模块的Taps参数中,即代表挂载了这个低通滤波器。
Sample Rate(Hz):输入信号的采样率!!!首先对原始信号进行滤波,然后再抽值降采样,因此应当设置为原始信号的采样率samp_rate=48kHz。
Cutoff Freq(Hz):截止频率。允许通过的最高频点。为避免混叠,需要将原始信号里超出新采样率带宽范围的成分滤除掉,即samp_rate/(Decimation2)=48kHz/(32)=8kHz才能保证不失真。但是,从实践情况来看,例如当使用《泡沫-邓紫棋.wav》作为信号源时,如果截止频率10kHz,似乎声音会更“清亮”一些。应当如何设置滤波器参数,需要仁者见仁智者见智了。
Transition Width(Hz):过渡带宽。在现实世界,滤波器很难做到完整、干净地对频谱进行切割,不是说截止频率设为24kHz,24.1kHz的信号就根本进不来了,多少会向外延展一点。过渡带宽就是用来设定延展有多宽。这个参数需要根据实际的设备进行微调,仿真时设为100Hz也没问题。
Window和Beta:使用的窗口类型。默认即可。
步骤2:抽值-降采样
滤波后进行抽值降采样,最终输出的信号采样率降低为原采样率samp_rate/Decimation=48kHz/3=16kHz。如下图所示,输入在48kHz采样率下生成的4kHz的余弦波信号,降低采样率后频点保持不变,成功的保留了原始信息。
四、Rational Resampler有理数因子/分数重采样
【Interpolating FIR Filter】和【Decimating FIR Filter】在进行重采样时只支持整数。如果输入信号采样率为48kHz,输出为120kHz,输出信号与输入信号的采样率比值为5:2,此时就需要要用到【Rational Resampler】有理数因子重采样模块/分数重采样模块,首先插值升采样Interpolation=5,再抽值降采样Decimation=2,实现120kHz采样率输出。搭建重采样实验系统如下图所示。
【Rational Resampler】
这个模块实际上含有三部分功能:GNU Radio wiki官网Rational Resampler插值FIR滤波器:升采样
低通/高通/带通滤波器:将升采样后的镜像信号滤除;再滤除原始信号的高频部分避免降采样混叠
抽值FIR滤波器:降采样
Type:输入输出的数据类型,包括Complex转Complex、Float转Complex、Float转Short、Short转Complex。
Interpolation:插值数。在两个信号点之间插入Interpolation个0值,则采样率将将扩展到samp_rate*Interpolation倍。若输入信号为48kHz采样率,interpolation为10,则输出信号的新采样率就是480kHz。
Decimation:抽取数。每Decimation个值保留1个,则采样率将将降低到samp_rate/Interpolation倍。若输入信号为48kHz采样率,decimation为3,则输出信号的新采样率就是16kHz。
最终采样率为samp_rate*interplation/decimation
Taps:建立一个【Low-pass Filter Tap】低通滤波器,将其ID名填入此处,即可使【Interpolation FIR Filter】模块装载了低通滤波的功能.
Sample Delay:添加延迟。
步骤1:插值-升采样
与【Interpolation FIR Filter】模块功能一致。详见上文。
步骤2:低通滤波
经过升采样后,信号流入低通滤波器。下面具体看参数设置。
Sample Rate(Hz):升采样后的采样率!!!即samp_rateinterpolation=48kHz5=120kHz。【Rational Resampler】模块完成插值升采样步骤后,信号流入【Low-pass Filter Taps】滤波。如下图所示,48kHz升采样后变为240kHz,若改为最终输出采样率samp_rateinterpolation/decimation=48kHz5/2=120kHz的话,当Cutoff Frequency设为10kHz,实际滤波范围却变成了[0,20kHz],被扩大了一倍。
Cutoff Frequency(Hz):根据官方示例(Sample Rate Change),截止频率应当设置为samp_rate/(interpolation2)和samp_rate/(decimation2)的最小值。博主认为这一说法值得商榷,应当改为在samp_rate_interpolation/(interpolation2)和samp_rate_interpolation/(decimation2)之间取最小值。其中,samp_rate_interpolation=samp_rate*interpolation。
这很好理解。前文中说,插值后将出现镜像频率。按照插值处理的滤波原则,截止频率设置为samp_rate_interpolation/(interpolation2)=240kHz/(510)=24kHz。
随后,考虑到接下来要进行的降采样。已知经过【Rational Resampler】重采样后,系统的最终采样率为samp_rateinterpolation/decimatinotallow=48kHz5/2=120kHz。根据奈奎斯特采样定理,如果原信号存在60kHz以上的成分,将会被折叠进[0kHz,60kHz],例如65kHz会变成55kHz。为了将这些可能造成混叠干扰的成分滤除,Cutoff Frequency截止频率应设置为samp_rateinterpolation/(decimation2)=60kHz。
升采样要求截止频率小于24kHz,降采样要求截止频率小于60kHz。综合来看,截止频率最终应当设置为24kHz,即min(samp_rate_interpolation/(interpolation2),samp_rate_interpolation/(decimation2))
步骤3:抽值-降采样
与【Decimation FIR Filter】模块功能一致。详见上文。