www.gusucode.com > hdlfilter 案例代码 matlab源码程序 > hdlfilter/hdlvideofilt.m
%% HDL Video Filter % This example illustrates how to generate HDL code for an ITU-R % BT.601 luma filter with 8-bit input data and 10-bit output data. This % filter is a low-pass filter with a -3 dB point of 3.2 MHz with a 13.5 % MHz sampling frequency and a specified range for both passband ripple % and stopband attenuation shown in the ITU specification. The filter % coefficients were designed using the DSP System Toolbox(TM). This % example focuses on quantization effects and generating HDL code for % the System object filter. % Copyright 2004-2016 The MathWorks, Inc. %% Set up the Coefficients % Assign the previously designed filter coefficients to variable b. This % is a halfband filter and, therefore, every other coefficient is zero % with the exception of the coefficient at the filter midpoint, which is % exactly one-half. % % Check that double-precision filter design meets the ITU-R BT.601 % template for passband ripple and stopband attenuation using freqz and % plot the passband. The red lines show the allowed variation in the % specification. b = [0.00303332064210658, 0,... -0.00807786494715095, 0,... 0.0157597395206364, 0,... -0.028508691397868, 0,... 0.0504985344927114, 0,... -0.0977926818362618, 0,... 0.315448742029959,... 0.5,... 0.315448742029959, 0,... -0.0977926818362618, 0,... 0.0504985344927114, 0,... -0.028508691397868, 0,... 0.0157597395206364, 0,... -0.00807786494715095, 0,... 0.00303332064210658]; f = 0:100:2.75e6; H = freqz(b,1,f,13.5e6); plot(f,20*log10(abs(H))); title('HDL Video Filter Double-Precision Passband'); axis([0 2.75e6 -.8 .8]); passbandrange = {[2.75e6; 1e6; 0; 1e6; 2.75e6],... [ -0.5; -0.5; 0; 0.5; 0.5]}; line(passbandrange{:}, 'Color', 'red'); %% Plot the Stopband % The red line shows a "not to exceed" limit on the stopband. f = 4e6:100:6.75e6; H = freqz(b,1,f,13.5e6); plot(f,20*log10(abs(H))); title('HDL Video Filter Double-Precision Stopband'); axis([4e6 6.75e6 -70 -35]); stopbandrange = {[4e6; 6.25e6; 6.75e6],... [-40; -55; -55]}; line(stopbandrange{:}, 'Color', 'red'); %% Create the Quantized Filter %Create a FIR filter System object filter with previously defined coefficients. %Experiment with the coefficient word length to get the desired response %for 8-bit input data and 10-bit output data. videoFilter = dsp.FIRFilter; videoFilter.Numerator = b; %Try 10-bit coefficients videoFilter.CoefficientsDataType = 'Custom'; videoFilter.CustomCoefficientsDataType = numerictype(1,10); %% Plot the Quantized Filter Response % Now examine the passband and stopband response of the quantized filter % relative to the specification. Plot and check the quantized passband % first. % % The quantized design meets the passband specifications except at DC, % where it misses the specification by about 0.035 dB. f = 0:100:2.75e6; H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed'); plot(f,20*log10(abs(H))); title('HDL Video Filter Quantized Passband'); axis([0 2.75e6 -.8 .8]); line(passbandrange{:}, 'Color', 'red'); %% Plot the Quantized Stopband % The red lines again show a "not to exceed" limit on the stopband. % % The stopband limit is violated, which indicates a problem with the % quantization settings. f = 4e6:100:6.75e6; H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed'); plot(f,20*log10(abs(H))); title('HDL Video Filter Quantized Stopband'); axis([4e6 6.75e6 -70 -35]); line(stopbandrange{:}, 'Color', 'red'); %% Change the Coefficient Quantizer Settings % Adding more bits to the coefficient word length enables the filter to % meet the specification. Increment the word length by one and replot % the stopband. % % This just misses the specification at the end of the stopband. This % small deviation from the specification might be acceptable if you know % that some other part of your system applies a lowpass filter to this % signal. videoFilter.CustomCoefficientsDataType = numerictype(1,11); f = 4e6:100:6.75e6; H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed'); plot(f,20*log10(abs(H))); title('HDL Video Filter Quantized Stopband'); axis([4e6 6.75e6 -70 -35]); line(stopbandrange{:}, 'Color', 'red'); %% Set the Final Coefficient Quantizer Word Length % Add one more bit to the coefficient quantizer word length and replot % the stopband. This should meet the specification. videoFilter.CustomCoefficientsDataType = numerictype(1,12); f = 4e6:100:6.75e6; H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed'); plot(f,20*log10(abs(H))); title('HDL Video Filter Final Quantized Stopband'); axis([4e6 6.75e6 -70 -35]); line(stopbandrange{:}, 'Color', 'red'); %% Perform a Final Check on the Passband Response % Recheck the passband to be sure the changes have improved the problems % in the response near DC. The response now passes the specification. f = 0:100:2.75e6; H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed'); plot(f,20*log10(abs(H))); title('HDL Video Filter Final Quantized Passband'); axis([0 2.75e6 -.8 .8]); line(passbandrange{:}, 'Color', 'red'); %% Generate HDL Code and Test Bench from the Quantized Filter % Starting from the quantized filter, generate VHDL or Verilog code. % % Create a temporary work directory. After generating the HDL % (selecting VHDL in this case), open the generated VHDL file in the % editor. % % Generate a VHDL test bench to make sure that it matches the response % in MATLAB exactly. Select the default input stimulus, which for FIR % is impulse, step, ramp, chirp, and noise inputs. % % To generate Verilog code and Verilog test bench instead, change value for % 'TargetLanguage' property from 'VHDL' to 'Verilog'. % % The warnings indicate that by selecting the symmetric structure for the % filter and generating HDL, may result in smaller area or a higher clock % rate. % % Assume an input of 8-bit word length with 7-bit fractional bits. workingdir = tempname; generatehdl(videoFilter, 'Name', 'hdlvideofilt', ... 'InputDataType' ,numerictype(1,8,7), ... 'TargetLanguage', 'VHDL', ... 'TargetDirectory', workingdir, ... 'GenerateHDLTestbench', 'on'); edit(fullfile(workingdir, 'hdlvideofilt.vhd')); %% Plot the Test Bench Stimulus % Plot the default test bench stimulus used by above command, using the % generatetbstimulus function. With no output variable, the function % plots the stimulus. generatetbstimulus(videoFilter,'InputDataType', numerictype(1,8,7)); %% Conclusion % You designed a double precision filter to meet the ITU-R BT.601 luma % filter specification and then created a FIR filter System object that % also met the specification. You generated VHDL code and a VHDL test bench % that functionally verified the filter. % % You can use a VHDL simulator, such as ModelSim(R), to verify these % results. You can also experiment with Verilog. You can use many % optimizations to get smaller and faster HDL results by removing the % constraint that the generated HDL be exactly true to MATLAB. When you % use these optimizations, the HDL test bench can check the filter % response to be within a specified error margin of the MATLAB response.