Farrow 構造を使用した非整数遅延フィルター
この例では、Farrow 構造を使用して実装されるデジタル非整数遅延フィルターの設計法を示します。デジタル非整数遅延フィルターは、信号のサンプリングの瞬間を微調整するのに便利なツールです。これらはたとえば、遅延パラメーターが時間とともに変化するデジタル モデムの同期に通常使用されます。この例では、時変 FIR 非整数遅延フィルターの実装によく使用される Farrow 構造について示します。
理想非整数遅延フィルター
理想非整数遅延フィルターは、線形位相オールパス フィルターです。そのインパルス応答は、非因果フィルターに対応した時間シフト離散 sinc 関数です。インパルス応答は無限であるので、時間の有限シフトによって因果的にすることはできません。したがって、これは実現不可能であり、近似しなければなりません。
Farrow 構造
非整数遅延フィルターの出力を計算するには、既存の離散時間サンプル間の入力信号値を推定する必要があります。任意の点における新しいサンプル値を計算するには、特殊な内挿フィルターを使用できます。これらのフィルターのうち、多項式ベースのフィルターは、その特殊な構造、つまり Farrow 構造のおかげで係数を簡単に処理できるので、特に有用です。特に、Farrow 構造の調整可能性により、これは実用的なハードウェアの実装に適しています。
可能な限り平坦な 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)
遅延の値に対し、理想フィルターは平坦な振幅応答と平坦な位相遅延応答をもっていなければなりません。近似は最小周波数に対してのみ正しくなります。つまり、実際に線形非整数遅延が正しく機能するには、信号をオーバーサンプリングする必要があります。ここでは、正弦波に 2 つの異なる非整数遅延を適用し、元の正弦波と 2 つの遅延バージョンを、時間スコープを使用して重ねます。サンプルレート 1000 Hz における 0.2 サンプルの遅延は、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 ms and 0.8 ms scope([x,y(:,1),y(:,2)]) end release(fracDelay) release(scope);
より高次のラグランジュ内挿器を設計できます。3 次ラグランジュ内挿器を線形内挿器と比較してみましょう。
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 ms yw(:,2) = farrowFracDelay(xw(:,2),1.4); % Delay by 1.4 ms 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' プロパティの列数) に等しくなります。他の設計法を使用してこの制限を克服することもできます。また、3 次フィルターの位相遅延が DC でどのように 0.4 サンプルから 1.4 サンプルにシフトするかにも注目してください。3 次ラグランジュ内挿器は 3 次フィルターであるため、達成可能な最小遅延は 1 になります。そのため、要求する遅延は、この場合、0.4 ms ではなく 1.4 ms になります。
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 と比較した Farrow 構造の利点は、その調整可能性にあります。数多くの実用アプリケーションにおいて、遅延は時間とともに変化します。新しい各遅延に対し、直接型実装では新しい係数の集合が必要ですが、Farrow 実装では多項式係数は一定になります。
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);