Цифровое преобразование вверх и вниз для семейного радиосервиса

Этот пример показов, как использовать цифровой преобразователь частоты (DUC) и цифровой преобразователь частоты ( DDC) Системных объектов для разработки передатчика и приемника Семейства Radio Service (FRS). Эти объекты обеспечивают инструменты для разработки фильтров интерполяции/децимации и упрощают шаги, необходимые для реализации процесса преобразования вверх/вниз. Этот пример иллюстрирует реализации MATLAB ® и Simulink ®. Версия MATLAB использует системные объекты для DUC и DDC, в то время как версия Simulink использует блоки для DUC и DDC. В обоих вариантах речевой сигнал используется как вход, и сигнал после передачи воспроизводится.

FRS - это усовершенствованная радиосистема раций FM, разрешенная в Соединенных Штатах с 1996 года. Эта персональная радиосервис использует канальные частоты в полосу сверхвысокой частоты (УВЧ). Устройства, работающие в полосе FRS, должны быть авторизованы в соответствии с подпунктом B части 95 «Family Radio Service» (разделы 95.191-95.194) правил FCC. Разрешенная полоса пропускания каналов FRS составляет 12,5 кГц, а центральное разделение частот между каналами - 25 кГц.

Введение

В этом примере рассматривается цифровое преобразование вверх сигнала, который должен быть передан через канал FRS, и преобразование вниз сигнала, поступающего от радиопередатчика FRS.

Речь 8 кГц сначала повторно дискретизируется в 50KHz. DUC на передатчике вверх преобразует сигнал с 50 кГц на 2 МГц и смещает сигнал на частоту IF 455 кГц.

Приемник имеет аналоговый передний конец, который выводит принятый сигнал на частоту IF 455 кГц. Затем сигнал дискретизируется со скоростью 2 МГц. DDC в приемник возвращает сигнал к основной полосе с частотой дискретизации 50 кГц. Это возвращается в область значений 8 кГц.

Проект цифрового преобразователя UP

Вы проектируете цифровой преобразователь частоты путем создания объекта DUC System. Объект DUC состоит из каскада из трех интерполяционных фильтров и генератора, который преобразует интерполированный сигнал в заданную частоту полосы пропускания. Далее показан блок объекта DUC.

Объект DUC предоставляет опции для определения фильтров интерполяции. Например, вы можете спроектировать осциллятор, используя либо генератор синусоиды, либо генератор с численным управлением. В следующем разделе представлены различные опции, доступные для разработки интерполяционных фильтров для передатчика FRS.

Разработка фильтров интерполяции

Объект DUC реализует интерполяционный фильтр с использованием трех этапов фильтра. Когда объект DUC проектирует фильтры внутри, первый этап состоит из полуполосы или lowpass фильтра, второй этап состоит из компенсатора CIC, а третий этап состоит из фильтра интерполяции CIC. Объект DUC позволяет вам задать несколько характеристик, которые задают ответ каскада для трех фильтров, включая частоты полосы пропускания и полосы остановки, неравномерность в полосе пропускания и затухание в полосе задерживания.

Проекты фильтров минимального порядка

По умолчанию (когда MinimumOrderDesign свойство установлено на true) объект DUC получает создания фильтра интерполяции минимального порядка с помощью спецификаций полосы пропускания и полосы остановки, которые вы предоставляете.

Для этого примера FRS необходимо увеличить частоту дискретизации передаваемого сигнала с 50 кГц до 2 МГц. Это приводит к коэффициенту интерполяции 40. Объект DUC автоматически преобразует значение интерполяции так, что первый каскад фильтра интерполируется на 2, второй каскад фильтра интерполируется на 2, а CIC-фильтр интерполируется на 10.

Двусторонняя полоса пропускания канала FRS составляет 12,5 кГц. Установите Bandwidth свойство объекта DUC на 12,5 кГц так, что ширина полосы пропускания каскадной характеристики интерполяционных фильтров составляет 12,5e3/2 = 6,25 кГц.

Установите неравномерность в полосе пропускания на небольшое значение 0,05 дБ, чтобы избежать искажения сигнала FRS. Установите затухание в полосе задерживания на 60 дБ.

По умолчанию (когда StopbandFrequencySource свойство установлено на ' auto ') объект DUC устанавливает частоту отключения каскадной характеристики приблизительно с входной частотой Nyquist 25 кГц. Объект также устанавливает частоту полосы остановки 2Fc-Fpass = 2 * 25e3 - 12 5e3/2 = 43,75 кГц, где Fc является частотой отсечения, а Fpass является частотой полосы пропускания. В этом сценарии объект DUC максимально расслабляет частоту диапазона остановок, получая самые низкие порядки фильтра за счет разрешения некоторой энергии интерполяционных реплик в переходной полосе каскадной характеристики. Этот компромисс проекта удобен, когда ваш приоритет - минимизировать порядки фильтра.

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

Визуализируйте каскадную характеристику децимирующих фильтров с помощью fvtool или visualizeFilterStages методы объекта DUC. Задайте арифметику следующим '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 кГц. Большинство коммерческих радиоприемников FRS обеспечивают 50 дБ или выше отклонение соседних каналов (ACR). Очевидно, что каскадная реакция децимирующих фильтров, разработанных выше, не достигает 50 дБ ослабления при 25 кГц. Одним из возможных решений этой задачи является фильтрация сигнала FRS основной полосы частот с помощью lowpass с необходимой шириной перехода и затуханием в полосе задерживания перед передачей сигнала через объект DUC. Другое решение состоит в том, чтобы задать объект DUC так, чтобы он проектировал каскадный ответ с более узкой шириной полосы перехода, которая соответствует необходимой спектральной маске. Чтобы спроектировать общую реакцию фильтра с более узкой полосой пропускания перехода, установите StopbandFrequencySource свойство к 'Property' и StopbandFrequency свойство к желаемому значению.

Спроектируйте фильтры так, чтобы каскадная характеристика имела частоту полосы остановок на краю полосы пропускания соседнего канала FRS, то есть на 25e3-12.5e3/2 = 18.75 кГц. Установите StopbandAttenuation свойство до 60 дБ для достижения ACR на 60 дБ.

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

Новый каскадный ответ достигает ослабления 60 дБ на 25 кГц, то есть в центре соседнего канала FRS. Порядок фильтра первой ступени (lowpass interpolator) увеличивается с 10 до 23. Однако обратите внимание, что порядок фильтра второй ступени (компенсатор CIC) уменьшается с 12 до 7. Поскольку ответ первого каскада имеет более узкую полосу пропускания, диапазон остановки второго каскада может быть еще более ослаблен до ребра левой полосы пропускания первой реплики фильтра первого каскада. Поскольку вторая ступень фильтра работает с более высокой скоростью, это очень удобное сокращение порядка.

Управление порядками фильтра

Существуют случаи, когда порядки фильтра являются основным ограничением проекта. Установите MinimumOrderDesign свойство false для разработки фильтров интерполяции с заданным порядком. В этом строении вы по-прежнему можете задать необходимые частоты полосы пропускания и полосы остановки. Порядки фильтров управляют затуханием в полосе задерживания и пульсацией каскадной характеристики.

Чтобы удовлетворить ограничению максимум 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' таким образом, объект проектирует численно управляемый генератор. Установите центральную частоту генератора на частоту ПЧ 455 кГц.

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

Digital Down Converter Проект

Вы проектируете цифровой преобразователь DDC путем создания объекта DDC System. Объект DDC System состоит из генератора, который преобразует входной сигнал с определенной частоты полосы пропускания вниз на 0 Гц. Объект понижает дискретизацию преобразованного с понижением частоты сигнала с помощью каскада из трех децимирующих фильтров. Следующий блок показывает объект DDC.

Как и в случае DUC, объект DDC предлагает различные опции для определения децимирующих фильтров. Например, вы можете спроектировать осциллятор, используя либо генератор синусоиды, либо генератор с численным управлением. В качестве альтернативы можно предоставить сигнал генератора в качестве входа.

Разработка децимирующих фильтров

Объект DDC реализует десятикратное уменьшение с помощью трех каскадов фильтра. Когда объект проектирует фильтры внутри, первый каскад состоит из CIC дециматора, второй каскад состоит из CIC компенсатора, а третий каскад состоит из полуполосы, или lowpass, децимирующего фильтра. Как и в случае DUC, объект DDC позволяет вам задать характеристики, которые определяют ответ каскада трех фильтров, включая полосы пропускания и частоты полосы остановки, неравномерность в полосе пропускания и затухание в полосе задерживания.

Проектируйте децимирующие фильтры минимального порядка для приема сигнала FRS с центром на частоте IF 455 кГц. Децимируйте сигнал на 40, чтобы уменьшить его с 2 МГц до 50 кГц. Установите StopbandFrequencySource свойство к 'Property' и затухание в полосе задерживания до 60 дБ для разработки каскадного отклика, который достигает ACR 60 дБ.

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

Анализируйте ответы дециматорных фильтров и проверяйте, что каскадная реакция достигает ослабления 60 дБ на 25 кГц. Обратите внимание, что DDC расслабляет ответ второго каскада (компенсатор CIC) на ребро левой полосы значений первого псевдонима третьего каскада (дециматор lowpass), чтобы минимизировать порядок.

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

Как и в случае DUC, вы можете задать порядки фильтра, установив MinimumOrderDesign свойство false.

Цикл обработки MATLAB

FCC Part 95 задает FM-модуляцию с максимальным отклонением частоты 2,5 кГц и максимальной звуковой частотой 3,125 кГц. Частота-модулируйте аудиосигнал, чтобы получить сгенерированный модулированный сигнал FRS (сигнал не включает тональный сигнал бодрствования). Преобразование и преобразование вниз сигнала FRS основной полосы частот с помощью объектов DUC и DDC, которые были разработаны в предыдущих разделах, с помощью фильтров минимального порядка. Демодулируйте сигнал и воспроизводите его с помощью аудиоплеера.

% 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, показанная выше, может быть смоделирована в Simulink с помощью блоков Digital Down-Converter и Digital Up-Converter. Это реализовано в модели familyRadioServiceExample.slx. Пока симуляция выполняется, можно прослушать либо входной речевой сигнал, либо сигнал после обработки с помощью переключателя в модели.

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

Использование Dataflow в Simulink

Можно сконфигурировать этот пример, чтобы использовать управляемое данными выполнение путем установки параметра Domain на dataflow для Подсистемы Dataflow. С dataflow блоки внутри области выполняются на основе доступности данных в отличие от шага расчета Simulink. Simulink автоматически разделяет систему на параллельные потоки. Эта автоподстройка ускоряет симуляцию и увеличивает пропускную способность данных. Чтобы узнать больше о dataflow и о том, как запустить этот пример с использованием нескольких потоков, смотрите Многоядерное Выполнение с использованием Область.

Заключения

В этом примере вы разработали цифровой преобразователь вверх и вниз для передатчика и приемника FRS с использованием объектов DUC/DDC System. В примере были исследованы различные опции, предлагаемые объектами DUC/DDC для разработки интерполяции и децимирующих фильтров. В примере также исследованы инструменты анализа фильтров, доступные в объектах DDC/DUC, таких как visualizeFilterStages, fvtool, и getFilterOrders методы. Была также смоделирована реализация Simulink для строения.

Объекты DUC/DDC, разработанные в этом примере, работают с коэффициентами фильтра двойной точности и арифметикой двойной точности. Смотрите пример проекта и анализа цифрового преобразователя частоты, если вы заинтересованы в разработке DUC или DDC, который работает с входами с фиксированной точкой.

close_system('familyRadioServiceExample', 0);