В этом примере показано, как использовать DSP System Toolbox™ и Fixed-Point Designer™ для проектирования трехступенчатого многоскоростного фильтра с фиксированной точкой, который реализует цепочку фильтров цифрового понижающего преобразователя (DDC), разработанного в соответствии со спецификацией Global System for Mobile (GSM).
Используя программу Filter Design HDL Coder™ мы создадим синтезируемый код HDL для того же трехступенчатого многоскоростного фильтра с фиксированной точкой. Наконец, используя Simulink ® и HDL Verifier™ MS, мы будем совместно моделировать фильтры с фиксированной точкой, чтобы убедиться, что созданный код HDL дает те же результаты, что и эквивалентная поведенческая модель Simulink.
Цифровые понижающие преобразователи (DDC) являются ключевым компонентом цифровых радиостанций. DDC выполняет преобразование частоты, необходимое для преобразования высоких входных скоростей дискретизации, обнаруженных в цифровом радио, до более низких скоростей дискретизации для дальнейшей и более простой обработки. В этом примере DDC работает на частоте приблизительно 70 МГц и должен снизить скорость до 270 кГц.
Чтобы далее ограничить нашу проблему, мы смоделируем один из DDCs в Мультистандартном Квадрофоническом Чипе DDC Грейчипа GC4016. В GC4016, помимо прочих особенностей, предусмотрены следующие фильтры: пятиступенчатый фильтр CIC с программируемым коэффициентом прореживания (8-4096); 21-отводной КИХ фильтр, который прореживается на 2 и имеет программируемые 16-битовые коэффициенты; и 63-отводной КИХ фильтр, который также прореживается на 2 и имеет программируемые 16-битовые коэффициенты.
DDC состоит из цифрового управляемого осциллятора (NCO) и смесителя для квадратурного преобразования входного сигнала в основную полосу частот. Затем сигнал основной полосы частот фильтруется фильтром Cascaded Integrator-Comb (CIC), за которым следуют два децимирующих КИХ фильтра для достижения низкой частоты дискретизации около 270 кГц, готовых для дальнейшей обработки. Конечная стадия часто включает в себя блок повторной дискретизации, который интерполирует или прореживает сигнал для достижения желаемой частоты дискретизации в зависимости от применения. Дополнительная фильтрация также может быть достигнута с помощью блока повторной дискретизации. Блок-схема типичного DDC показана ниже.

В этом примере основное внимание уделяется трехступенчатому многоскоростному прореживающему фильтру, состоящему из CIC и двух прореживающих фильтров FIR.
Представляющая интерес полоса пропускания GSM составляет 160 кГц. Следовательно, трехступенчатый многоскоростной фильтр DDC должен быть плоским на этой полосе частот в пределах пульсации полосы пропускания, которая должна быть меньше 0,1 дБ пикового значения. Рассматривая GSM вне маски отклонения полосы, показанной ниже, мы видим, что фильтр должен также достигать 18 дБ ослабления при 100 кГц.

Кроме того, GSM требует скорости передачи символов 270,833 кбит/с. Поскольку входная частота дискретизации Graychip равна тактовой частоте 69,333 МГц, мы должны уменьшить входную частоту до 270,833 КГц. Это требует, чтобы трехступенчатый многоскоростной фильтр прореживался на 256.
Фильтры CIC являются многоскоростными фильтрами, которые очень полезны, поскольку они могут достигать высоких скоростей прореживания (или интерполяции) и реализованы без умножителей. CIC являются просто бокскарными фильтрами, реализованными рекурсивно каскадно с помощью повышающей или понижающей дискретизации. Эти характеристики делают CIC очень полезными для цифровых систем, работающих с высокой скоростью, особенно когда эти системы должны быть реализованы в ASIC или FPGA.
Хотя CIC имеют желательные характеристики, они также имеют некоторые недостатки, особенно тот факт, что они вызывают затухание в области полосы пропускания из-за их синк-подобной реакции. По этой причине за CIC часто должен следовать компенсирующий фильтр. Компенсирующий фильтр должен иметь инверсно-синс-отклик в области полосы пропускания, чтобы поднять провал, вызванный CIC.
Проектирование и каскад трех фильтров можно выполнить с помощью графического пользовательского интерфейса Filter Designer,

но мы будем использовать функциональность командной строки.
CIC определяется следующим образом:
R = 64; % Decimation factor D = 1; % Differential delay Nsecs = 5; % Number of sections OWL = 20; % Output word length cic = dsp.CICDecimator('DecimationFactor',R,'NumSections',Nsecs,... 'FixedPointDataType','Minimum section word lengths',... 'OutputWordLength',OWL);
Подробные данные ЦВК можно просмотреть путем вызова метода информации.
info(cic)
ans =
9x56 char array
'Discrete-Time FIR Multirate Filter (real) '
'----------------------------------------- '
'Filter Structure : Cascaded Integrator-Comb Decimator'
'Decimation Factor : 64 '
'Differential Delay : 1 '
'Number of Sections : 5 '
'Stable : Yes '
'Linear Phase : Yes (Type 2) '
' '
Построим график и проанализируем теоретическую амплитудную характеристику фильтра CIC, который будет работать на входной частоте 69,333 МГц.
Fs_in = 69.333e6; fvt = fvtool(cic,'Fs',Fs_in); fvt.Color = 'White';

Первое, что следует отметить, это то, что фильтр CIC имеет огромный коэффициент усиления полосы пропускания, что обусловлено дополнениями и обратной связью внутри структуры. Мы можем нормализовать амплитудную характеристику CIC, используя соответствующую настройку в FVTool. Нормализация отклика фильтра CIC с усилением 0 дБ на постоянном токе облегчит анализ ответа фильтра на следующий каскад.
fvt.NormalizeMagnitudeto1 = 'on';

Другое, что следует отметить, что увеличение в области полосы пропускания мы видим, что CIC имеет около -0,4 дБ затухания (понижения) при 80 кГц, что находится в пределах интересующей полосы пропускания. Фильтр CIC, по существу, представляет собой каскад фильтров типа boxcar и, следовательно, имеет sinc-подобный ответ, который вызывает провал. Это падение должно компенсироваться фильтром FIR на следующей стадии.
axis([0 .1 -0.8 0]);

Вторая ступень нашей цепочки фильтров DDC должна компенсировать падение полосы пропускания, вызванное CIC, и прореживать на 2. Так как CIC имеет sinc-подобный отклик, мы можем компенсировать провал фильтром нижних частот, который имеет обратный sinc отклик в полосе пропускания. Этот фильтр будет работать на 1/64-й входной частоте дискретизации, которая составляет 69,333 МГц, поэтому его частота 1.0833MHz. Вместо того, чтобы проектировать фильтр нижних частот с откликом инверсно-sinc полосы пропускания с нуля, мы будем использовать консервированную функцию, которая позволит нам разработать прореживатель с откликом CIC Compensation (инверсно-sinc) напрямую.
% Filter specifications Fs = 1.0833e6; % Sampling frequency 69.333MHz/64 Apass = 0.01; % dB Astop = 70; % dB Fpass = 80e3; % Hz passband-edge frequency Fstop = 293e3; % Hz stopband-edge frequency % Design decimation filter. D and Nsecs have been defined above as the % differential delay and number of sections, respectively. compensator = dsp.CICCompensationDecimator('SampleRate',Fs,... 'CICRateChangeFactor',R,'CICNumSections',Nsecs,... 'CICDifferentialDelay',D,'PassbandFrequency',Fpass,... 'StopbandFrequency',Fstop,'PassbandRipple',Apass,... 'StopbandAttenuation',Astop); % Now we have to define the fixed-point attributes of our multirate filter. % By default, the fixed-point attributes of the accumulator and multipliers % are set to ensure that full precision arithmetic is used, i.e. no % quantization takes place. By default, 16 bits are used to represent the % filter coefficients. Since that is what we want in this case, no changes % from default values are required.
С помощью команды info можно получить исчерпывающий отчет о компенсационном фильтре FIR, включая словосочетания накопителя и изделия, которые определяются автоматически.
info(compensator)
ans =
10x56 char array
'Discrete-Time FIR Multirate Filter (real) '
'----------------------------------------- '
'Filter Structure : Direct-Form FIR Polyphase Decimator'
'Decimation Factor : 2 '
'Polyphase Length : 11 '
'Filter Length : 21 '
'Stable : Yes '
'Linear Phase : Yes (Type 1) '
' '
'Arithmetic : double '
Каскадирование CIC с инверсным фильтром sinc позволяет определить, устранен ли провал полосы пропускания, вызванный CIC.
cicCompCascade = cascade(cic,compensator); fvt = fvtool(cic,compensator,cicCompCascade,'Fs',[Fs_in,Fs_in/64,Fs_in]); fvt.Color = 'White'; fvt.NormalizeMagnitudeto1 = 'on'; axis([0 .1 -0.8 0.8]); legend(fvt,'cic','compensator','cascade');

Как можно видеть в отклике фильтра каскада двух фильтров, который находится между откликом CIC и компенсирующим откликом FIR, провал полосы пропускания устранен.
Как указывалось ранее, спектральная маска GSM требует ослабления 18 дБ при 100 кГц. Итак, для нашей третьей и последней стадии мы можем попробовать простой равностопный фильтр нижних частот. Еще раз нужно квантовать коэффициенты до 16 битов (по умолчанию). Этот фильтр также должен прореживаться на 2.
N = 62; % 63 taps Fs = 541666; % 541.666 kHz Fpass = 80e3; Fstop = 100e3; spec = fdesign.decimator(2,'lowpass','N,Fp,Fst',N,Fpass,Fstop,Fs); % Give more weight to passband decimator = design(spec,'equiripple','Wpass',2,'SystemObject',true);
При определении многоскоростного фильтра по умолчанию размер слова накопителя определяется автоматически для поддержания полной точности. Однако, поскольку у нас есть только 20 бит для вывода, давайте установим выходной формат на длину слова 20 бит и дробной длины -12. Во-первых, необходимо изменить значение по умолчанию свойства FurePrecisionOverride с true на false.
decimator.FullPrecisionOverride = false; decimator.OutputDataType = 'custom'; decimator.RoundingMethod = 'nearest'; decimator.OverflowAction = 'Saturate'; decimator.CustomOutputDataType = numerictype([],20,-12);
Для просмотра сведений о фильтре можно использовать метод info.
info(decimator)
ans =
10x56 char array
'Discrete-Time FIR Multirate Filter (real) '
'----------------------------------------- '
'Filter Structure : Direct-Form FIR Polyphase Decimator'
'Decimation Factor : 2 '
'Polyphase Length : 32 '
'Filter Length : 63 '
'Stable : Yes '
'Linear Phase : Yes (Type 1) '
' '
'Arithmetic : double '
Теперь, когда мы разработали и квантовали три фильтра, мы можем получить общий отклик фильтра, каскадируя нормализованные CIC и два фильтра FIR. Опять же, мы используем нормированную величину, чтобы гарантировать, что каскадный отклик фильтра нормализован до 0 дБ.
ddc = cascade(cic,compensator,decimator); fvt = fvtool(ddc,'Fs',Fs_in); fvt.Color = 'White'; fvt.NormalizeMagnitudeto1 = 'on'; fvt.NumberofPoints = 8192*3; axis([0 1 -200 10]); % Zoom-in

Чтобы проверить, соответствует ли общая характеристика фильтра спецификациям GSM, можно наложить спектральную маску GSM на характеристику фильтра.
drawgsmmask;

Мы видим, что наш общий отклик фильтра находится в пределах ограничений спектральной маски GSM. Мы также должны убедиться, что пульсация полосы пропускания соответствует требованию, что она составляет менее 0,1 дБ от пика к пику. Мы можем проверить это, увеличив масштаб с помощью команды оси.
axis([0 .09 -0.08 0.08]);

Действительно, пульсация полосы пропускания значительно ниже требования GSM от 0,1 дБ к пику.
Filter Designer также поддерживает создание кода HDL из диалогового окна, показанного ниже.

В конструкторе фильтров, а также в командной строке можно создать код VHDL или Verilog, а также тестовые стенды в файлах VHDL или Verilog. Кроме того, вы можете настроить созданный код HDL, указав множество параметров, соответствующих вашим стандартам и рекомендациям по кодированию.
Однако здесь мы будем использовать функциональность командной строки для генерации кода HDL.
Теперь, когда у нас есть наш фильтр с фиксированной точкой, трехступенчатый, многоскоростной, отвечающий спецификациям, мы готовы генерировать код HDL.
Каскад CIC и два фильтра FIR и генерация VHDL.
Чтобы избежать квантования данных с фиксированной точкой, поступающих из смесителя, который имеет длину слова 20 бит и длину дроби 18 бит (S20,18), мы установим длину входного слова и длину дроби CIC в те же самые значения, S20,18.
%hcas = cascade(hcic,hcfir,hpfir); workingdir = tempname; inT = numerictype(1,20,18); generatehdl(ddc,'InputDataType', inT,... 'Name','filter','TargetLanguage','VHDL',... 'TargetDirectory',fullfile(workingdir,'hdlsrc'));
### Starting VHDL code generation process for filter: filter
### Cascade stage # 1
### Starting VHDL code generation process for filter: filter_stage1
### Generating: <a href="matlab:edit('/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage1.vhd')">/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage1.vhd</a>
### Starting generation of filter_stage1 VHDL entity
### Starting generation of filter_stage1 VHDL architecture
### Section # 1 : Integrator
### Section # 2 : Integrator
### Section # 3 : Integrator
### Section # 4 : Integrator
### Section # 5 : Integrator
### Section # 6 : Comb
### Section # 7 : Comb
### Section # 8 : Comb
### Section # 9 : Comb
### Section # 10 : Comb
### Successful completion of VHDL code generation process for filter: filter_stage1
### Cascade stage # 2
### Starting VHDL code generation process for filter: filter_stage2
### Generating: <a href="matlab:edit('/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage2.vhd')">/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage2.vhd</a>
### Starting generation of filter_stage2 VHDL entity
### Starting generation of filter_stage2 VHDL architecture
### Successful completion of VHDL code generation process for filter: filter_stage2
### Cascade stage # 3
### Starting VHDL code generation process for filter: filter_stage3
### Generating: <a href="matlab:edit('/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage3.vhd')">/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage3.vhd</a>
### Starting generation of filter_stage3 VHDL entity
### Starting generation of filter_stage3 VHDL architecture
### Successful completion of VHDL code generation process for filter: filter_stage3
### Generating: <a href="matlab:edit('/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter.vhd')">/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter.vhd</a>
### Starting generation of filter VHDL entity
### Starting generation of filter VHDL architecture
### Successful completion of VHDL code generation process for filter: filter
### HDL latency is 2 samples
Чтобы убедиться, что сгенерированный код HDL дает те же результаты, что и наша модель Simulink, мы будем использовать проверку HDL MS для совместного моделирования кода HDL в Simulink. У нас есть предварительно построенная модель Simulink, которая включает в себя два пути сигнала. Один путь сигнала дает результаты поведенческой модели Simulink трехступенчатого многоскоростного фильтра. Другой путь дает результаты моделирования с помощью ModelSim ® сгенерированного кода VHDL.
open_system('ddcfilterchaindemo_cosim');


Запустите ModelSim, дважды нажав кнопку в модели Simulink. Обратите внимание, что ModelSim должен быть установлен и находиться в системном пути. ModelSim автоматически компилирует код HDL, инициализирует моделирование и открывает средство просмотра волн.
Когда ModelSim будет готов, запустите модель Simulink. При этом будет выполнено совместное моделирование с ModelSim и автоматически открыта временная область для просмотра результатов.

Для просмотра результатов используйте логический анализатор.

След в верхней части - это сигнал частотно-регулируемого возбуждения. Следующим сигналом, обозначенным как «ref», является опорный сигнал, создаваемый поведенческой моделью Simulink трехступенчатого многоскоростного фильтра. Нижняя трасса, помеченная в области «cosim», относится к результатам моделирования ModelSim сгенерированного кода HDL трехступенчатого многоскоростного фильтра. Последняя трассировка показывает ошибку между результатами поведенческой модели Simulink и моделированием ModelSim кода HDL.
Мы использовали несколько MathWorks™ продуктов для проектирования и анализа трехступенчатой многоскоростной цепочки фильтров с фиксированной точкой DDC для GSM-приложения. Затем мы создали код HDL для реализации фильтра и проверили сгенерированный код, сравнив поведенческую модель Simulink с кодом HDL, смоделированным в ModelSim через HDL Verifier MS.