使用法罗结构的小数延迟滤波器
此示例说明如何使用法罗结构设计数字小数延迟滤波器。数字小数延迟滤波器是微调信号采样时刻的有用工具。它们通常出现在数字调制解调器的同步中,其中延迟参数随时间变化。此示例说明为什么法罗结构是实现时变 FIR 小数延迟滤波器的流行方法。
理想小数延迟滤波器
理想小数延迟滤波器是线性相位全通滤波器。其冲激响应是存在时间偏移的离散正弦函数,对应于一个非因果滤波器。由于冲激响应是无限的,您无法通过有限的时间偏移量使其成为因果滤波器。因此,该滤波器无法实现,只能逼近。
法罗结构
要计算小数延迟滤波器的输出,您需要估计现有离散时间采样之间的输入信号值。您可以使用特殊的插值滤波器计算任意点上的新采样值。在插值滤波器中,基于多项式的滤波器特别引人关注,因为一种特殊的结构 - 法罗结构 - 允许更简单地处理系数。特别是,法罗结构的可调性使其非常适合实际的硬件实现。

最平坦 FIR 逼近(拉格朗日插值)
拉格朗日插值是一种时域方法,它会得出基于多项式的滤波器的一种特例,其中您使用 M 次多项式来逼近输出信号。最简单的情形 (M = 1) 对应线性插值。设计并分析一个线性小数延迟滤波器,该滤波器将单位延迟按各种分数进行分割。
Nx = 1024; Nf = 5; yw = zeros(Nx,Nf); transferFuncEstimator = dsp.TransferFunctionEstimator( ... SpectralAverages=25,FrequencyRange="onesided"); arrPlotPhaseDelay = dsp.ArrayPlot(PlotType="Line",YLimits=[0 1.5], ... YLabel="Phase delay",SampleIncrement=1/512); arrPlotMag = dsp.ArrayPlot(PlotType="Line",YLimits=[-10 1], ... YLabel="Magnitude (dB)",SampleIncrement=1/512); fracDelay = dsp.VariableFractionalDelay; xw = randn(Nx,Nf); transferFuncEstimator(xw,yw); w = getFrequencyVector(transferFuncEstimator,2*pi); w = repmat(w,1,Nf); tic, while toc < 2 yw = fracDelay(xw,[0 0.2 0.4 0.6 0.8]); H = transferFuncEstimator(xw,yw); arrPlotMag(20*log10(abs(H))) arrPlotPhaseDelay(-angle(H)./w) end release(fracDelay) release(transferFuncEstimator) release(arrPlotMag)

release(arrPlotPhaseDelay)

对于任何延迟值,理想滤波器都应具有平坦的幅值响应和平坦的相位延迟响应。该逼近仅对最低频率是正确的。因此,在实践中,您需要对信号进行过采样,以使线性小数延迟正常工作。在此步骤中,您将两个不同小数延迟应用于一个正弦波,并使用时间示波器将原始正弦波和两个延迟版本进行叠加。0.2 个采样的延迟、采样率为 1000 Hz 对应于 0.2 毫秒的延迟。
scope = timescope(SampleRate=1000, ... YLimits=[-1 1], ... TimeSpan=.02, ... TimeSpanOverrunAction="scroll"); sine = dsp.SineWave(Frequency=50, SamplesPerFrame=Nx); tic, while toc < 2 x = sine(); y = fracDelay(x,[.2 .8]); % Delay by 0.2 and 0.8 samples (i.e. 0.2ms and 0.8ms respectively) scope([x,y(:,1),y(:,2)]) end release(fracDelay) release(scope);

您可以设计更高阶的拉格朗日插值器。比较三次拉格朗日插值器和线性插值器。
farrowFracDelay = dsp.VariableFractionalDelay( ... InterpolationMethod="Farrow",MaximumDelay=1025); Nf = 2; yw = zeros(Nx,Nf); xw = randn(Nx,Nf); H = transferFuncEstimator(xw,yw); w = getFrequencyVector(transferFuncEstimator,2*pi); w = repmat(w,1,Nf); tic, while toc < 2 % Run for 2 seconds yw(:,1) = fracDelay(xw(:,1),0.4); % Delay by 0.4 samples (0.4ms) yw(:,2) = farrowFracDelay(xw(:,2),1.4); % Delay by 1.4 samples (1.4ms) H = transferFuncEstimator(xw,yw); arrPlotMag(20*log10(abs(H))) arrPlotPhaseDelay(-unwrap(angle(H))./w) end release(fracDelay) release(transferFuncEstimator) release(arrPlotMag)

release(arrPlotPhaseDelay)

当您使用拉格朗日逼近时,增大多项式的阶数会略微增大有用的带宽。微分滤波器的长度,即冲激响应的段数('Coefficients' 属性中的行数)等于多项式的长度('Coefficients' 属性中的列数)。您可以使用其他设计方法来克服此限制。三阶滤波器的相位延迟在 DC 处从 0.4 个采样偏移到 1.4 个采样。由于三次拉格朗日插值器是三阶滤波器,它能实现的最小延迟是 1。因此,在这种情况下,延迟是 1.4 毫秒,而不是 0.4 毫秒。
sine = dsp.SineWave(Frequency=50,SamplesPerFrame=Nx); tic, while toc < 2 x = sine(); y1 = fracDelay(x,0.4); y2 = farrowFracDelay(x,1.4); scope([x,y1,y2]) end release(fracDelay) release(scope);

时变小数延迟
法罗结构相对于直接型 FIR 的优势在于其可调性。在许多实际应用中,延迟是时变的。对于每个新延迟,在直接型实现中您都需要一组新系数,但使用法罗实现,多项式系数保持不变。

tic, while toc < 5 x = sine(); if toc < 1 delay = 1; elseif toc < 2 delay = 1.2; elseif toc < 3 delay = 1.4; elseif toc < 4 delay = 1.6; else delay = 1.8; end y = farrowFracDelay(x,delay); scope([x,y]) end release(fracDelay) release(scope);
