主要内容

有效的样本率转换之间的任意因素

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

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

单级多相法

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

sampRateConv = dsp。SampleRateConverter (“带宽”, 6 e3,...“InputSampleRate”, 8 e3,“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 (“带宽”, 6 e3,...“InputSampleRate”, 8 e3,“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”, 8 e3,...“OutputSampleRate”, 44.1 e3,“PolynomialOrder”3);farrowSampRateConv_4th = dsp。FarrowRateConverter (“InputSampleRate”, 8 e3,...“OutputSampleRate”, 44.1 e3,“PolynomialOrder”4);成本(farrowSampRateConv_3rd)成本(farrowSampRateConv_4th)
ans = struct with fields: NumCoefficients: 16 NumStates: 3 MultiplicationsPerInputSample: 66.1500 AdditionsPerInputSample: 60.6375 ans = struct with fields: NumCoefficients: 25 NumStates: 4 MultiplicationsPerInputSample: 121.2750 AdditionsPerInputSample: 99.2250

对于三阶多项式,需要16个系数,每个输入样本约66次乘法。四阶多项式提供了稍好的低通响应,但代价较高:每个输入样本有25个系数和121个乘法。

filts = getFilters (sampRateConv);W = linspace (0, 44.1 e3, 2048);定义频率范围分析Fs1 = 8 e3 * 147;%等效的单级滤波器的时钟频率为3.53 MHzhfvt = fvtool (filts。Stage1 farrowSampRateConv_3rd,...farrowSampRateConv_4th,“FrequencyRange”“指定freq.向量”...“FrequencyVector”W,“Fs”, (Fs1 3 * 3 * Fs1 Fs1),...“NormalizeMagnitudeto1”“上”“颜色”“白色”);传奇(hfvt“多相采样率转换器”...“3 rd-order法罗插入器”“四阶法罗插入器”...“位置”“东北”

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

farrowSampRateConv_4th = dsp。FarrowRateConverter (“InputSampleRate”, 8 e3,...“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多相结构的级联

我们现在试图设计一种混合的解决方案,利用我们之前见过的两种类型的过滤器。多相滤波器特别适合于插值或整数因子的抽取,以及当插值和抽取因子较低时的分数率转换。法罗滤波器可以有效地实现任意(包括不合理的)速率变化因素。首先,我们用一个级联的FIR半带滤波器对原始的8khz信号进行插值。

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

然后,我们对中间的32 kHz信号进行插值,取44.1/32 = 1.378125,得到理想的44.1 kHz最终采样频率。为此,我们使用了一个基于三次拉格朗日多项式的滤波器。

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

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

成本(intSampRateConv)成本(farrowSampRateConv)
ans = struct with fields: NumCoefficients: 34 NumStates: 11 MultiplicationsPerInputSample: 34 AdditionsPerInputSample: 31 ans = struct with fields: NumCoefficients: 16 NumStates: 3 MultiplicationsPerInputSample: 16.5375 AdditionsPerInputSample: 15.1594

这种混合设计的系数数相对较低(36),每个输入样本的乘法数也相对较低:28 + 16*4 = 92。这两种设计的综合频响优于farrowSampRateConv_3rd或farrowSampRateConv_4th。

[Hsrc f] = freqz (intSampRateConv);Fsfar = 32 e3 * 441;Hfsrc = freqz (farrowSampRateConv f Fsfar);Hhybrid = Hsrc。* Hfsrc;Hhybrid_norm = Hhybrid /规范(Hhybrid正);% Normalize星等为0 dB情节(f, 20 * log10 (abs (Hhybrid_norm)));包含(的频率(赫兹)) ylabel (“(dB)级”)传说(“组合多相和法罗样品速率转换器”...“位置”“东北”

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

= dsp范围。简介(“SpectralAverages”, 50岁,...“SampleRate”, 44.1 e3,“PlotAsTwoSidedSpectrum”假的,...“YLimits”20 [-80],“ShowLegend”,真的,...“ChannelNames”, {“单级设计”“多阶段设计”});抽搐,toc < 20跑20秒x = randn (8000 1);%使用多级FIR滤波器的转换速率日元= sampRateConv (x);%使用多级FIR和Farrow滤波器的级联转换率ytemp = intSampRateConv (x);y2 = farrowSampRateConv (ytemp);%比较两种方法的输出范围((y1, y2))结束