Инверсия HDL фильтр Sinc

Этот пример иллюстрирует, как сгенерировать HDL-код для инверсии sinc (sin x/x) достигающий максимума фильтр, который добавляет предварительный акцент, чтобы компенсировать свойственный sinc ответ цифро-аналогового преобразователя (DAC). Вход является 10-битным видеосигналом, и выход масштабируется, чтобы вместить усиление инверсии sinc ответ.

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

Используйте видео частоту дискретизации 27 МГц и частоту ребра полосы пропускания 7,2 МГц. Установите допустимую неравномерность в полосе пропускания от пика к пику на 0,1 дБ и затухание в полосе задерживания к-66 дБ. Затем спроектируйте фильтр с помощью firceqrip и создайте симметричный КИХ-фильтр. Наконец, исследуйте ответ с помощью fvtool.

Fs           = 27e6;                  % Sampling Frequency in MHz
N            = 20;                    % Order
Fpass        = 7.2e6;                 % Passband Frequency in MHz
slope        = 0;                     % Stopband Slope
spectype     = 'passedge';            % Frequency Specification Type
isincffactor = 1;                     % Inverse Sinc Frequency Factor
isincpower   = 1;                     % Inverse Sinc Power
Dstop        = 10^(-66/20);           % Stopband Attenuation -66 dB
ripple       = 10^(0.1/20);           % Passband Ripple 0.1 dB p-p
Dpass        = (ripple - 1) / (ripple + 1);

% Calculate the coefficients using the FIRCEQRIP function.
b  = firceqrip(N, Fpass/(Fs/2), [Dpass, Dstop], 'slope', slope, ...
               spectype, 'invsinc', isincffactor, isincpower);
inverseSincFilter = dsp.FIRFilter('Numerator',b,'Structure','Direct form symmetric');
fvtool(inverseSincFilter,'Fs',Fs);
axis([0 Fs/2e6 -80 10]);

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 an object of type line.

Создайте квантованный фильтр

Используйте норму по бесконечности freqz, чтобы найти максимальную инверсию sinc усилением, и затем масштабировать это усиление в биты, окружая. Затем примените настройки фиксированной точки к фильтру. Проверяйте ответ с fvtool.

Gbits = ceil(log2(norm(freqz(inverseSincFilter), inf)));

specifyall(inverseSincFilter);
inverseSincFilter.CustomCoefficientsDataType = numerictype(1,16,15);
inverseSincFilter.CustomOutputDataType = numerictype(1,10+Gbits,9);
inverseSincFilter.CustomProductDataType = numerictype(1,32,30);
inverseSincFilter.CustomAccumulatorDataType = numerictype(1,33,30);

fvtool(inverseSincFilter,'Fs',Fs,'Arithmetic','fixed');
axis([0 Fs/2e6 -80 10]);

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 2 objects of type line. These objects represent Filter #1: Quantized, Filter #1: Reference.

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

Начиная с квантованного фильтра сгенерируйте код VHDL или Verilog. У вас также есть опция генерации испытательного стенда VHDL или Verilog, чтобы проверить, что проект HDL совпадает с фильтром MATLAB®.

Чтобы сгенерировать VHDL вместо этого, измените значение свойства 'TargetLanguage' от 'Verilog' до 'VHDL'.

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

Создайте временный рабочий каталог. После генерации HDL-кода (выбор Verilog в этом случае) и испытательный стенд, откройте сгенерированные файлы Verilog в редакторе.

workingdir = tempname;

Fsub        = 5e6*63/88;                     % 3.579545 MHz
VoltsperIRE = (7 + 1/7)/1000;                % IRE steps are 7.14mV
Nsamples    = 1716;                          % 27 MS/s video line
userstim = zeros(1,Nsamples);                % predefine our array

% 8 Sample raised-cosine -40 IRE
syncedge = ((cos(pi/2 *(0:7)/8).^2) - 1) * 40 * VoltsperIRE;
burst    = 20 * VoltsperIRE * sin(2*pi * Fsub/Fs * (0:Fs/(Fsub/9)));

userstim(33:40)    = syncedge;
userstim(41:170)   = repmat(-40 * VoltsperIRE, 1, 130);
userstim(171:178)  = syncedge(end:-1:1);
userstim(180:247)  = burst;
% Ramp with chroma over 1416 samples from 7.5 to 80 IRE with a 20 IRE chroma
actlen = 1416;
active = 1:actlen;
userstim(260:1675) = (((active/actlen * 72.5)+7.5) + ...
                      20 * sin(2*pi * Fsub/Fs * active)) * VoltsperIRE;
userstim(1676:Nsamples) = 72.5 * VoltsperIRE * (41:-1:1)/41;

generatehdl(inverseSincFilter, 'Name', 'hdlinvsinc', 'TargetLanguage', 'Verilog',...
    'GenerateHDLTestbench','on', ...
    'TestBenchUserStimulus', userstim,...
    'TargetDirectory', workingdir,...
    'InputDataType',numerictype(1,10,9));
### Starting Verilog code generation process for filter: hdlinvsinc
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tp4be63889_f0c5_4b07_bc2e_a29176471703/hdlinvsinc.v
### Starting generation of hdlinvsinc Verilog module
### Starting generation of hdlinvsinc Verilog module body
### Successful completion of Verilog code generation process for filter: hdlinvsinc
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1716 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tp4be63889_f0c5_4b07_bc2e_a29176471703/hdlinvsinc_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.

Чтобы открыть сгенерированный источник Verilog и файлы испытательного стенда в редакторе MATLAB, используйте эти команды.

edit(fullfile(workingdir,'hdlinvsinc.v'));

edit(fullfile(workingdir,'hdlinvsinc_tb.v'));

ModelSim® Simulation Results

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

xrange = 0:Nsamples-1;
y = inverseSincFilter(fi(userstim.',1,10,9));
subplot(2,1,1); plot(xrange, userstim); 
axis([0 500 -0.4 1.1]);
title('HDL Inverse Sinc Filter In Stimulus.');
xlabel('Sample #');
subplot(2,1,2); plot(xrange, y); 
axis([0 500 -0.4 1.1]);
title('HDL Inverse Sinc Filter Out Response.');
xlabel('Sample #');

Figure contains 2 axes. Axes 1 with title HDL Inverse Sinc Filter In Stimulus. contains an object of type line. Axes 2 with title HDL Inverse Sinc Filter Out Response. contains an object of type line.

Заключение

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

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