В этом примере показано, как симулировать установившееся поведение фиксированной точки, цифровой вниз конвертер для GSM (Глобальная Система для Мобильного) основополосные преобразования. Пример использует Системные объекты обработки сигналов, чтобы эмулировать операцию Четверки TI Graychip 4016, Цифровой Вниз Конвертер, и требует лицензии Fixed-Point Designer™.
Цифровой вниз конвертер (DDC) является важным компонентом цифрового радио. Это выполняет перевод частоты, чтобы преобразовать высокую входную частоту дискретизации вниз в более низкую частоту дискретизации для эффективной обработки. В этом примере DDC принимает полосовой сигнал с частотой дискретизации приблизительно 70 мегавыборок в секунды (MSPS) и выполняет следующие операции:
Цифровое смешивание или вниз преобразование входного сигнала с помощью Генератора с программным управлением (NCO) и микшера.
Узкополосно передайте фильтрацию lowpass и децимацию с помощью цепи фильтра КИХ-фильтров и Каскадной расчески интегратора (CIC).
Получите корректировку и итоговую передискретизацию потока данных.
DDC производит сгенерированный модулированный сигнал с частотой дискретизации 270 kilosamples в секунды (KSPS), который готов к демодуляции. Блок-схему типичного DDC показывают ниже.
if ~isfixptinstalled error(message('dsp:dspDigitalDownConverter:noFixptTbx')); end
Создайте и сконфигурируйте исходный Системный объект синусоиды, чтобы смоделировать источник GSM. Вы устанавливаете частоту объекта на 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, чтобы смешать и вниз преобразовать сигнал GSM. TI Graychip требует, чтобы настраивающаяся частота (свойство PhaseIncrement) была 32-битным типом данных с 32-битной дробной длиной. Фаза возместила потребности быть 16-битным типом данных с 16-битной дробной длиной. Чтобы уменьшать амплитудный шум квантования и распространить побочные частоты через доступную полосу пропускания, добавьте сигнал dither в значения фазы аккумулятора. Как правило, количество битов dither (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));
Создайте и сконфигурируйте CIC decimator Системный объект, который десятикратно уменьшает микшер выход на коэффициент 64. CIC-фильтры могут достигнуть высоких уровней децимации или интерполяции, не используя множителей. Эта функция делает их очень полезными для цифровых систем, действующих на высоких показателях.
M1 = 64; cicdec = dsp.CICDecimator( ... 'DecimationFactor', M1, ... 'NumSections', 5, ... 'FixedPointDataType', 'Minimum section word lengths', ... 'OutputWordLength', 20);
Создайте и сконфигурируйте КИХ decimator Системный объект, чтобы компенсировать свисание полосы пропускания, вызванное CIC-фильтром. Этот фильтр также десятикратно уменьшает на коэффициент 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));
Создайте и сконфигурируйте КИХ decimator Системный объект, чтобы уменьшать частоту дискретизации другим фактором 2.
M3 = 2; pfir = dsp.FIRDecimator(M3, pfir, ... 'CoefficientsDataType', 'Custom', ... 'CustomCoefficientsDataType', numerictype([],16), ... 'FullPrecisionOverride',false, ... 'OutputDataType', 'Custom', ... 'CustomOutputDataType', numerictype([],20,-12));
Создайте и сконфигурируйте КИХ-Системный объект конвертера уровня, чтобы передискретизировать окончательный результат на коэффициент 4/3.
firrc = dsp.FIRRateConverter(4, 3, fir1(31,0.25),... 'CoefficientsDataType', 'Custom', ... 'CustomCoefficientsDataType', numerictype([],12), ... 'FullPrecisionOverride',false, ... 'OutputDataType', 'Custom', ... 'CustomOutputDataType', numerictype([],24,-12));
Создайте fi объект заданного numerictype действовать как преобразование типа данных для синуса выход.
gsmsig = fi(zeros(768,1),true,14,13);
Создайте fi объект заданного numerictype сохранить микшер фиксированной точки выход.
mixsig = fi(zeros(768,1),true,20,18);
Создайте и сконфигурируйте два Системных объекта Time Scope, чтобы построить действительные и мнимые части КИХ-фильтра конвертера уровня выход.
timeScope1 = timescope(... 'Name', 'Rate Converter Output: Real Signal', ... 'SampleRate', Fs/256*4/3, ... 'TimeSpanSource','property', ... 'TimeSpan', 1.2e-3, ... 'YLimits', [-2e8 2e8]); 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, ... 'TimeSpanSource','property', ... 'TimeSpan', 1.2e-3, ... 'YLimits', [-2e8 2e8]);
Создайте и сконфигурируйте два Спектра Системные объекты Анализатора, чтобы построить спектр мощности NCO выход и компенсированного CIC decimator выход.
specScope1 = dsp.SpectrumAnalyzer(... 'Name','DSPDDC: NCO Output',... 'SampleRate',Fs,... 'FrequencySpan','Start and stop frequencies',... 'StartFrequency',0,'StopFrequency',Fs/2,... 'RBWSource', 'Property', 'RBW', 4.2e3,... 'SpectralAverages', 1,... '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 = dsp.SpectrumAnalyzer(... 'Name','DSPDDC: Compensated CIC Decimator Output',... 'SampleRate',FsCICcomp,... 'FrequencySpan','Start and stop frequencies',... 'StartFrequency',0, 'StopFrequency',FsCICcomp/2,... 'RBWSource', 'Property', 'RBW', 4.2e3,... 'SpectralAverages', 1,... '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, и программируемый КИХ-фильтр десятикратно уменьшает другим фактором 2, чтобы достигнуть полной децимации 256. Бэкэнд передискретизации выполняет дополнительную специализированную фильтрацию. Выполнение цикла обработки для 100 итераций эквивалентно обработке приблизительно 1,1 мс передискретизируемого выхода.
% Create a container for the four scopes scopesContainer = HelperCreateScopesContainer(... {timeScope1,specScope1,timeScope2,specScope2},... 'Name','Digital Down Converter',... 'Layout',[2 2],... 'ExpandToolstrip',false); 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™, чтобы симулировать установившееся поведение фиксированной точки GSM, цифровой вниз конвертер. Time Scope и Спектр Системные объекты Анализатора позволяют вам анализировать различные этапы DDC.