主要内容

多级速率转换

多级速率转换是一种将速率转换分为几个阶段的方法。例如,不是按系数18进行抽取,而是按系数3进行抽取,然后再按系数3进行抽取,然后再按系数2进行抽取。使用多级降低了过滤速率转换的计算复杂度。此外,如果一个人已经拥有用于不同质因数的转换器单元,那么它们可以用作更高速率的构建块。此示例演示了多级速率转换设计。

单级与多级转换:成本分析

考虑速率抽取系统我们可以通过两种方式实施这样一个系统:

  • 速率的一个小数= 8。

  • 由三个半率小数组成的级联(= 2)

滤波的多级级联滤波器(或内插器)具有简化的单级形式。简化形式的滤波器称为单级等效滤波器,它封装了所有级的滤波器。因此,任何多级串级FIR小数部分都可以表示为单级FIR小数部分。有关详细信息,请参见[1].然而,虽然这两种方法有效地执行相同的抽取,但它们的数值复杂度有所不同。

评估使用的多级小数实现的成本成本功能,并与实现单级抽取器的成本进行比较。

firDecim2_1 = dsp.FIRDecimator (2);firDecim2_2 = dsp.FIRDecimator (2);firDecim2_3 = dsp.FIRDecimator (2);firDecim2cascade = dsp.FilterCascade (firDecim2_1 firDecim2_2 firDecim2_3);cost2cascade = cost(firDecim2cascade) firDecim8 = dsp.FIRDecimator(8);cost8 =成本(firDecim8)
cost2cascade = struct with fields: NumCoefficients: 75 NumStates: 138 MultiplicationsPerInputSample: 21.8750 AdditionsPerInputSample: 21 cost8 = struct with fields: NumCoefficients: 169 NumStates: 184 MultiplicationsPerInputSample: 21.1250 AdditionsPerInputSample: 21. cost2cascade = struct with fields: NumCoefficients: 75 NumStates: 138

级联率的三个小数=2消耗的内存(状态和系数)比单级的小数要少=8,使多级转换器的内存效率更高。单级和多级实现的算术负载(每个样本的操作)是等价的。注意,在每个抽取阶段之后,样本的数量会减少一半。总之,将抽取分成多个阶段通常更好(当然,考虑到速率变化因子不是质数)。

通常有不止一种方法可以分解(非主要的)转化率,甚至有更多的多级设计自由度。DSP系统工具箱(TM)提供了一些工具来简化设计过程。我们将在下面研究其中的两个。

使用多级抽取器的设计设计多极化器功能

设计多极化器多级抽取器的设计函数自动确定一个最佳配置,包括确定阶段的数量及其安排,低通参数,等等。结果是一个过滤级联系统对象,它封装了所有的阶段。为了说明这一点,让我们设计一个速率的小数= 12。

M=12;fcDecMulti=多级抽取器(M);显示(级联信息摘要(FCDECMULIT))
多级FIR抽取器,M=12(48.0kHz至4.0kHz)等效低通截止:4.0kHz,过渡宽度:800.0Hz级数:3级1:FIR抽取器,M=2(48.0kHz至24.0kHz),FIR长度=11级2:FIR抽取器,M=2(24.0kHz至12.0kHz),FIR长度=15级3:FIR抽取器,M=3(12.0kHz至4.0kHz),FIR长度=79

这个设计分为三个阶段($12=2乘以2乘以3$),其中最后阶段的低通是最长的。

用单级重复设计。

fcDecSingle=设计多级抽取器(M,“NumStages”1);disp (cascadeInfoSummary (fcDecSingle))
多级FIR Decimator, M=12 (48.0kHz至4.0kHz)等效低通截止:4.0kHz,过渡宽度:800.0Hz级数:1级e1: FIR Decimator, M=12 (48.0kHz至4.0kHz), FIR长度= 307

比较两种实现的成本。显然,多阶段方法更有效。

cost = cost(fcDecMulti) cost = cost(fcDecSingle)
costMulti = struct with fields: NumCoefficients: 69 NumStates: 102 MultiplicationsPerInputSample: 10.1667 AdditionsPerInputSample: 9.3333 costSingle = struct with fields: NumCoefficients: 283 NumStates: 300 MultiplicationsPerInputSample: 23.5833 AdditionsPerInputSample: 23.5000

现在,让我们比较抽取滤波器的组合频率响应。虽然这两种实现的滤波器在阻带上不同,但通带和过渡带几乎相同。

hfv = fvtool(fcDecMulti, fcDecSingle);传奇(hfv“多级组合响应”“单级响应”);

同样的方法适用于设计多极化器.创建两个插值器(单级和多级)并比较它们的输出。请注意,输出几乎是相同的,除了多级插补器稍长的延迟。

n =(1:20)”;x = (abs(存在)< = 5)。* (5-abs(存在));L = 12;fcIntrMulti = designMultistageInterpolator (L);fcIntrSingle = designMultistageInterpolator (L,“NumStages”1);xInterpSingle = fcIntrSingle (x);xInterpMulti = fcIntrMulti (x);释放(fcIntrMulti);释放(fcIntrSingle);次要情节(1,1);茎(x);xlim ([20]);标题(输入序列的);次要情节(3、1、2);茎(xInterpSingle);标题(“单级插值”)次要情节(3、1,3);茎(xInterpMulti);标题(“多级插值”

附加的设计参数多级抽取器的设计设计多极化器功能

您可以指定滤波器设计参数,例如过渡宽度和阻带衰减多级抽取器的设计设计多极化器功能。此类附加参数允许更好地控制滤波器特性。输入采样率Fs默认为1,但也可以自定义该值。

设计一个滤波器,将输入频率从48 MHz降低到1 MHz,抽取因子为48。以下是相应降低带宽的低通滤波器的典型规范。

Fs=48e6;TW=100e3;Astop=80;最小阻带衰减M = 48;%大量毁灭的因素

这里是这些规格的一个简单的多级设计。

多重抽取=设计多级抽取器(M、Fs、TW、Astop);显示(级联信息汇总(多重抽取))
多级FIR抽取器,M=48(48.0MHz至1.0MHz)等效低通截止:1.0MHz,过渡宽度:100.0kHz级数:5级1:FIR抽取器,M=2(48.0MHz至24.0MHz),FIR长度=7级2:FIR抽取器,M=2(24.0MHz至12.0MHz),FIR长度=7级3:FIR抽取器,M=2(12.0MHz至6.0MHz),FIR长度=11级4:FIR抽取器,M=3(6.0MHz至2.0MHz),FIR长度=33级5:FIR抽取器,M=2(2.0MHz至1.0MHz),FIR长度=95

这是一个带有因子的5级小数级串级$2\rightarrow 2\rightarrow 2\rightarrow 3\rightarrow 2$是谁的产品$2^4\乘以3~ = ~48$像预期的那样。

设计一个类似的带有默认过渡宽度和衰减的滤波器。总的转换率是相似的,但是转换宽度(可能还有阶段的顺序)是不同的。

multiDecim_default = designMultistageDecimator (M, Fs);disp (cascadeInfoSummary (multiDecim_default))
多级冷杉杀害多人者,M = 48 (48.0 mhz至1.0 mhz)等效低通截止:1.0 mhz,过渡宽度:200.0 khz的阶段:5 Stage1:冷杉杀害多人者,M = 2 (48.0 mhz至24.0 mhz),冷杉长度= 7 Stage2:冷杉杀害多人者,M = 2 (24.0 mhz至12.0 mhz),冷杉长度= 7 Stage3:冷杉杀害多人者,M = 2 (12.0 mhz至6.0 mhz),冷杉长度= 11 Stage4:第5阶段:FIR Decimator, M = 3 (3.0MHz to 1.0MHz), FIR Length = 79 .第5阶段:FIR Decimator, M = 3 (3.0MHz to 1.0MHz), FIR Length = 79

用相同的参数设计一个单级小数。

单级抽取器=设计多级抽取器(M、Fs、TW、Astop、,“NumStages”1);disp (cascadeInfoSummary (singleDecim))
多级FIR Decimator, M=48 (48.0MHz至1.0MHz)等效低通截止:1.0MHz,过渡宽度:100.0kHz级数:1级e1: FIR Decimator, M=48 (48.0MHz至1.0MHz), FIR长度= 2411

比较单级和多级实现的过滤成本。对于多级方法,每个输入样本的乘法数约为7次,而对于单级实现,则约为49次。换句话说,使用多级实现将乘法次数减少了7倍,这带来了显著的差异。类似的差异可以观察到在系数的数量(89 vs . 2361),状态的数量(146 vs . 2400),和每个输入样本的加法(6 vs . 49)。

costMultiDecim = cost(multiDecim)
costMultiDecim = struct with fields: NumCoefficients: 89 NumStates: 146 MultiplicationsPerInputSample: 6.6042 AdditionsPerInputSample: 5.6667 costSingleDecim = struct with fields: NumCoefficients: 2361 NumStates: 2400 MultiplicationsPerInputSample: 49.1875 AdditionsPerInputSample: 49.1667

比较单级实现和两种多级设计的单级当量的频率响应。三种实现在通带和过渡带上的增益响应非常相似,在阻带上的差异可以忽略不计。尽管存在显著的成本差异,但这三种设计中的低通滤波几乎是相同的。

= fvtool(multiDecim, multiDecim_default, singleDecim);传奇(hfv“多级(自定义参数)”“多级(默认参数)”“单级”

默认的设计有稍微大一点的过渡宽度。

= fvtool(multiDecim, multiDecim_default, singleDecim);传奇(hfv“多级(自定义参数)”“多级(默认参数)”“单级”)xlim([0.8])

最小系数总数的优化设计

默认情况下,设计会最小化每个输入样本的乘法。也可以最小化系数的数量。设置属性MinTotalCoeffs = true使用后一种成本。

minCoeffDecim = designMultistageDecimator (M, Fs、TW Astop,“MinTotalCoeffs”,真正的);disp (cascadeInfoSummary (minCoeffDecim)成本(minCoeffDecim)
多级冷杉杀害多人者,M = 48 (48.0 mhz至1.0 mhz)等效低通截止:1.0 mhz,过渡宽度:100.0 khz的阶段:5 Stage1:冷杉杀害多人者,M = 2 (48.0 mhz至24.0 mhz),冷杉长度= 7 Stage2:冷杉杀害多人者,M = 3 (24.0 mhz至8.0 mhz),冷杉长度= 17 Stage3:冷杉杀害多人者,M = 2 (8.0 mhz至4.0 mhz),冷杉长度= 11 Stage4:第5阶段:FIR Decimator, M = 2 (2.0MHz至2.0MHz), FIR Length = 95 ans = struct with fields: NumCoefficients: 87 NumStates: 147 MultiplicationsPerInputSample: 6.8125 AdditionsPerInputSample: 6

与…相比multiDecim,中的系数数minCoeffDecim值更低,但每个输入样本的乘法数更高。

估算与设计决定成本

DesignMultistage Decimator函数使用的优化设计目标函数(系数数或乘法数)取决于每个阶段的FIR长度。默认情况下,该函数使用FIR长度估计值而不是真实长度来评估成本,有时会导致次优滤波器设计。

一种较慢,但更精确的方法使用基于所有候选滤波器的实际设计获得的真实FIR长度的代价。使用属性成本法与设计为精确的成本进行优化。设置此属性可确保设计成本确实最小。

trueMinCostDecim = designMultistageDecimator (M, Fs、TW Astop,“CostMethod”“设计”); disp(cascadeInfoSummary(trueMinCostDecim))
多级FIR抽取器,M=48(48.0MHz至1.0MHz)等效低通截止:1.0MHz,过渡宽度:100.0kHz级数:5级1:FIR抽取器,M=2(48.0MHz至24.0MHz),FIR长度=7级2:FIR抽取器,M=2(24.0MHz至12.0MHz),FIR长度=7级3:FIR抽取器,M=3(12.0MHz至4.0MHz),FIR长度=21级4:FIR抽取器,M=2(4.0MHz至2.0MHz),FIR长度=23级5:FIR抽取器,M=2(2.0MHz至1.0MHz),FIR长度=95

在许多情况下,估计的成本执行得非常好(就像在本例中那样)。

成本(trueMinCostDecim)hfv=fvtool(MincoefDecim,trueMinCostDecim);图例(hfv,“优化估计FIR长度”“优化FIR真实长度”
ans = struct带有以下字段:NumCoefficients: 87 NumStates: 146 MultiplicationsPerInputSample: 6.5625 AdditionsPerInputSample: 5.6667

dsp。SampleRateConverter系统对象

dsp。SampleRateConverter系统对象为任意速率转换提供了方便的接口,根据需要结合了插值和抽取。

src = dsp。SampleRateConverter (“InputSampleRate”,18,“OutputSampleRate”, 16岁,“带宽”,13); 信息(src)
ans = '整体插值因子:8整体抽取因子:9滤波器的数量:1乘每输入样本:24.333333系数的数量:219滤波器:滤波器1:dsp。FIRRateConverter -插值因子:8 -抽取因子:9 '

不同的阶段可以用getFilters功能:

冷杉= getFilters (src)
冷杉= dsp。带有属性的FilterCascade: Stage1: [1x1 dsp。FIRRateConverter]

我们还可以指定绝对频率(而不是比率)。例如,dsp。SampleRateConverter对象可以转换音频数据采样率从48 kHz到44.1 kHz。

src = dsp。SampleRateConverter (“InputSampleRate”, 48000,“OutputSampleRate”,44100); [L,M]=获取速率变化因子(src);firs=getFilters(src);reader=dsp.AudioFileReader(“audio48kHz.wav”“SamplesPerFrame”4 *米);x =读者();xr = src (x);%获取速率转换FIRb = firs.Stage1.Numerator;%计算重采样延迟i0 =地板(长度(b) / 2) / L;图;持有;茎((1:长度(x)) +钱数,x);茎(linspace(1、长度(x)长度(xr)), xr,“r”); 持有;传奇(输入音频的重新取样音频的); xlim([150200])发布(阅读器);

简化率转换松弛

转换率等4.8万美元/44.1万美元$(在前一节中使用)需要一个大的上样本和下样本比率,即使它的简化形式是L / M = 160/147美元.这种转换所需的过滤器相当长,除了内存和计算负载外,还引入了显著的延迟。

成本(src)
ans = struct带有以下字段:NumCoefficients: 8587 NumStates: 58 MultiplicationsPerInputSample: 53.6688 AdditionsPerInputSample: 52.7500

我们可以通过近似的比率转换因子来减少成本。例如,

$$48kHz/44.1kHz \约48kHz/44kHz = 12/11.$$

100Hz的偏差很小,仅为绝对频率的0.23%。的dsp。SampleRateConverter通过允许输出频率受到扰动,可以自动近似速率转换系数。扰动公差通过“输出公差”财产。默认容差为0,表示没有松弛。换句话说,松弛是指偏离指定的输出速率值。显然,近似的速率转换具有更小的计算成本,并足以满足许多应用程序,如标准定义音频处理。

src_近似值=dsp.1转换器(“InputSampleRate”, 48000,...“OutputSampleRate”,44100,“带宽”13岁的...“输出公差”,0.01); [L_近似值,M_近似值]=getRateChangeFactors(src_近似值)成本(src_近似值)
L_approx = 11 M_approx = 12 ans = struct with fields: NumCoefficients: 61 NumStates: 5 MultiplicationsPerInputSample: 5.0833 AdditionsPerInputSample: 4.1667

参考文献

[1]奥本海姆,a.v.和R.W.谢弗,离散时间信号处理,普伦蒂斯·霍尔出版社,1989年。