插值滤波器
这里写了一个测试文件。
首先定义一个dds产生一个信号
对应时钟
reg clk_t=0; wire [15:0]da1_cos;
这里产生两个时钟
initial begin #0 clk=0; forever #4 clk= ~clk; end initial begin # 4 clk_t = 0; forever #16 clk_t =~ clk_t; end
这里进行多倍插值。插值的个数取决于输入的时钟和数据时钟的关系
wire [23:0]cic_data; reg [15:0]incic_data='d0; reg cnt=0; always@(posedge clk) begin if(cnt == 1'b1) begin incic_data <= da1_cos; cnt <= cnt +1; end else begin incic_data <= 'd0;//插值是直接插0 cnt <= cnt + 1; end end
然后我们直接滤波。这里用的是CIC滤波。
reg cfg_valid=0; reg [15:0]cfg_data='d0; cic_compiler_0 abcd ( .aclk(clk), // input wire aclk .s_axis_config_tdata(cfg_data), // input wire [15 : 0] s_axis_config_tdata .s_axis_config_tvalid(cfg_valid), // input wire s_axis_config_tvalid .s_axis_config_tready(), // output wire s_axis_config_tready .s_axis_data_tdata(incic_data), // input wire [15 : 0] s_axis_data_tdata .s_axis_data_tvalid(1'b1), // input wire s_axis_data_tvalid .s_axis_data_tready(), // output wire s_axis_data_tready .m_axis_data_tdata(cic_data), // output wire [23 : 0] m_axis_data_tdata .m_axis_data_tvalid() // output wire m_axis_data_tvalid );
这里可以看出。插值后滤波是可以直接还原信号的。也就是改变数据速率可以先进性插值,然后再抽取,就可以实现小数呗插值和抽取了。