插值滤波器

这里写了一个测试文件。

首先定义一个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
); 

这里可以看出。插值后滤波是可以直接还原信号的。也就是改变数据速率可以先进性插值,然后再抽取,就可以实现小数呗插值和抽取了。

 

posted @ 2018-04-10 17:30  木心的木偶  阅读(1401)  评论(0编辑  收藏  举报