多级汇率转换是一种将汇率转换分为几个阶段的方法。例如,不是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
这个特殊的设计有三个阶段(),其中最后一级的低通段最长。
重复单级设计。
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
这是一个带因数的五阶段小数级联谁的产品是像预期的那样。
设计一个类似的滤波器,默认过渡宽度和衰减。总体转换率是相似的,但是转换宽度(可能还有阶段的顺序)可能不同。
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]FIRRateConverter]
我们还可以指定绝对频率(而不是比率)。例如,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])释放(读者);
转换率(在前一节中使用)需要大的上样本和下样本比,即使是它的简化形式也是如此.这种转换所需的过滤器相当长,除了内存和计算负载之外,还引入了显著的延迟。
成本(src)
ans = struct with fields: NumCoefficients: 8587 NumStates: 58 MultiplicationsPerInputSample: 53.6688 AdditionsPerInputSample: 52.7500
我们可以通过近似的速率转换因子来减轻昂贵的转换。例如,
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。