高密度脂蛋白视频滤镜

这个示例演示了如何为具有8位输入数据和10位输出数据的ITU-R BT.601亮度滤波器生成HDL代码。该滤波器是低通滤波器,3 dB点为3.2 MHz,采样频率为13.5 MHz,通带纹波和阻带衰减的指定范围如ITU规范所示。滤波器系数采用DSP系统工具箱设计。本例重点介绍量化效果和为System对象过滤器生成HDL代码。

设置系数

将先前设计的滤波器系数赋值给变量b。这是一个半带滤波器,因此,除滤波器中点的系数恰好为1 / 2外,其他系数均为零。

使用频率检查双精度滤波器设计是否符合ITU-R BT.601通带纹波和阻带衰减模板,并绘制通带。红线表示规范中允许的变化。

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, f, 13.5 e6);情节(f, 20 * log10 (abs (H)));标题(HDL视频滤波器双精度通带);轴([0 2.75 e6。8。8]);passbandrange = {[2.75 e6;1 e6;0;1 e6;2.75 e6),...(-0.5;-0.5;0;0.5;0.5)};线(passbandrange {:},“颜色”“红色”);

画出阻带

红线表示停止带上的“不超过”限制。

f = 4 e6:100:6.75e6;H = freqz (b, f, 13.5 e6);情节(f, 20 * log10 (abs (H)));标题(HDL视频滤波器双精度阻带);轴([4e6 6.75e6 -70 -35]);stopbandrange = {[4 e6;6.25 e6;6.75 e6),...(-40;-55;-55]};线(stopbandrange {:},“颜色”“红色”);

创建量化过滤器

创建一个FIR滤波器系统对象滤波器与之前定义的系数。用系数字长进行实验,得到8位输入数据和10位输出数据的期望响应。

videoFilter = dsp.FIRFilter;videoFilter。分子= b;videoFilter。结构=直接形成对称的%尝试10位系数videoFilter。CoefficientsDataType =“自定义”;videoFilter。CustomCoefficientsDataType = numerictype (10);

绘制量化滤波器响应

现在检查量化滤波器相对于规范的通带和阻带响应。先绘制并检查量化通频带。

量化设计满足通带规范,除了在直流,它错过了约0.035 dB的规范。

f = 0:100:2.75e6;H = freqz (videoFilter f 13.5 e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题(HDL视频滤波器量化通带);轴([0 2.75 e6。8。8]);线(passbandrange {:},“颜色”“红色”);

绘制量子化阻挡带

红线再次表示停止带上的“不超过”限制。

违反了阻带限制,这表明量化设置有问题。

f = 4 e6:100:6.75e6;H = freqz (videoFilter f 13.5 e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题(HDL视频滤波器量化阻带);轴([4e6 6.75e6 -70 -35]);线(stopbandrange {:},“颜色”“红色”);

改变系数量化器设置

在系数字长上增加更多的位可以使过滤器满足规格。将单词长度增加1并重新绘制停止带。

这只是错过了在停止带结束的规范。如果您知道系统的其他部分对这个信号应用了低通滤波器,那么这个小的偏离规范可能是可以接受的。

videoFilter。CustomCoefficientsDataType = numerictype (11);f = 4 e6:100:6.75e6;H = freqz (videoFilter f 13.5 e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题(HDL视频滤波器量化阻带);轴([4e6 6.75e6 -70 -35]);线(stopbandrange {:},“颜色”“红色”);

设置最终系数量化器字长

在系数量化器字长上再加一位,并重新绘制阻带。这应该符合规范。

videoFilter。CustomCoefficientsDataType = numerictype (12);f = 4 e6:100:6.75e6;H = freqz (videoFilter f 13.5 e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题(HDL视频滤波器最终量化阻带);轴([4e6 6.75e6 -70 -35]);线(stopbandrange {:},“颜色”“红色”);

对通频带响应进行最后检查

重新检查通频带,以确保更改改善了直流附近响应中的问题。响应现在通过了规范。

f = 0:100:2.75e6;H = freqz (videoFilter f 13.5 e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题(HDL视频滤波器最终量化通带);轴([0 2.75 e6。8。8]);线(passbandrange {:},“颜色”“红色”);

从量化滤波器生成HDL代码和测试平台

从量化滤波器开始,生成VHDL或Verilog代码。

创建临时工作目录。在生成HDL之后(在本例中选择VHDL),在编辑器中打开生成的VHDL文件。

生成一个VHDL测试平台,以确保它与MATLAB中的响应完全匹配。选择默认的输入刺激,对于FIR是脉冲、步进、斜坡、啁啾和噪声输入。

要生成Verilog代码和Verilog测试台,请将“TargetLanguage”属性的值从“VHDL”更改为“Verilog”。

这些警告表明,通过选择对称结构的滤波器和产生HDL,可能会导致更小的区域或更高的时钟率。

假设输入是8位字长和7位小数位数。

workingdir = tempname;generatehdl (videoFilter“名字”“hdlvideofilt”...“InputDataType”numerictype (7),...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“GenerateHDLTestbench”“上”);
### # /tmp/Bdoc20a_1326390_11805/tp850cadf6_af5c_4ddd_9c8a_a11c695ee582/hdlvideofilt. ### #开始VHDL代码生成过程:###开始生成hdvideo filt VHDL实体###开始生成hdvideo filt VHDL架构###成功完成VHDL代码生成filter过程:hdvideo filt ### HDL延迟是2个样本### #开始生成VHDL测试台。###生成输入刺激3261个样本长度。###生成测试台:/tmp/Bdoc20a_1326390_11805/tp850cadf6_af5c_4ddd_9c8a_a11c695ee582/hdlvideofilt_tb。vhd ###创建刺激向量…###完成VHDL测试平台的生成
编辑(fullfile (workingdir,“hdlvideofilt.vhd”));

绘制试验台刺激图

使用generatetbstimulus函数绘制上面命令使用的默认测试台刺激。

tbstim = generatetbstimulus (videoFilter,“InputDataType”7) numerictype(8日);情节(tbstim);标题(“HDL视频过滤器测试台刺激”);

结论

您设计了一个双精度滤波器以满足ITU-R BT.601光亮度滤波器规范,然后创建了一个FIR滤波器系统对象,该对象也满足规范。您生成了VHDL代码和一个VHDL测试台,用于从功能上验证过滤器。

您可以使用ModelSim®等VHDL模拟器来验证这些结果。您还可以尝试使用Verilog。您可以使用许多优化来消除生成的HDL完全符合MATLAB的约束,从而获得更小、更快的HDL结果。当您使用这些优化时,HDL测试台可以检查滤波器响应是否在MATLAB响应的指定误差范围内。