Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

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

はじめに

この例では、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 オブジェクトがフィルターを内的に設計する場合、1 段目はハーフバンドまたはローパス フィルターを、2 段目は CIC 補償器を、3 段目は CIC 内挿フィルターを含みます。DUC オブジェクトでは、通過帯域周波数および阻止帯域周波数、通過帯域リップル、および阻止帯域の減衰を含め、3 つのフィルターのカスケード応答を定義する複数の特性を指定できます。

最小次数フィルター設計

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

この例では、送信された信号を 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 に設定します。このシナリオでは、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');

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 2 objects of type line.

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

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 5 objects of type line. These objects represent Halfband interpolator, Interpolation factor = 2, CIC compensator, Interpolation factor = 2, CIC interpolator, Interpolation factor = 10, Cascade response.

関数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');

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 2 objects of type line.

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

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');

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 2 objects of type line.

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

発振器の設計

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 つのフィルター段階を使用して間引きを実行します。このオブジェクトがフィルターを内部で設計する場合、1 段目は 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');

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 5 objects of type line. These objects represent CIC decimator, Decimation factor = 10, CIC compensator, Decimation factor = 2, Lowpass decimator, Decimation factor = 2, Cascade response.

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 = spectrumAnalyzer(...
        Method = 'welch', ...
        AveragingMethod = 'exponential', ...
        ForgettingFactor = 0.1, ...
        SampleRate = Fs, ...
        ShowLegend = true, ...
        ChannelNames = {'Baseband input', 'Down-converted output'}, ...
        Title = 'Power spectrum of baseband signal');
    
upConvertedSignalSpectrum = spectrumAnalyzer(...
        Method = 'welch', ...
        AveragingMethod = 'exponential', ...
        ForgettingFactor = 0.1, ...
        SampleRate = Fs*DUCMinOrder.InterpolationFactor, ...
        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);

release(audioWriter);

まとめ

この例では、dsp.DigitalUpConverter および dsp.DigitalDownConverter System object を使用して、FRS 送信機および受信機のデジタル アップ コンバーターとダウン コンバーターを設計しました。また、これらのオブジェクトによって提供される内挿フィルターおよび間引きフィルターの設計に関する各種オプションについても説明しました。さらに、関数 visualizeFilterStagesfvtoolgetFilterOrders など、dsp.DigitalUpConverter および dsp.DigitalDownConverter オブジェクトで使用可能なフィルター解析ツールについても検討しました。

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

参考

関数

オブジェクト

関連するトピック