主要内容

多级速度转换

多级速率转换是将速率转换分为几个阶段的方法。例如,不是抽取18倍,而是抽取3倍,然后再抽取3倍,然后再抽取2倍。使用多阶段降低了过滤速率转换的计算复杂度。此外,如果一个已经有不同的质数因子的转化器单元,它们可以用作积木为更高的费率。这个例子演示了多级速率转换设计。

单阶段vs.多级转换:成本分析

考虑速率抽取系统= 8。我们可以通过两种方式来实现这样的系统:

  • 速率的一个小数= 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)提供了一些工具来简化设计过程。我们将在下面研究其中的两个。

使用designMultistageDecimatordesignMultistageInterpolator功能

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

M = 12;fcDecMulti = designMultistageDecimator (M);disp (cascadeInfoSummary (fcDecMulti))
多级冷杉杀害多人者,M = 12(48.0千赫至4.0千赫)等效低通截止:4.0 khz,过渡宽度:800.0赫兹的阶段:3 Stage1:冷杉杀害多人者,M = 2(48.0千赫至24.0千赫),冷杉长度= 11 Stage2:冷杉杀害多人者,M = 2(24.0千赫至12.0千赫),冷杉长度= 15 Stage3:冷杉杀害多人者,M = 3(12.0千赫至4.0千赫),冷杉长度= 79

这个设计分为三个阶段(12美元= 2 \ * 2 \ * 3美元),其中最后阶段的低通是最长的。

用单级重复设计。

fcDecSingle = designMultistageDecimator (M,“NumStages”,1);显示(级联信息摘要(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

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

costMulti=成本(fcDecMulti)costSingle=成本(fcDecSingle)
costMulti=带字段的结构:NumCoefficients:69个NumStates:102乘法SPERINPUTSAMPLE:10.1667 AdditionsPriNPUTSAMPLE:9.3333 costMulti=带字段的结构:NumCoefficients:283个NumStates:300乘法SPERINPUTSAMPLE:23.5833 AdditionsPriNPUTSAMPLE:23.5000

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

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

同样的方法适用于designMultistageInterpolator.创建两个内插器(单级和多级)并比较其输出。请注意,输出几乎相同,但多级内插器的延迟稍长。

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);标题(“多级内插”

系统的其他设计参数designMultistageDecimatordesignMultistageInterpolator功能

您可以指定滤波器设计参数,如过渡宽度和阻带衰减到designMultistageDecimatordesignMultistageInterpolator功能。这样的附加参数可以更好地控制过滤器的特性。输入采样率Fs默认为1,但也可以自定义该值。

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

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

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

multiDecim = designMultistageDecimator (M, Fs, TW Astop);disp (cascadeInfoSummary (multiDecim))
多级冷杉杀害多人者,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 = 2 (24.0 mhz至12.0 mhz),冷杉长度= 7 Stage3:冷杉杀害多人者,M = 2 (12.0 mhz至6.0 mhz),冷杉长度= 11 Stage4:第5阶段:FIR Decimator, M = 2 (2.0MHz to 1.0MHz), FIR Length = 95

这是一个带有因子的5级小数级串级$2 \右tarrow 2 \右tarrow 2 \右tarrow 3 \右tarrow 2是谁的产品$2^4\乘以3~ = ~48$正如所料。

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

多重抽取默认值=设计多级抽取器(M,Fs);disp(级联信息汇总(多重抽取默认值))
多级冷杉杀害多人者,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

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

singleDecim = designMultistageDecimator (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个乘法SperInputSample:6.6042 AdditionsPerInputSample:5.6667 costSingleDecim=struct with fields:NumCoefficients:2361个NumStates:2400个乘法SperInputSample:49.1875 AdditionsPerInputSample:49.1667

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

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

默认设计具有稍大的过渡宽度。

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

最小系数总数的优化设计

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

minCoeffDecim = designMultistageDecimator (M, Fs、TW Astop,“mintotalcoffs”,真正的);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值更低,但每个输入样本的乘法数更高。

估算与设计决定成本

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

一种较慢但更精确的方法使用基于通过所有候选滤波器的实际设计获得的真实FIR长度的成本CostMethod = '设计'以优化准确的成本。设置此属性可以确保设计成本确实是最小的。

trueMinCostDecim = designMultistageDecimator (M, Fs、TW Astop,“CostMethod”,“设计”);disp (cascadeInfoSummary (trueMinCostDecim))
多级冷杉杀害多人者,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 = 2 (24.0 mhz至12.0 mhz),冷杉长度= 7 Stage3:冷杉杀害多人者,M = 3 (12.0 mhz至4.0 mhz),冷杉长度= 21 Stage4:第5阶段:FIR Decimator, M = 2 (2.0MHz至1.0MHz), FIR Length = 95

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

cost(trueMinCostDecim) hfv = fvtool(minCoeffDecim,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] = getRateChangeFactors (src);冷杉= getFilters (src);读者= dsp。AudioFileReader (“audio48kHz.wav”,“SamplesPerFrame”4 *米);x =读者();xr = src (x);%获取速率转换FIRb = firs.Stage1.Numerator;%计算重采样延迟i0 =地板(长度(b) / 2) / L;图;持有在…上茎((1:length(x))+i0,x);茎(linspace(1,length(x),length(xr)),xr,“r”);持有; 传奇(“输入音频”,重新取样音频的);xlim([150200])释放(读者);

通过比率转换简化

转换率等48 k / 44.1 k美元(在前一节中使用)需要一个大的上样本和下样本比率,即使它的简化形式是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通过允许输出频率被扰动,可以自动逼近速率转换因子。微扰公差通过“OutputRateTolerance”财产。默认容差为0,表示没有松弛。换句话说,松弛是指偏离指定的输出速率值。显然,近似的速率转换具有更小的计算成本,并足以满足许多应用程序,如标准定义音频处理。

src_approx = dsp。SampleRateConverter (“InputSampleRate”, 48000,...“OutputSampleRate”, 44100,“带宽”13岁的...“OutputRateTolerance”, 0.01);[L_approx,M_approx] = getRateChangeFactors(src_approx) cost(src_approx)
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年。