此示例显示如何有效地将采样率有效转换为任意因素。
在许多应用中,任意因子的采样率转换的需要(例如,数字接收器中的符号同步,语音编码和合成,连续时间系统的计算机仿真等)。在该示例中,我们将检查一个实例,当需要将信号的采样率转换为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
我们现在试图设计一种混合的解决方案,利用我们之前见过的两种类型的过滤器。多相滤波器特别适合于插值或整数因子的抽取,以及当插值和抽取因子较低时的分数率转换。法罗滤波器可以有效地实现任意(包括不合理的)速率变化因素。首先,我们用一个级联的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))结束