主要内容

任意因子之间有效的采样率转换

这个例子展示了如何在任意因素之间有效地转换样本率。

在许多应用中(例如数字接收机中的符号同步、语音编码和合成、连续时间系统的计算机仿真等)都需要任意因素的采样率转换。在本例中,我们将检查一个示例,其中当需要将信号的采样率从8 kHz转换为44.1 kHz时,基于多项式的级联和多相滤波器构成了一个有效的解决方案。

单级多相方法

多相结构通常被认为是多速率滤波器的有效实现。然而,在分数采样率转换的情况下,相位数,因此滤波器阶数,可能很快变得过高。为了将信号从8千赫重采样到44.1千赫,我们用441插值,用80抽取(8*441/80=44.1)。

sampRateConv = dsp。SampleRateConverter (“带宽”,6e3,...“InputSampleRate”,8e3,“OutputSampleRate”, 44.1 e3,...'stopbandattenuation',50);

这可以以相对有效的方式分两个阶段进行:

信息(sampRateConv)成本(sampRateConv)
ans = '整体插值因子:441整体抽取因子:80滤波器数量:2乘每输入样本:95.175000系数数量:1774滤波器:滤波器1:dsp。FIRRateConverter -插值因子:147 -抽取因子:80滤波器2:dsp。FIRInterpolator -插值因子:3 ' ans = struct with fields: NumCoefficients: 1774 NumStates: 30 MultiplicationsPerInputSample: 95.1750 AdditionsPerInputSample: 89.6750

尽管每个输入样本的操作数量是合理的(大约95次乘法——记住在第一阶段之后速率增加到14.7 kHz),但在这种情况下,必须将1774个系数存储在内存中。

提供输出率容差

减轻大量系数的一种方法是,如果准确的采样率不是关键的,允许输出采样率有一个公差。例如,指定1%的容差将导致输出速率为44 kHz而不是44.1 kHz。这现在需要插值11和decimate 2。它可以通过一个简单的步骤有效地完成。

sampRateConvWithTol = dsp。SampleRateConverter (“带宽”,6e3,...“InputSampleRate”,8e3,“OutputSampleRate”, 44.1 e3,...'stopbandattenuation',50,'outputratetolerance', 0.01);成本(Samprateconvwithtol)
ans = struct带有以下字段:NumCoefficients: 120 NumStates: 12 MultiplicationsPerInputSample: 60 AdditionsPerInputSample: 55

在这种情况下,需要120系数,并且每个输入样本的乘法数为60。

单一阶段的攻击方法

多项式滤波器是另一种克服需要存储大量系数的问题的方法。Farrow结构是此类过滤器的有效实现。

farrowSampRateConv_3rd = dsp。FarrowRateConverter (“InputSampleRate”,8e3,...“OutputSampleRate”, 44.1 e3,“PolynomialOrder”,3);farrowsamprateconv_4th = dsp.farrowrateconverter(“InputSampleRate”,8e3,...“OutputSampleRate”, 44.1 e3,“PolynomialOrder”4);成本(farrowSampRateConv_3rd)成本(farrowSampRateConv_4th)
ANS =带字段的结构:NUMCOFICERS:16 NUMSTATES:3多匹配项PUTINSAMPLE:66.1500 AdderSINPUTSAMPLE:60.6375 ANS =结构与字段:NUMCOEFICERS:25 NUMSTATES:4多拼音PERINPUTSAMPLE:121.2750

利用3阶多项式,需要16个系数,每个输入样本约66个乘法。四阶多项式以较高的成本提供稍微更好的低通响应:每次输入样本25系数和121个乘法。

filts = getFilters(Samprateconv);w = linspace(0,44.1e3,2048);%定义频率范围分析FS1 = 8E3 * 147;%等效单级滤波器在3.53 MHz时钟计时hfvt = fvtool(filts.stage1,farrowsamprateconv_3rd,...farrowsamprateconv_4th,'频率范围''指定频率。向量'...'频率矢量',w,'fs',[FS1 3 * FS1 3 * FS1],...“NormalizeMagnitudeto1”“上”'颜色'“白色”);传奇(hfvt'多相采样率转换器'...“3 rd-order法罗插入器”“四阶法罗插入器”...'地点''东北'

提供一个输出速率公差不会显著影响Farrow过滤器的实现成本。然而,它确实改变了插值和抽取因子,就像它对dsp.SampleRateConverter所做的一样。

farrowsamprateconv_4th = dsp.farrowrateconverter(“InputSampleRate”,8e3,...“OutputSampleRate”, 44.1 e3,“PolynomialOrder”,4,...'outputratetolerance', 0.01);信息(farrowSampRateConv_4th)成本(farrowSampRateConv_4th)
ans = 12x52 char array '离散时间FIR多速率滤波器(real)' '----------------------------------------- ' ' 滤波器结构:法罗采样率转换器“插值因素:11“大量毁灭因素:2“滤波器长度:5“稳定:是的“线性相位:没有‘‘算术:双重“输出率公差:1.000000%“调整输出率:44000.000000“ans =结构体字段:NumCoefficients: 25 NumStates: 4 multiplationsperinputsample: 121 AdditionsPerInputSample: 99

Farrow和FIR多相结构的级联

我们现在尝试设计一个混合解决方案,这些解决方案将利用我们之前看到的两种类型的过滤器。多相滤波器特别适合于整数因子的插值或抽取,并且当插值和抽取因子低时分率转换。Farrow滤波器可以有效地实现任意(包括非理性)速率变化因子。首先,我们使用级联FIR半带滤波器将原始的8 kHz信号插入4。

intSampRateConv = dsp。SampleRateConverter (“带宽”,6e3,...“InputSampleRate”,8e3,“OutputSampleRate”,32e3,...'stopbandattenuation',50);信息(Intsamprateconv)
ans = '整体插值因子:4整体抽取因子:1滤波器的数量:1乘每输入样本:34.000000系数的数量:34滤波器:滤波器1:dsp。FIRInterpolator -插值因子:4 '

然后,我们通过44.1 / 32 = 1.378125将中间32 kHz信号插入中间32 kHz信号,以获得所需的44.1kHz最终采样频率。我们使用基于立方拉格朗兰多项式的过滤器以此目的。

farrowSampRateConv = dsp。FarrowRateConverter (“InputSampleRate”,32e3,...“OutputSampleRate”, 44.1 e3,“PolynomialOrder”,3);

通过将两个过滤器级联起来,可以简单地获得整个过滤器。

成本(intsamprateconv)成本(farrowsamprateconv)
ANS = struct with字段:numcofient:34 numstates:11乘法PultInputsample:34 AddertsPultInputSample:31 ANS =带有字段的结构:NUMCOFICERS:16 NUMSTATES:3多重PERINPUTSAMPLE:16.5375 AddersperInputSample:15.1594

该混合设计的系数的数量相对较低(36),每个输入样本的乘数数量也相对较低:28 + 16 * 4 = 92.这两个设计的组合频率响应优于Farrowsamprateconv_3rd或farrowsamprateconv_4th。

[HSRC,F] = Freqz(Intsamprateconv);FSFAR = 32E3 * 441;hfsrc = freqz(farrowsamprateconv,f,fsfar);hhybrid = hsrc。* hfsrc;hhybrid_norm = hhybrid / norm(hhybrid,inf);%将幅度正常化为0 dB情节(f, 20 * log10 (abs (Hhybrid_norm)));包含('频率(Hz)')ylabel(“(dB)级”)传说(“组合多相和欺凌采样率转换器”...'地点''东北'

现在我们叠加了单级和多级设计的频率响应。显然,这些反应是非常相似的。

= dsp范围。简介('spectralaverages',50,...“SampleRate”, 44.1 e3,'plotastwosidedspectrum',错误的,...'ylimits',[ -  80 20],“ShowLegend”,真的,...'ChannelNames',{“单级设计”'多级设计'});抽搐,尽管TOC <20%运行20秒x = randn (8000 1);%使用多级FIR滤波器的转换速率y1 = samprateconv(x);%使用多级FIR和Farrow滤波器的级联转换率ytemp = intsamprateconv(x);y2 = farrowsamprateconv(ytemp);%比较两种方法的输出范围([Y1,Y2])结尾