这个例子演示了如何为数字调制解调器中的定时恢复的分数延迟(法罗)滤波器生成HDL代码。法罗滤波器结构为接收数据流在下游符号抽样之前提供可变的分数延迟。这种特殊的FIR滤波器结构允许简单处理滤波器系数通过一个有效的多项式插值公式实现提供可变分数重采样。
在典型的数字调制解调器应用中,从分组滤波器输出的分馏重新采样的数据沿符号采样器传递到具有可选载波的符号采样器。有关此完整应用程序的更多详细信息,请参阅Simulink®和Communications Toolbox™的“使用固定速率重采样”的“定时恢复”。金宝app
利用立方拉格朗日插值方法设计分数阶延迟滤波器,首先创建一个具有滤波器顺序的规范对象3.
和任意分数延迟0.3
.接下来,创建一个farrow过滤器对象高清
,采用带参数的规范对象设计方法拉拉格朗
.此方法也称为属性滤波器结构
和它的价值FD.
.您可以查看过滤器对象的详细信息高清
通过使用信息
命令。
Fdelay = 0.3;filtdes = fdesign.fracdelay(fdelay,'n',3);HD = Design(Filtdes,“拉格朗日”那'filterstructure'那'farrowfd');信息(高清)
离散时间FIR Farrow滤波器(真实)--------------------------------------滤波器结构:Farrow分数延迟滤波器长度:4稳定:是线性相位:没有算术:双
用于调谐Farrow滤波器的分数延迟,并且可以改变以引导不同的幅度响应。您可以通过创建一组是预先设计过滤器的副本的一组过滤器来查看此高清
每个不同的不同fracdelay
价值观。
为了d=0:9, h(d+1) = copy(Hd);h (d + 1) .fracdelay = d / 10;结束fvtool(h,“颜色”那'白色的')
fvtool(h,“分析”那“PhaseDelay”那“颜色”那'白色的')
将过滤器对象设置为“固定点”模式以量化它。假设具有八位系数和六位分延迟的八位输入数据。相应地修改固定点数据字长度和分数长度。这CoeffFracLength
属性自动设置,因为系数自动缩放设置为在
默认情况下CoeffAutoscale
.关掉fdautoscale
和集合FDFracLength
到6,允许0到1范围内的小数延迟被表示。
HD.Arithmett =“固定”;hd.inputwordlength = 8;HD.InputFraclength = 7;hd.coeffwordlength = 8;hd.fdwordlength = 6;hd.fdautoscale = false;hd.fdfraclength = 6;
从正确的量化滤波器开始,您可以使用generatehdl
命令。您创建了临时工作目录,然后使用generatehdl
命令使用相应的属性 - 值对。使用HDL码使用后VHDL.
为开发
属性在这种情况下,您可以通过单击命令行显示消息中显示的超链接在编辑器中打开生成的VHDL文件。
workingdir = tempname;generatehdl(HD,'名称'那“hdlfarrow”那......'目标语言'那硬件描述语言(VHDL)的那......'targetdirectory', workingdir);
###启动vhdl代码生成过程for filter:hdlfarrow ###生成:/tmp/bdoc21a_1606923_129538/tpd2eda43f_1606923_129538/tpd2eda43f_a5bf_43e9_9e13_36c8d1d2602b/hdlfarrow.vhd ###开始生成HDLfarrow VHDL实体###开始生成HDLFARROW VHDL架构###成功完成of VHDL code generation process for filter: hdlfarrow ### HDL latency is 2 samples
为了验证HDL代码,您可以使用HDL模拟器生成一个HDL测试台来模拟HDL代码。该试验台将用MATLAB®的结果验证HDL代码的结果过滤器
命令。滤波器输入的刺激filter_in.
港口和分数延迟filter_fd
可以使用属性指定端口Testbenchstumulus.
那TestbenchUserStimulus
和TestbenchFracDelayStimulus
.
预定义的刺激过滤器输入filter_in.
可以使用该属性指定端口以用于输入数据刺激Testbenchstumulus.
与其他过滤器结构一样。您可以使用该属性为输入数据指定自己的刺激TestbenchUserStimulus
并传递一个MATLAB向量作为值。
您可以使用该属性指定部分延迟刺激TestbenchFracdelayStimulus
.两者之间的矢量0.
和1
通过指定自动生成RandSweep
或RampSweep
.的部分延迟刺激是默认的行为fracdelay
筛选器对象的值。
以下命令指定输入刺激唧唧喳喳
,将分数延迟向量设为常数0.3
对于所有模拟时间。这是默认行为TestbenchFracDelayStimulus
属性,否则不设置。
generatehdl(HD,'名称'那“hdlfarrow”那......'generatehdltestbench'那'上'那......'testbenchname'那“hdlfarrow_default_tb”那......'目标语言'那硬件描述语言(VHDL)的那......'targetdirectory', workingdir);
###启动vhdl代码生成过程for filter:hdlfarrow ###生成:/tmp/bdoc21a_1606923_129538/tpd2eda43f_1606923_129538/tpd2eda43f_a5bf_43e9_9e13_36c8d1d2602b/hdlfarrow.vhd ###开始生成HDLfarrow VHDL实体###开始生成HDLFARROW VHDL架构###成功完成过滤器的VHDL代码生成过程:HDLFARROW ### HDL延迟是2个样本###开始生成VHDL测试台。已完成输入刺激的生成;3100个样本长度。###生成测试平台:/tmp/Bdoc21a_1606923_129538/tpd2eda43f_a5bf_43e9_9e13_36c8d1d2602b/hdlfarrow_default_tb。vhd ###创造刺激向量…完成VHDL测试平台的生成。
若要自动生成分数延迟端口的测试向量,请指定RampSweep
为了testbenchfracdelaystumulus.
.它生成一个向量的值之间0.
和1
以线性方式扫地。该矢量的长度等于输入刺激载体。
generatehdl(HD,'名称'那“hdlfarrow”那......'generatehdltestbench'那'上'那......'testbenchname'那'hdlfarrow_rampsweep_tb'那......'目标语言'那硬件描述语言(VHDL)的那......'testbenchstimulus'那'chirp'那......“TestbenchFracDelaystimulus”那'rampsweep'那......'targetdirectory', workingdir);
###启动vhdl代码生成过程for filter:hdlfarrow ###生成:/tmp/bdoc21a_1606923_129538/tpd2eda43f_1606923_129538/tpd2eda43f_a5bf_43e9_9e13_36c8d1d2602b/hdlfarrow.vhd ###开始生成HDLfarrow VHDL实体###开始生成HDLFARROW VHDL架构###成功完成过滤器的VHDL代码生成过程:HDLFARROW ### HDL延迟是2个样本###开始生成VHDL测试台。已完成输入刺激的生成;1028个样本长度。###生成测试平台:/tmp/Bdoc21a_1606923_129538/tpd2eda43f_a5bf_43e9_9e13_36c8d1d2602b/hdlfarrow_rampsweep_tb。vhd ###创造刺激向量…完成VHDL测试平台的生成。
您可以使用MATLAB命令生成自定义的输入刺激载体,并将其传递给用于用户定义的输入的测试台刺激属性和fracdelay
刺激。一个输入测试向量userinputstim
使用唧唧喳喳
命令和分数延迟测试向量userfdstim
由长度等于输入测试向量生成。
t = 2:0.01:2;%+/- 2秒@ 100 Hz采样率userinputstim =唧唧声(t, 100, 1200,'Q');%在100hz开始,在t=1sec穿过200Hzleninput =长度(userinputstim);Samplefdvalues = [0.1, 0.34, 0.78, 0.56, 0.93, 0.25, 0.68, 0.45];samplesheld =装天花板(leninput /长度(samplefdvalues));第九= 1;为了n = 1:长度(samplefdvalues)-1 userfdstim(ix:ix + samplesheld-1)= repmat(samplefdvalues(n),1,samplesheld);ix = ix + samplesheld;结束Userfdstim (ix:leninput)= repmat(samplefdvalues(end),1, leninput-length(Userfdstim));generatehdl(HD,'名称'那“hdlfarrow”那......'generatehdltestbench'那'上'那......'testbenchname'那“hdlfarrow_userdefined_tb”那......'目标语言'那硬件描述语言(VHDL)的那......“TestBenchUserStimulus”,UserInputstim,......“TestbenchFracDelaystimulus”userfdstim,......'targetdirectory', workingdir);
###启动vhdl代码生成过程for filter:hdlfarrow ###生成:/tmp/bdoc21a_1606923_129538/tpd2eda43f_1606923_129538/tpd2eda43f_a5bf_43e9_9e13_36c8d1d2602b/hdlfarrow.vhd ###开始生成HDLfarrow VHDL实体###开始生成HDLFARROW VHDL架构###成功完成过滤器的VHDL代码生成过程:HDLFARROW ### HDL延迟是2个样本###开始生成VHDL测试台。已完成输入刺激的生成;长度401个样本。###生成测试台:/tmp/bdoc21a_1606923_129538/tpd2eda43f_a5bf_43e9_9e13_36c8d1d2602b/hdlfarrow_userdefining_tb.vhd ###创建刺激向量... ###完成生成VHDL测试台。
以下显示显示了运行VHDL测试台后的ModelSim®HDL模拟器。
在此示例中,我们展示了如何设计双精度分数延迟滤波器以满足给定的规格。我们还显示了如何量化过滤器并生成VHDL代码。然后,我们展示了如何使用多个选项来生成VHDL测试台来指定输入和Fracdelay刺激载体。
您可以使用任何HDL模拟器来验证这些结果。您还可以在过滤器和测试平台上使用Verilog进行实验。