主要内容

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

此示例显示如何有效地将采样率有效转换为任意因素。

在许多应用中,任意因子的采样率转换的需要(例如,数字接收器中的符号同步,语音编码和合成,连续时间系统的计算机仿真等)。在该示例中,我们将检查一个实例,当需要将信号的采样率转换为8kHz至44.1kHz时,在需要将基于多项式和多相滤波器形成有效溶液的示例。

单级多相法

多相结构通常被认为是多速率滤波器的有效实现。然而,在分数采样率转换的情况下,阶段的数量,因此滤波器顺序,可以迅速变得过高。要将信号从8 kHz重组至44.1 kHz,我们将441内递并为80(8 * 441/80 = 44.1)。

samprateconv = dsp.samplerateconverter('带宽', 6 e3,......'InputSamplerate', 8 e3,'opportsamplerate',44.1e3,......“StopbandAttenuation”, 50);

这可以通过两个阶段以相对有效的方式完成:

信息(SAMPRATECONV)成本(SAMPRATECONV)
ANS ='整体插值因子:441整体抽取因子:80个过滤器数量:2个乘法数采样:95.175000系数数:1774滤波器:滤波器1:DSP.FirrateConverter  - 插值因子:147  - 抽取因子:80过滤器2:dsp.firinterpolator  - 插值因子:3'ans = struct with字段:numcofiratients:1774 numstates:30多重PULTINPUTSAMPLE:95.1750 AdderdsperInputsample:89.6750

虽然每个输入样本的操作数是合理的(大约95乘以,请记住,在第一阶段到14.7 kHz之后的速率增加),在这种情况下,1774系数必须存储在存储器中。

提供输出速率公差

减轻大量系数的一种方法可以是如果确切的速率并不关键,则可以允许输出采样率的公差。例如,指定1%的公差导致44 kHz的输出速率,而不是44.1kHz。现在,这需要将11个且减少次数。它可以通过单一阶段有效地完成。

samprateconvwithtol = dsp.samplerateconverter('带宽', 6 e3,......'InputSamplerate', 8 e3,'opportsamplerate',44.1e3,......“StopbandAttenuation”, 50岁,“OutputRateTolerance”, 0.01);成本(sampRateConvWithTol)
ANS =带字段的结构:NUMCOFICERS:120 NUMSTATES:12多匹配PERINPUTSAMPLE:60

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

单阶段分娩方法

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

farrowsamprateconv_3rd = dsp.farrowrateconverter('InputSamplerate', 8 e3,......'opportsamplerate',44.1e3,'polynomialOrder'3);farrowsamprateconv_4th = dsp.farrowrateconverter('InputSamplerate', 8 e3,......'opportsamplerate',44.1e3,'polynomialOrder'4);成本(farrowsamprateconv_3rd)成本(farrowsamprateconv_4th)
ans = struct with fields: NumCoefficients: 16 NumStates: 3 MultiplicationsPerInputSample: 71.6625 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,“多相采样率转换器”......'3RD订购分部内插器''第4次命令interpoolator'......“位置”“东北”

提供输出速率容差不会显着影响Farrow滤波器的实施成本。但是,它确实以与DSP.SamplerateConverter相同的方式更改插值和抽取因子。

farrowsamprateconv_4th = dsp.farrowrateconverter('InputSamplerate', 8 e3,......'opportsamplerate',44.1e3,'polynomialOrder',4,......“OutputRateTolerance”, 0.01);信息(farrowsamprateconv_4th)成本(farrowsamprateconv_4th)
ans = 12x52 char array'离散时间fir multioriles filter(Real)''-------------------------------------------------''过滤器结构:分娩采样率转换器''插值因子:11''抽取因子:2''滤波器长度:5''稳定:是'''线性阶段:不'''算术:双'输出率容差:1.000000%'调整输出率:44000.000000'ANS =带有字段的结构:NUMCOFICERS:25 NUMSTATES:4多重PULTINPUTSAMPLE:121

Farrow和FIR多相结构级联

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

intsamprateconv = dsp.samplerateconverter('带宽', 6 e3,......'InputSamplerate', 8 e3,'opportsamplerate'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,......'opportsamplerate',44.1e3,'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: 17.9156 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))));Xlabel(的频率(赫兹)) ylabel ('幅度(db)') 传奇(“组合多相和法罗样品速率转换器”......“位置”“东北”

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

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