ドキュメンテーション

このページは前リリースの情報です。該当の英語のページはこのリリースで変更されています。最新情報を確認するには、ページ左下にある国リストで [United States] を選択し、英語ドキュメンテーションに切り替えてください。

FIR 内挿

この例では、DSP System Toolbox™ の FIR 内挿を使用して信号のサンプルレートを増やす方法を示します。

FIR 内挿の作成

DSP System Toolbox は FIR ベースの構造や CIC を含む内挿を実行するためにさまざまな構造をサポートしています。内挿係数 L が与えられた場合、通常 FIR 内挿フィルターはカットオフ周波数が pi/L、ゲインが L のナイキスト フィルターとして設計されます。この種類のフィルターでは元のサンプルがそのまま残り、元のサンプルの間に L-1 個のサンプルが内挿されます。内挿フィルターの設計についての詳細は、関数 FIRHALFBAND、FIRNYQUIST、FIREQINT および INTFILT に加え、FDESIGN.INTERPOLATOR および FDESIGN.NYQUIST を参照してください。

L  = 3; % Interpolation factor
Hf = fdesign.interpolator(L,'Nyquist',L);
Hi = design(Hf,'SystemObject',true); % Polyphase FIR Interpolator

小数ファクターで内挿するには、直接型 FIR ポリフェーズ サンプル レート変換を使用できます。この構造は、L ポリフェーズ サブフィルターを使用します。

M   = 2; % Decimation factor
Hf  = fdesign.rsrc(L,M,'Nyquist',max(L,M));
Hd2 = design(Hf,'SystemObject',true); % Polyphase FIR Fractional Decimator

FIR 内挿の解析

既定の内挿フィルターには、線形位相があります。フィルターの可視化ツール (FVTool) での情報解析でそれを確認できます。

hfvt = fvtool(Hi, 'Analysis', 'info');
hfvt.Color = [1 1 1];

内挿フィルターが対称であり、そのために線形位相がある場合でも、ポリフェーズ要素は必ずしも対称ではなく、したがって、必ずしも正確な線形位相があるわけではないことに注意してください。ただし、各非対称ポリフェーズ フィルターに対して、鏡像ポリフェーズ フィルターが存在します。このポリフェーズ フィルターには、すべての位相の歪みを補正する鏡像群遅延のあるまったく同じ振幅応答があります。

%set(hfvt, 'PolyphaseView','on', 'Analysis', 'grpdelay','Legend','on')
hfvt.PolyphaseView = 'on';
hfvt.Analysis = 'grpdelay';
hfvt.Legend = 'on';

FIR 内挿を使用したフィルター処理

入力信号 x[n] は、44.1 kHz でサンプリングされた 7 kHz 正弦波です。

N  = 30;
Fs = 44.1e3;
n  = (0:N-1).';
x  = sin(2*pi*n*7e3/Fs);

% Filter with a Direct-Form FIR Polyphase Interpolator.
y1 = step(Hi,x);

内挿信号の時間領域解析

入力サンプルに関するフィルターの群遅延は、フィルターの長さから 1 を引き内挿係数で割った半分になります。

delay = (length(Hi.Numerator)-1)/(2*L);
t = delay*L+(0:L:L*length(x)-L);
t1 = 0:length(y1)-1;

直接型 FIR ポリフェーズ内挿の出力を表示し、元の信号 (基準) を重ねます。

stem(t,x,'filled','k');
hold on
stem(t1,y1);
axis([0 90 -Inf Inf])
legend('Original signal','Interpolated Signal',2)
xlabel('Samples')
ylabel('Amplitude')
fig = gcf;
fig.Color = [1 1 1];

内挿信号の周波数領域解析

入力信号および内挿信号の両方のパワー スペクトル密度を計算します。

% Create an audio file reader and point to an audio file with sound sampled
% at 48 kHz
Ha = dsp.AudioFileReader('audio48kHz.wav');

% Create a spectrum analyzer to view the spectrum of the input and
% interpolated audio.
Hs = dsp.SpectrumAnalyzer('SampleRate',96e3,'ShowLegend',true,...
  'SpectralAverages',10);

% Design an interpolate-by-2 filter to interpolate the signal from 48 kHz
% to 96 kHz
L  = 2;
Hf = fdesign.interpolator(L,'Halfband');
Hi = design(Hf,'SystemObject',true);

入力スペクトルと出力スペクトルを同時にプロットするために、各サンプルの間にゼロを挿入して入力が独立に 96 kHz にアップサンプリングされます。同じパワー レベルを維持するために、アップサンプリングされた信号をアップサンプリング係数で乗算します。

while ~isDone(Ha)
    x  = step(Ha);        % Original 48 kHz audio
    xu = L*upsample(x,L); % Insert a zero every other sample to compare
    y  = step(Hi,x);      % Interpolated 96 kHz audio (input is x, not xu)
    step(Hs,[xu,y]);
end

% Release Audio File Reader
release(Ha);

予測どおり、内挿フィルターによって元の信号のスペクトルの複製が削除されました。

この情報は役に立ちましたか?