主要内容

多级汇率转换

多级汇率转换是一种将汇率转换分为几个阶段的方法。例如,不是18倍的decimate,而是3倍的decimate,接着是3倍的decimate,然后是2倍的decimate。采用多级方法降低了滤波速率转换的计算复杂度。此外,如果已经拥有不同质因数的转换单元,则可以将它们用作更高费率的构建单元。本例演示了多级速率转换设计。

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

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

  • 速率的一个小数= 8。

  • 三个半速率decimators的级联(= 2)

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

方法计算实现多级抽取器的成本成本函数,并与实现单级decimator的成本进行比较。

firDecim2_1 = dsp.FIRDecimator(2);firDecim2_2 = dsp.FIRDecimator(2);firDecim2_3 = dsp.FIRDecimator(2);firDecim2cascade = dsp.FilterCascade(firDecim2_1,firDecim2_2,firDecim2_3);成本=成本(firDecim2cascade) firDecim8 = dsp.FIRDecimator(8);成本8 =成本(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

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

通常有不止一种方法来考虑(非质数)转化率,甚至有更多自由度的多级设计。DSP系统工具箱(TM)提供了一些工具来简化设计过程。我们将在下面讨论其中的两个。

使用designMultistageDecimator而且designMultistageInterpolator功能

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

M = 12;fcDecMulti = designMultistageDecimator(M);disp (cascadeInfoSummary (fcDecMulti))
多级FIR Decimator, M=12 (48.0kHz至4.0kHz),等效低通截止:4.0kHz,过渡宽度:800.0Hz级数:3 Stage1: FIR Decimator, M= 2 (48.0kHz至24.0kHz), FIR长度= 11 Stage2: FIR Decimator, M= 2 (24.0kHz至12.0kHz), FIR长度= 15 Stage3: FIR Decimator, M= 3 (12.0kHz至4.0kHz), FIR长度= 79

这个特殊的设计有三个阶段($12=2 * 2 * 3$),其中最后一级的低通段最长。

重复单级设计。

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

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

costMulti = cost(fcDecMulti)
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“多级联合应对”“单级响应”);

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

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

的附加设计参数designMultistageDecimator而且designMultistageInterpolator功能

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

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

Fs = 48e6;TW = 100e3;stop = 80;最小阻带衰减M = 48;抽取因子

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

multiDecim = multistagedecimator (M,Fs,TW, stop);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:冷杉杀害多人者,M = 3 (6.0 mhz至2.0 mhz),冷杉长度= 33 Stage5:冷杉杀害多人者,M = 2 (2.0 mhz至1.0 mhz),冷杉长度= 95

这是一个带因数的五阶段小数级联$2 \右tarrow 2 \右tarrow 3 \右tarrow 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:冷杉杀害多人者,M = 2 (6.0 mhz至3.0 mhz),冷杉长度= 15 Stage5:冷杉杀害多人者,M = 3 (3.0 mhz至1.0 mhz),冷杉长度= 79

使用相同的参数设计一个单级抽取器。

singleDecim =设计multistagedecimator (M,Fs,TW, stop,“NumStages”1);disp (cascadeInfoSummary (singleDecim))
多级FIR Decimator, M=48 (48.0MHz到1.0MHz)等效低通截止:1.0MHz,过渡宽度:100.0kHz级数:1 Stage1: 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

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

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

默认设计的过渡宽度略大。

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

最小总系数的优化设计

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

minCoeffDecim =设计multistagedecimator (M,Fs,TW, stop,“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:冷杉杀害多人者,M = 2 (4.0 mhz至2.0 mhz),冷杉长度= 23 Stage5:冷杉杀害多人者,M = 2 (2.0 mhz至1.0 mhz),冷杉和字段长度= 95 ans =结构:NumCoefficients: 87 NumStates: 147 MultiplicationsPerInputSample: 6.8125 AdditionsPerInputSample: 6

相比multiDecim的系数数minCoeffDecim较低,但每个输入样本的乘法数较高。

估算与设计确定成本

designMultistageDecimator函数使用的优化设计的目标函数(系数或乘法的数量)取决于每个阶段的FIR长度。默认情况下,这个函数使用估计的FIR长度来计算成本,而不是真正的长度,有时会导致滤波器设计不理想。

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

trueMinCostDecim =设计multistagedecimator (M, f,TW,停止,“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:冷杉杀害多人者,M = 2 (4.0 mhz至2.0 mhz),冷杉长度= 23 Stage5:冷杉杀害多人者,M = 2 (2.0 mhz至1.0 mhz),冷杉长度= 95

估计成本在许多情况下都表现得很好(就像在本例中一样)。

hfv = fvtool(minCoeffDecim,trueMinCostDecim);传奇(hfv“优化估计FIR长度”“优化真实FIR长度”
ans = struct with fields: 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功能:

firs = getFilters
第一次= dsp。FilterCascade的属性:Stage1: [1x1 dsp. properties]CloneStages: true

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

SRC = dsp。SampleRateConverter (“InputSampleRate”, 48000,“OutputSampleRate”, 44100);[L,M] = getRateChangeFactors(src);firs = getFilters(src);Reader = dsp。AudioFileReader (“audio48kHz.wav”“SamplesPerFrame”4 *米);X = reader();Xr = src(x);获得速率转换FIRb = first . stage1 .分子;计算重采样延迟i0 =地板(长度(b)/2)/L;图;持有;茎((1:长度(x)) +钱数,x);茎(linspace(1、长度(x)长度(xr)), xr,“r”);持有;传奇(输入音频的重新取样音频的);xlim([150200])释放(读者);

通过速率转换松弛简化

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

成本(src)
ans = struct with fields: 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 =结构与字段:NumCoefficients: 61 NumStates: 5 MultiplicationsPerInputSample: 5.0833 AdditionsPerInputSample: 4.1667

参考文献

[1]奥本海姆,a.v.和r·w·谢弗,离散时间信号处理, Prentice-Hall, 1989。