exponenta event banner

Фильтр дробной задержки HDL (Farrow)

Этот пример иллюстрирует, как генерировать код HDL для фильтра дробной задержки (Farrow) для восстановления синхронизации в цифровом модеме. Структура фильтра Фэрроу обеспечивает переменную дробную задержку для принятого потока данных до дискретизации символа в нисходящем направлении. Эта специальная структура КИХ-фильтра обеспечивает простую обработку коэффициентов фильтра с помощью эффективной реализации формулы полиномиальной интерполяции для обеспечения переменной дробной повторной дискретизации.

В типичном приложении цифрового модема данные с частичной выборкой, выводимые из фильтра Фэрроу, передаются на дискретизатор символов с необязательным восстановлением несущей. Для получения более подробной информации об этом приложении см. раздел «Восстановление синхронизации с использованием ресамплинга с фиксированной скоростью» для Simulink ® и Communications Toolbox™.

Проектирование фильтра

Чтобы создать фильтр дробной задержки с помощью метода интерполяции кубического лагранжа, сначала создайте объект спецификации с порядком фильтра 3 и произвольная дробная задержка 0.3. Далее создайте объект фильтра Farrow Hd, используя метод конструирования объекта спецификации с аргументом lagrange. Этот метод также вызывается со свойством FilterStructure и его ценность fd. Можно просмотреть подробные данные объекта фильтра. Hd с помощью info команда.

fDelay = 0.3;
filtdes = fdesign.fracdelay(fDelay, 'N', 3);
Hd = design(filtdes,'lagrange', 'FilterStructure', 'farrowfd');
info(Hd)
Discrete-Time FIR Farrow Filter (real)     
--------------------------------------     
Filter Structure  : Farrow Fractional Delay
Filter Length     : 4                      
Stable            : Yes                    
Linear Phase      : No                     
                                           
Arithmetic        : double                 

Дробная задержка для фильтра Фэрроу является настраиваемой и может быть изменена, чтобы привести к другой амплитудной характеристике. Это можно увидеть, создав набор фильтров, являющихся копиями предварительно разработанного фильтра. Hd с каждым, отличающимся своими fracdelay значения.

for d=0:9,
    h(d+1) = copy(Hd);
    h(d+1).fracdelay = d/10;
end
fvtool(h,'Color','white')

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 11 objects of type line.

fvtool(h,'Analysis','PhaseDelay','Color','white')

Figure Filter Visualization Tool - Phase Delay contains an axes and other objects of type uitoolbar, uimenu. The axes with title Phase Delay contains 10 objects of type line.

Квантование фильтра

Для квантования объекта фильтра установите режим с фиксированной точкой. Предположим, что восьмибитовые входные данные имеют восьмибитовые коэффициенты и шестибитовую дробную задержку. Измените длину слова данных с фиксированной точкой и длину дроби соответствующим образом. CoeffFracLength свойство устанавливается автоматически, так как для автокабеля коэффициентов установлено значение on по умолчанию по свойству CoeffAutoscale. Выключить FDAutoScale и набор FDFracLength до шести, позволяя представлять дробную задержку в диапазоне от 0 до 1.

Hd.arithmetic            = 'fixed';
Hd.InputWordLength       = 8;
Hd.InputFracLength       = 7;
Hd.CoeffWordLength       = 8;
Hd.FDWordLength          = 6;
Hd.FDAutoScale           = false;
Hd.FDFracLength          = 6;

Создание кода HDL из квантованного фильтра

Начиная с правильно квантованного фильтра, можно создать код VHDL или Verilog с помощью generatehdl команда. Создайте временный рабочий каталог, а затем используйте generatehdl с использованием соответствующих пар свойство-значение. После генерации кода HDL с помощью VHDL для TargetLanguage в этом случае можно открыть созданный файл VHDL в редакторе, щелкнув гиперссылку, отображаемую в сообщениях отображения командной строки.

workingdir = tempname;
generatehdl(Hd, 'Name', 'hdlfarrow', ...  
                'TargetLanguage', 'VHDL',...
                'TargetDirectory', workingdir);
### Starting VHDL code generation process for filter: hdlfarrow
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow.vhd
### Starting generation of hdlfarrow VHDL entity
### Starting generation of hdlfarrow VHDL architecture
### Successful completion of VHDL code generation process for filter: hdlfarrow
### HDL latency is 2 samples

Создание испытательного стенда ЛПВП

Для проверки кода HDL можно создать тестовый стенд HDL для моделирования кода HDL с помощью имитатора HDL. Испытательный стенд проверяет результаты кода HDL с результатами MATLAB ®filter команда. Стимулы для входа фильтра filter_in портовая и дробная задержка filter_fd порт может быть указан с помощью свойств TestbenchStimulus, TestbenchUserStimulus и TestbenchFracDelayStimulus.

Предопределенный стимул для входа фильтра filter_in порт может быть указан для стимула входных данных с помощью свойства TestbenchStimulus как и в случае с другими фильтрующими структурами. Можно указать собственный стимул для входных данных с помощью свойства TestbenchUserStimulus и передачу вектора MATLAB в качестве значения.

Можно задать дробный стимул задержки с помощью свойства TestbenchFracdelayStimulus. Вектор двойного значения между 0 и 1 генерируется автоматически путем указания RandSweep или RampSweep. Поведение по умолчанию заключается в предоставлении стимула дробной задержки константы, установленной на fracdelay значение объекта фильтра.

Следующая команда задает входной стимул для chirpи вектор дробной задержки устанавливается в константу 0.3 за все время моделирования. Это поведение по умолчанию, когда TestbenchFracDelayStimulus в противном случае свойство не устанавливается.

generatehdl(Hd, 'Name', 'hdlfarrow', ...
    'GenerateHDLTestbench', 'on', ...
    'TestBenchName', 'hdlfarrow_default_tb',...
    'TargetLanguage', 'VHDL',...
    'TargetDirectory', workingdir);
### Starting VHDL code generation process for filter: hdlfarrow
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow.vhd
### Starting generation of hdlfarrow VHDL entity
### Starting generation of hdlfarrow VHDL architecture
### Successful completion of VHDL code generation process for filter: hdlfarrow
### HDL latency is 2 samples
### Starting generation of VHDL Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 3100 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow_default_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

Для автоматического создания тестового вектора для порта дробной задержки укажите RampSweep для TestBenchFracDelayStimulus. Он генерирует вектор значений между 0 и 1 подметание линейным способом. Длина этого вектора равна входному вектору стимула.

generatehdl(Hd, 'Name', 'hdlfarrow', ...
    'GenerateHDLTestbench', 'on', ...
    'TestBenchName', 'hdlfarrow_rampsweep_tb',...
    'TargetLanguage', 'VHDL',...
    'TestBenchStimulus', 'chirp',...
    'TestbenchFracDelaystimulus', 'Rampsweep', ...
    'TargetDirectory', workingdir);
### Starting VHDL code generation process for filter: hdlfarrow
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow.vhd
### Starting generation of hdlfarrow VHDL entity
### Starting generation of hdlfarrow VHDL architecture
### Successful completion of VHDL code generation process for filter: hdlfarrow
### HDL latency is 2 samples
### Starting generation of VHDL Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1028 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow_rampsweep_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

Можно создать пользовательский входной вектор стимула с помощью команд MATLAB и передать его на тестовый стенд свойств стимула для пользовательского ввода и fracdelay раздражители. Входной тестовый вектор userinputstim генерируется с помощью chirp команда и вектор проверки дробной задержки userfdstim формируют длину, равную входному тестовому вектору.

t=-2:0.01:2;                           % +/-2 secs @ 100 Hz sample rate
userinputstim = chirp(t,100,1,200,'q'); % Start @100Hz, cross 200Hz at t=1sec 
leninput = length(userinputstim);
samplefdvalues = [0.1, 0.34, 0.78, 0.56, 0.93, 0.25, 0.68, 0.45];
samplesheld = ceil(leninput/length(samplefdvalues));
ix = 1;
for n = 1:length(samplefdvalues)-1
    userfdstim(ix: ix + samplesheld-1) =  repmat(samplefdvalues(n),1, samplesheld);
    ix = ix + samplesheld;
end
userfdstim(ix:leninput)= repmat(samplefdvalues(end),1 , leninput-length(userfdstim));

generatehdl(Hd, 'Name', 'hdlfarrow', ...
    'GenerateHDLTestbench', 'on', ...
    'TestBenchName', 'hdlfarrow_userdefined_tb',...
    'TargetLanguage', 'VHDL',...
    'TestBenchUserStimulus', userinputstim,...
    'TestbenchFracDelaystimulus', userfdstim, ...
    'TargetDirectory', workingdir);
### Starting VHDL code generation process for filter: hdlfarrow
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow.vhd
### Starting generation of hdlfarrow VHDL entity
### Starting generation of hdlfarrow VHDL architecture
### Successful completion of VHDL code generation process for filter: hdlfarrow
### HDL latency is 2 samples
### Starting generation of VHDL Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 401 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow_userdefined_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

Результаты моделирования ModelSim ®

На следующем экране показан симулятор ModelSim ® HDL после запуска тестового стенда VHDL .

Заключение

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

Для проверки этих результатов можно использовать любой имитатор ЛПВП. Можно также экспериментировать с Verilog как для фильтров, так и для тестовых стендов.