Этот пример иллюстрирует, как сгенерировать 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]);
Используйте норму по бесконечности 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]);
Начиная с квантованного фильтра сгенерируйте код 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/BR2019bd_1276998_130124/mlx_to_docbook1/tp14b0fbba_df01_4986_bc09_815520ed8926/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/BR2019bd_1276998_130124/mlx_to_docbook1/tp14b0fbba_df01_4986_bc09_815520ed8926/hdlinvsinc_tb.v ### Creating stimulus vectors ... ### Done generating VERILOG Test Bench.
edit(fullfile(workingdir, 'hdlinvsinc.v')); edit(fullfile(workingdir, 'hdlinvsinc_tb.v'));
Следующее отображение показывает форму волны симулятора 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 #');
Вы спроектировали инверсию sinc фильтр, чтобы соответствовать данной спецификации. Вы сгенерировали код Verilog и испытательный стенд Verilog с помощью приближения видео линии как тестовый стимул.
Можно использовать симулятор HDL, чтобы проверить эти результаты. Можно также экспериментировать с VHDL и Verilog и для фильтров и для испытательных стендов.