このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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.DigitalDownConverter
System object を使用した MATLAB® の実装を示します。Simulink® の実装についてはDigital Up and Down Conversion for Family Radio Service in Simulinkで説明しており、Digital Up-ConverterとDigital 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 オブジェクトがフィルターを内的に設計する場合、最初の段階はハーフバンドまたはローパス フィルターを、第 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');
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 = 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 送信機および受信機のデジタル アップ コンバーターとダウン コンバーターを設計しました。また、これらのオブジェクトによって提供される内挿フィルターおよび間引きフィルターの設計に関する各種オプションについても説明しました。さらに、関数 visualizeFilterStages
、fvtool
、getFilterOrders
など、dsp.DigitalUpConverter
および dsp.DigitalDownConverter
オブジェクトで使用可能なフィルター解析ツールについても検討しました。
この例で設計したデジタル アップ コンバーター オブジェクトおよびデジタル ダウン コンバーター オブジェクトは、倍精度フィルター係数および倍精度演算で動作します。固定小数点入力で動作するデジタル アップ コンバーターおよびデジタル ダウン コンバーターについては、デジタル ダウン コンバーターの設計および分析の例をご覧ください。
参考
関数
オブジェクト
dsp.AudioFileReader
|dsp.DigitalDownConverter
|dsp.DigitalUpConverter
|dsp.IIRFilter
|dsp.Delay
|dsp.SampleRateConverter
|spectrumAnalyzer
|audioDeviceWriter