最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Family Radio Service 用デジタル アップ コンバージョンおよびデジタル ダウン コンバージョン

この例では、デジタル アップ コンバーター (DUC) とデジタル ダウン コンバーター (DDC) の System object を使用して、Family Radio Service (FRS) 用の送信機と受信機を設計する方法を示します。これらの System object は、内挿/間引きフィルターを設計したり、アップ/ダウン コンバージョン処理の実装で必要な手順を簡略化したりするためのツールを提供します。この例では、MATLAB® および Simulink® 両方での実装について説明します。MATLAB バージョンでは DUC と DDC の System object を使用し、Simulink バージョンでは DUC と DDC のブロックを使用します。どちらのバージョンでも音声信号が入力として使用され、伝送後の信号が再生されます。

FRS は、1996 年から米国で承認されている、改良型のウォーキー トーキー FM 無線システムです。このパーソナル無線サービスでは、チャネル化された周波数を超高周波数 (UHF) 帯域で使用します。FRS 帯域で動作するデバイスは、FFC 規定の『Part 95 Subpart B "Family Radio Service" (セクション 95.191 ~ 95.194)』に基づいて認定を受けなければなりません。FRS チャネルの認定された帯域は 12.5 KHz で、チャネル間の中心周波数分離は 25 KHz です。

はじめに

この例では、FRS チャネルを介して送信される信号のデジタル アップ コンバージョンと、FRS 無線送信機から送られる信号のダウン コンバージョンについて説明します。

まず、8 KHz の音声を 50 KHz にリサンプリングします。送信側の DUC は、信号を 50 KHz から 2 MHz にアップ コンバートし、IF 周波数 455 KHz にシフトさせます。

受信側には、アナログ フロント エンドがあり、受信した信号を IF 周波数 455 KHz に変換します。さらに、信号は、2 MHz でサンプリングされます。受信側の DDC では、サンプルレート 50 KHz で信号をベースバンドに戻します。これにより、8 KHz の音声範囲に戻されます。

デジタル アップ コンバーターの設計

デジタル アップ コンバーターは、DUC System object を作成して設計します。DUC オブジェクトには、3 つの内挿フィルターのカスケードと、内挿信号を指定の通過帯域周波数にアップ コンバートする発振器が含まれます。DUC オブジェクトのブロック線図を以下に示します。

DUC オブジェクトには、内挿フィルターを定義するオプションがあります。たとえば、正弦波ジェネレーターまたは数値制御発振器のいずれかを使用して発振器を設計できます。以下のセクションでは、FRS 送信機の内挿フィルターを設計するときに使用できる各種のオプションを紹介します。

内挿フィルターの設計

DUC オブジェクトは、3 つのフィルター段階を使用して内挿フィルターを実装します。DUC オブジェクトがフィルターを内的に設計する場合、最初の段階はハーフバンドまたはローパス フィルターを、第 2 段階は CIC 補償器を、第 3 段階は CIC 内挿フィルターを含みます。DUC オブジェクトでは、通過帯域周波数および阻止帯域周波数、通過帯域リップル、および阻止帯域の減衰を含め、3 つのフィルターのカスケード応答を定義する複数の特性を指定できます。

最小次数フィルター設計

既定では (MinimumOrderDesign プロパティが true に設定されている場合)、DUC オブジェクトは、指定の通過帯域および阻止帯域仕様に基づいて、最小次数の内挿フィルター設計を取得します。

この FRS の例では、送信された信号を 50 KHz から 2 MHz へアップ サンプリングしなければなりません。これにより、内挿係数 40 が得られます。DUC オブジェクトは、この内挿値を自動的に因数分解するため、第 1 フィルター段は 2 で、第 2 フィルター段は 2 で、CIC フィルターは 10 で内挿されます。

FRS チャネルの両側波帯域は 12.5 KHz です。DUC オブジェクトの Bandwidth プロパティを 12.5 KHz に設定し、内挿フィルターのカスケード応答の通過帯域周波数が 12.5e3/2 = 6.25 KHz になるようにします。

通過帯域リップルを 0.005 dB という小さな値に設定し、FRS 信号の歪みを回避します。阻止帯域の減衰を 60 dB に設定します。

既定では (StopbandFrequencySource プロパティが 'Auto' に設定されている場合)、DUC オブジェクトは、カスケード応答のカットオフ周波数をほぼ入力ナイキスト レート 25 KHz に設定します。また、オブジェクトは、阻止帯域周波数を 2Fc-Fpass = 2*25e3 - 12.5e3/2 = 43.75 KHz に設定します。ここで、Fc はカットオフ周波数、Fpass は通過帯域周波数です。このシナリオでは、DUC オブジェクトは阻止帯域周波数をできる限り緩和し、カスケード応答の遷移帯域でエイリアシング エネルギーを許容しながら、最低フィルター次数を取得します。この設計トレードオフは、フィルター次数の最小化を優先する際に有効です。

DUC = dsp.DigitalUpConverter(...
  'SampleRate',50e3,...
  'InterpolationFactor',40,...
  'Bandwidth',12.5e3,...
  'PassbandRipple',0.05,...
  'StopbandAttenuation',60);

DUC オブジェクトの fvtool または visualizeFilterStages メソッドを使用して、間引きフィルターのカスケード応答を可視化します。フィルター係数および演算が倍精度になるように、算術を 'double' に指定します。

fvt = fvtool(DUC,'Arithmetic','double');

close(fvt)
fvt = visualizeFilterStages(DUC,'Arithmetic','double');

getFilterOrders メソッドを使用して、設計したフィルターの次数を取得します。

s = getFilterOrders(DUC);
s.FirstFilterOrder
ans =

    10

s.SecondFilterOrder
ans =

    12

FRS チャネル分離は 25 KHz です。一般的な FRS 無線では、隣接チャネル除去 (ACR) が 50 dB 以上となっています。しかし、上記のように設計した間引きフィルターのカスケード応答は、25 MHz で 50 dB の減衰を達成できません。この問題の解決策として考えられるのは、DUC オブジェクトに信号を通す前に、必要な遷移幅と阻止帯域の減衰を含むローパス フィルターでベースバンド FRS 信号をフィルタリングすることです。もう 1 つの解決策として、必要なスペクトル マスクを満たす狭い遷移帯域をもつカスケード応答を設計するように、DUC オブジェクトを設定することがあります。狭い遷移帯域をもつ総フィルター応答を設計するには、StopbandFrequencySource プロパティを 'Property' に、StopbandFrequency プロパティを適切な値に設定します。

隣接 FRS チャネルの通過帯域エッジで、カスケード応答が阻止帯域周波数となるように (すなわち、25e3-12.5e3/2 = 18.75 KHz)、フィルターを設計します。StopbandAttenuation プロパティを 60 dB に設定し、ACR が 60 dB になるようにします。

DUC.StopbandFrequencySource = 'Property';
DUC.StopbandFrequency = 18.75e3;
DUC.StopbandAttenuation = 60;
close(fvt)
fvt = fvtool(DUC,'Arithmetic','double');

フィルター次数を取得します。

s = getFilterOrders(DUC);
s.FirstFilterOrder
ans =

    23

s.SecondFilterOrder
ans =

     7

新しいカスケード応答は、隣接 FRS チャネルの中心である 25 KHz で 60 dB を実現します。第 1 段フィルターの次数 (ローパス内挿) は、10 から 23 へと増加します。ただし、第 2 段フィルター (CIC 補償器) の次数は、12 から 7 へと減少します。第 1 段階の応答では帯域が狭いため、第 1 段フィルターの最初の折り返しにおける左側阻止帯域のエッジに対して、第 2 段階の阻止帯域を緩和することができます。第 2 フィルター段は、高いレートで動作するため、次数を低減できることは非常に有効です。

フィルター次数の制御

フィルター次数が設計上で最大の制約条件となる場合があります。MinimumOrderDesign プロパティを false に設定し、所定の次数で内挿フィルターを設計します。この構成も、必要な通過帯域周波数および阻止帯域周波数を指定できます。フィルターの次数は、カスケード応答の阻止帯域の減衰およびリップルを制御します。

第 1 フィルター段で最大 20 係数という制約を満たすには、FirstFilterOrder プロパティを 20 に設定します。SecondFilterOrder プロパティを 7 に、CIC セクション数を 4 に設定します。

% Keep a copy of the minimum order design so that we can use it later on
% this example.
DUCMinOrder = clone(DUC);

% Specify the filter orders and visualize the cascade response.
DUC.MinimumOrderDesign = false;
DUC.FirstFilterOrder = 20;
DUC.SecondFilterOrder = 7;
DUC.NumCICSections = 4;

close(fvt)
fvt = fvtool(DUC,'Arithmetic','double');

この新しい設計では、最初のフィルター次数が小さくなっているため、阻止帯域の減衰が低く、通過帯域リップルが大きくなります。

発振器の設計

Oscillator プロパティを使用して、オブジェクトが周波数のアップ コンバージョンを実行するときに使用する発振器のタイプを選択します。このプロパティを 'Sine wave' に設定し、三角関数のサンプルを使用して算出した正弦波から発振器信号を取得します。あるいは、このプロパティを 'NCO' に設定し、オブジェクトが数値制御発振器を設計するようにします。発振器の中心周波数は、IF 周波数 455 KHz に設定します。

DUC.Oscillator = 'Sine wave';
DUC.CenterFrequency = 455e3;

デジタル ダウン コンバーターの設計

デジタル ダウン コンバーター (DDC) は、DDC System object を作成して設計します。DDC System object には、所定のバスバンド周波数から 0 Hz へと入力信号をダウン コンバートする発振器が含まれます。オブジェクトは、3 つの間引きフィルターのカスケードを使用して、ダウン コンバートされた信号をダウン サンプリングします。以下のブロック線図は、DDC オブジェクトを示します。

DUC の場合と同じように、DDC オブジェクトでも、間引きフィルターを定義する複数のオプションがあります。たとえば、正弦波ジェネレーターまたは数値制御発振器のいずれかを使用して発振器を設計できます。あるいは、入力として発振器信号を使用できます。

間引きフィルターの設計

DDC オブジェクトは、3 つのフィルター段階を使用して間引きを実行します。このオブジェクトがフィルターを内部で設計する場合、最初の段階は CIC 間引きを、第 2 段階は CIC 補償器を、第 3 段階は ハーフバンドまたはローパス間引きフィルターを含みます。DUC の場合と同じように、DDC オブジェクトでは、通過帯域および阻止帯域周波数、通過帯域リップル、および阻止帯域の減衰を含め、3 つのフィルターのカスケード応答を定義する複数の特性を指定できます。

IF 周波数 455 KHz が中心となる FRS 信号を受信するように、最小次数の間引きフィルターを設計します。信号を 40 で間引きし、2 MHz から 50 KHz へとダウン サンプリングします。StopbandFrequencySource プロパティを 'Property' に、阻止帯域の減衰量を 60 dB に設定し、ACR 60 dB のカスケード応答を設計します。

DDCMinOrder = dsp.DigitalDownConverter(...
  'SampleRate',2e6,...
  'DecimationFactor',40,...
  'Bandwidth',12.5e3,...
  'PassbandRipple',0.05,...
  'StopbandAttenuation',60,...
  'StopbandFrequencySource', 'Property',...
  'StopbandFrequency',18.75e3,...
  'CenterFrequency',455e3);

間引きフィルターの応答を解析し、カスケード応答が 25 KHz で減衰 60 dB を達成することを検証します。ただし、DDC は、第 3 段階 (ローパス間引き) における最初のエイリアスの左側阻止帯域のエッジに対して、第 2 段階 (CIC 補償器) の応答を緩和します。

close(fvt)
fvt = visualizeFilterStages(DDCMinOrder,'Arithmetic','double');

DUC の場合と同様に、MinimumOrderDesign プロパティを false に設定することでフィルター次数を定義できます。

MATLAB 処理ループ

FCC Part 95 では、最大周波数偏差 2.5KHz と最大オーディオ周波数 3.125 KHz の FM 変調を既定しています。オーディオ信号を周波数変調し、FRS ベースバンド信号を取得します (信号はスケルチ音を含みません)。最小次数フィルターにより、前のセクションで設計した DUC および DDC オブジェクトを使用して、ベースバンド FRS 信号をアップ コンバートおよびダウン コンバートします。信号を復調し、オーディオ プレーヤーを使用して再生します。

% Initialize simulation parameters
close(fvt)
Fs = 50e3;
frameLength = 1000;
maxAudioFrequency = 3.125e3; % Maximum allowed audio frequency for FRS radios
deltaF = 2.5e3; % Maximum allowed frequency deviation for FRS radios
freqSensitivityGain = deltaF*2*pi/Fs;    % K=FD/A*(2*pi*Ts)

ModulationFilter = dsp.IIRFilter('Numerator',1,'Denominator',[1, -1]);
DemodulationDelay = dsp.Delay(1);

audioReader = dsp.AudioFileReader('speech_dft_8kHz.wav', ...
    'PlayCount', 3, 'SamplesPerFrame', frameLength);

SRCTx = dsp.SampleRateConverter('InputSampleRate', audioReader.SampleRate, ...
    'OutputSampleRate', Fs, 'Bandwidth', 6.25e3);

SRCRx = dsp.SampleRateConverter('InputSampleRate', Fs, ...
    'OutputSampleRate', audioReader.SampleRate, 'Bandwidth', 6.25e3);

audioWriter = audioDeviceWriter('SampleRate', 8e3);

DUCMinOrder.CenterFrequency = 455e3;

basebandSignalSpectrum = dsp.SpectrumAnalyzer(...
        'SampleRate', Fs, 'ShowLegend', true, ...
        'ChannelNames', {'Baseband input', 'Down-converted output'}, ...
        'SpectralAverages', 10, 'Title', 'Power spectrum of baseband signal');

upConvertedSignalSpectrum = dsp.SpectrumAnalyzer(...
        'SampleRate', Fs*DUCMinOrder.InterpolationFactor, ...
        'SpectralAverages', 10, 'Title', 'Power spectrum of signal after DUC');

ストリーム データ

while ~isDone(audioReader)
  % Input speech signal
  audioIn = audioReader();

  % Resample
  audioIn_200kHz = SRCTx(audioIn);

  % FM Modulation
  xFMBaseband = exp(1j * freqSensitivityGain * ModulationFilter(audioIn_200kHz));

  % Up conversion
  xUp = DUCMinOrder(xFMBaseband);
  upConvertedSignalSpectrum(xUp);

  % Down conversion
  xDown = DDCMinOrder(xUp);
  basebandSignalSpectrum([xFMBaseband, xDown]);

  % FM Demodulation
  audioOut_200kHz = angle(DemodulationDelay(xDown) .* conj(xDown));

  % Resample
  audioOut = SRCRx(audioOut_200kHz);

  % Play audio
  audioWriter(audioOut);
end

% Cleanup
release(audioReader);
release(SRCTx);
release(ModulationFilter);
release(DUCMinOrder);
release(DDCMinOrder);
release(DemodulationDelay);
release(SRCRx);
release(basebandSignalSpectrum);
release(upConvertedSignalSpectrum);

Simulink バージョン

上述の Family Radio Service 用の設定を、Digital Down-Converter ブロックおよび Digital Up-Converter ブロックを使用して Simulink でモデル化できます。これは、モデル familyRadioServiceExample.slx に実装されます。シミュレーションの実行中、モデル内のスイッチを使用して入力音声信号または処理後の信号のいずれかを聞くことができます。

open_system('familyRadioServiceExample');
open_system('familyRadioServiceExample/Dataflow Subsystem');

Simulink でのデータフローの使用

この例では、Dataflow Subsystem の [領域] パラメーターをデータフローに設定することで、データ駆動型の実行を使用するように構成できます。データフローを使用して、領域内のブロックは、Simulink のサンプル時間ではなく使用可能なデータに基づいて実行します。Simulink はシステムをコンカレント スレッドに自動的に分割します。この自動分割はシミュレーションを高速化し、データ スループットを増やします。データフローと、複数のスレッドを使用してこの例を実行する方法の詳細については、Dataflow Introduction を参照してください。

まとめ

この例では、DUC/DDC System object を使用して、FRS 送信機および受信機のデジタル アップ コンバーターとダウン コンバーターを設計しました。また、DUC/DDC オブジェクトによって提供される内挿フィルターおよび間引きフィルターの設計に関する各種オプションについても説明しました。さらに、visualizeFilterStages メソッド、fvtool メソッド、getFilterOrders メソッドなど、DDC/DUC オブジェクトで使用可能なフィルター解析ツールについても検討しました。この構成のための Simulink 実装もモデル化しました。

この例で設計した DUC/DDC オブジェクトは、倍精度フィルター係数および倍精度演算で動作します。固定小数点入力で動作する DUC または DDC については、デジタル ダウン コンバーターの設計および解析の例をご覧ください。

close_system('familyRadioServiceExample', 0);