HDL дробная задержка (неоплодотворенный) фильтр

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

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

Спроектируйте фильтр

Чтобы спроектировать дробный фильтр задержки с помощью Кубического Лагранжевого метода интерполяции, сначала создайте объект спецификации с порядком фильтра 3 и произвольная дробная задержка 0.3. Затем создайте неоплодотворенный объект фильтра 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. Испытательный стенд проверит результаты 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® Simulation Results

Следующее отображение показывает симулятор HDL ModelSim® после выполнения испытательного стенда VHDL.

Заключение

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

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