このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
MATLAB での GSM デジタル ダウン コンバーター
この例では、GSM (Global System for Mobile) ベースバンド変換における固定小数点デジタル ダウンコンバーターの定常状態の動作をシミュレーションする方法を説明します。この例では信号処理の System object を使用して、TI Graychip 4016 Quad デジタル ダウン コンバーターの操作をエミュレートします。これには Fixed-Point Designer™ のライセンスが必要です。
はじめに
デジタル周波数変換器 (DDC) は、デジタル無線の重要な構成要素です。DDC は周波数変換を行って高い入力サンプルレートを低いサンプルレートにダウン変換し、処理の効率化を促します。この例では、DDC はサンプルレートが約 70 MSPS (毎秒メガサンプル) のバンドパス信号を受け入れ、次の操作を実行します。
数値制御発振器 (NCO) と混合器を使用した入力信号のデジタル ミキシングまたはデジタル ダウン変換。
カスケード接続積分器櫛形 (CIC) フィルターと FIR フィルターを使用した狭帯域ローパス フィルター処理および間引き。
データ ストリームのゲイン調整と最終リサンプリング。
DDC は、復調に備えてサンプルレートが 270 KSPS (毎秒キロサンプル) のベースバンド信号を生成します。標準の DDC のブロック線図を以下に示します。
if ~isfixptinstalled error(message('dsp:dspDigitalDownConverter:noFixptTbx')); end
初期化
GSM ソースをモデル化する正弦波ソースの System object™ を作成し、設定します。オブジェクトの周波数を 69.1e6*5/24 MSPS に設定します。これはデジタル混合信号処理の後、オブジェクトのベースバンド周波数が約 48 KSPS になるからです。モデル化するシステムはファクター 4/(3*256) で入力をリサンプリングするため、オブジェクトのフレーム サイズをこれらのファクターの最小公倍数に設定する必要があります。
Fs = 69.333e6; FrameSize = 768; sine = dsp.SineWave( ... 'Frequency', 69.1e6*5/24, ... 'SampleRate', Fs, ... 'Method', 'Trigonometric function', ... 'SamplesPerFrame', FrameSize);
NCO System object を作成して設定し、GSM 信号の混合およびダウン変換を行います。TI Graychip では、調整周波数 (PhaseIncrement プロパティ) のデータ型が 32 ビットで小数部の長さが 32 ビットである必要があります。位相オフセットのデータ型は 16 ビットで小数部の長さが 16 ビットである必要があります。振幅量子化ノイズを減らして使用可能な帯域幅全体にスプリアス周波数を広げるには、加算器の位相値にディザー信号を追加します。通常、ディザー ビット数 (14) は加算器の語長 (32) とテーブル アドレスの語長 (18) の差になります。
nco = dsp.NCO( ... 'PhaseIncrementSource', 'Property', ... 'PhaseIncrement', int32((5/24) *2^32), ... 'PhaseOffset', int16(0), ... 'NumDitherBits', 14, ... 'NumQuantizerAccumulatorBits', 18, ... 'Waveform', 'Complex exponential', ... 'SamplesPerFrame', FrameSize, ... 'AccumulatorDataType', 'Custom', ... 'CustomAccumulatorDataType', numerictype([],32), ... 'OutputDataType', 'Custom', ... 'CustomOutputDataType', numerictype([],20,18));
ファクター 64 で混合器出力を間引く CIC 間引きの System object を作成し、設定します。CIC フィルターを使用すると、乗数を使用せずに高い間引きレートまたは内挿レートを達成できます。この機能は、高いレートで動作しているデジタル システムに大変便利です。
M1 = 64; cicdec = dsp.CICDecimator( ... 'DecimationFactor', M1, ... 'NumSections', 5, ... 'FixedPointDataType', 'Minimum section word lengths', ... 'OutputWordLength', 20);
CIC フィルターによって生じた通過帯域の低下を補正する、FIR 間引きの System object を作成し、設定します。このフィルターはファクター 2 でも間引きを行います。
gsmcoeffs; % Read the CFIR and PFIR coeffs M2 = 2; cfir = dsp.FIRDecimator(M2, cfir, ... 'CoefficientsDataType', 'Custom', ... 'CustomCoefficientsDataType', numerictype([],16), ... 'FullPrecisionOverride', false,... 'OutputDataType', 'Custom', ... 'CustomOutputDataType', numerictype([],20,-12));
サンプルレートを別のファクター 2 で減らす、FIR 間引き System object を作成し、設定します。
M3 = 2; pfir = dsp.FIRDecimator(M3, pfir, ... 'CoefficientsDataType', 'Custom', ... 'CustomCoefficientsDataType', numerictype([],16), ... 'FullPrecisionOverride',false, ... 'OutputDataType', 'Custom', ... 'CustomOutputDataType', numerictype([],20,-12));
最終出力をファクター 4/3 でリサンプリングする FIR レート変換の System object を作成し、設定します。
firrc = dsp.FIRRateConverter(4, 3, fir1(31,0.25),... 'CoefficientsDataType', 'Custom', ... 'CustomCoefficientsDataType', numerictype([],12), ... 'FullPrecisionOverride',false, ... 'OutputDataType', 'Custom', ... 'CustomOutputDataType', numerictype([],24,-12));
正弦出力のデータ型変換を行う、指定の numerictype の Fi オブジェクトを作成します。
gsmsig = fi(zeros(768,1),true,14,13);
指定の numerictype の Fi オブジェクトを作成して、固定小数点混合器出力を保存します。
mixsig = fi(zeros(768,1),true,20,18);
2 つの Time Scope System object を作成し、FIR レート変換フィルター出力の実数部と虚数部をプロットするように設定します。
timeScope1 = timescope(... 'Name', 'Rate Converter Output: Real Signal', ... 'SampleRate', Fs/256*4/3, ... 'TimeSpan', 1.2e-3, ... 'YLimits', [-2e8 2e8], ... 'TimeSpanOverrunAction', 'Scroll'); pos = timeScope1.Position; timeScope1.Position(1:2) = [pos(1)-0.8*pos(3) pos(2)+0.7*pos(4)]; timeScope2 = timescope(... 'Name', 'Rate Converter Output: Imaginary Signal', ... 'Position', [pos(1)-0.8*pos(3) pos(2)-0.7*pos(4) pos(3:4)], ... 'SampleRate', Fs/256*4/3, ... 'TimeSpan', 1.2e-3, ... 'YLimits', [-2e8 2e8], ... 'TimeSpanOverrunAction', 'Scroll');
2 つの Spectrum Analyzer System object を作成および構成して、NCO 出力および補正された CIC 間引きの出力のパワー スペクトルをプロットします。
specScope1 = spectrumAnalyzer(... 'Method','welch', ... 'Name','DSPDDC: NCO Output',... 'SampleRate',Fs,... 'FrequencySpan','start-and-stop-frequencies',... 'StartFrequency',0,'StopFrequency',Fs/2,... 'RBWSource', 'property', 'RBW', 4.2e3,... 'Title', 'Power spectrum of NCO output',... 'Position',[pos(1)+.8*pos(3) pos(2)+0.7*pos(4) pos(3:4)]); FsCICcomp = Fs/(M1*M2); specScope2 = spectrumAnalyzer(... 'Method','welch', ... 'Name','DSPDDC: Compensated CIC Decimator Output',... 'SampleRate',FsCICcomp,... 'FrequencySpan','start-and-stop-frequencies',... 'StartFrequency',0, 'StopFrequency',FsCICcomp/2,... 'RBWSource', 'property', 'RBW', 4.2e3,... 'Title', 'Power spectrum of compensated CIC decimator output',... 'Position',[pos(1)+.8*pos(3) pos(2)-0.7*pos(4) pos(3:4)]);
処理ループ
処理ループでは、混合器のフロントエンドで GSM 信号をベースバンドにデジタル ダウン変換します。CIC 間引きフィルターと補正フィルターは、ファクター 128 で信号をダウンサンプルし、プログラミング可能な FIR フィルターは別のファクター 2 で間引きして、全体で 256 の間引きを達成します。リサンプリングのバックエンドは、さらにアプリケーション固有のフィルター処理を行います。処理ループを 100 回反復して実行するのは、リサンプリングした出力である約 1.1 ms の処理と等価です。
for ii = 1:100 gsmsig(:) = sine(); % GSM signal ncosig = nco(); % NCO signal mixsig(:) = gsmsig.*ncosig; % Digital mixer % CIC filtering and compensation ycic = cfir(cicdec(mixsig)); % Programmable FIR and sample-rate conversion yrcout = firrc(pfir(ycic)); % Frequency and time-domain plots timeScope1(real(yrcout)); timeScope2(imag(yrcout)); specScope1(ncosig); specScope2(ycic); end release(timeScope1);
release(timeScope2);
release(specScope1);
release(specScope2);
まとめ
この例では、DSP System Toolbox™ System object を使用して、固定小数点 GSM デジタル周波数変換器の定常状態の動作をシミュレーションしました。Time Scope System object と Spectrum Analyzer System object を使用すると、さまざまな段階で DDC を解析できます。