Фильтр дробной задержки 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.

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

Установите объект фильтра в режим с фиксированной точкой, чтобы квантовать его. Предположим, что восемь-битные входные данные с восьмибитными коэффициентами и шестибитовой дробной задержкой. Измените размеры слова данных с фиксированной точкой и длины дробей соответственно. The 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. Испытательный стенд проверит результаты HDL-кода с результатами filter MATLAB ® команда. Стимулы для входного сигнала фильтра filter_in порт и дробная задержка filter_fd порт может быть задан с помощью свойств TestbenchStimulus, TestbenchUserStimulus и TestbenchFracDelayStimulus.

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

Можно задать стимул дробной задержки, используя свойство TestbenchFracdelayStimulus. Вектор double между 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- испытательных стендов с помощью нескольких вариантов, чтобы задать вектор входа и fracdelay.

Для проверки этих результатов можно использовать любые Симуляторы HDL. Также можно экспериментировать с Verilog как для фильтров, так и для испытательных стендов.