主要内容

使用法罗结构的小数延迟滤波器

此示例说明如何使用法罗结构设计数字小数延迟滤波器。数字小数延迟滤波器是微调信号采样时刻的有用工具。它们通常出现在数字调制解调器的同步中,其中延迟参数随时间变化。此示例说明为什么法罗结构是实现时变 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);

另请参阅

主题