CIC数据截取时的直流增益问题
我目前在做降采样滤波器,降采样滤波的时候,由于字长增长问题,需要将数据截取一段作为最终输出,但在数据截取的时候,在频谱上产生了一个直流分量,这个直流分量该怎么消除?
附上代码。
(代码为功能代码。在网上下的)
module cic3s32 (clk, x_in, clk2, y_out); //----> Interface
input clk;
input x_in;
output [15:0] y_out;
output clk2;
reg clk2;
parameter hold=0, sample=1;
reg [1:0] state;
reg [4:0] count;
reg x; // Registered input
wire [25:0] sxtx; // Sign extended input
reg [25:0] i0; // I section 0
reg [20:0] i1; // I section 1
reg [15:0] i2; // I section 2
reg [13:0] i2d1, i2d2, i2d3, i2d4, c1, c0; // I + COMB 0
reg [12:0] c1d1, c1d2, c1d3, c1d4, c2; // COMB section 1
reg [11:0] c2d1, c2d2, c2d3, c2d4, c3; // COMB section 2
always @(posedge clk)
begin : FSM
if (count == 31) begin
count <= 0;
state <= sample;
clk2 <= 1;
end
else begin
count <= count + 1;
state <= hold;
clk2 <= 0;
end
end
assign sxtx = {{18{x[7]}},x};
always @(posedge clk)
begin : Int
x <= x_in;
i0 <= i0 + sxtx;
i1 <= i1 + i0[25:5];
i2 <= i2 + i1[20:5];
end
always @(posedge clk)
begin : Comb
if (state == sample) begin
c0 <= i2[15:2];
i2d1 <= c0;
i2d2 <= i2d1;
c1 <= c0 - i2d2;
c1d1 <= c1[13:1];
c1d2 <= c1d1;
c2 <= c1[13:1] - c1d2;
c2d1 <= c2[12:1];
c2d2 <= c2d1;
c3 <= c2[12:1] - c2d2;
end
end
assign y_out = c3[11:2];
endmodule
求解,这个直流分量可以消除吗?还是可以控制在一定范围内,不可能完全消除?
用round不要用clip
具体操作是怎么操作的?判断最高位和截取的下一位?只有2‘b01时加1’b1.
四舍五入时正负应是对等的,比如0.5取为1,那-0.5那应取为-1,而不是0
想要知道具体的操作流程,我c[22:0]。我取其中的c[22:2]赋给d[20:0]。也就是d[20:0] <= c[22:2]。那我该怎么四舍五入?我通过判断{c[22],c[0]}。
但老做不对。您能告诉我具体操作吗?谢谢了。
等待您的回复……
我这样比较吧。-9的补码是1 0111
右移1位
1 011 是-5
本来该是-4.5的,现在移位,-5
我觉得,负数貌似不需处理
您说呢?
我这里举几个例子,5 bit数据
10011 值-13, 除以4,得-3.25, 四舍五入,得-3
10010 -14 得-3.5 得-4
10001 -15 得-3.75 得-4
10000 -16 得-4 得-4
像除以4这种操作,只有后两位都是11时,才是需要直接右移两位再+1的,别的直接截掉两位。
如果只是除以2的话,对于负数来说,都一样,除以4的话,则要考虑最后两BIT为11的情况与其它不一样的。
其实就是关于中间那个点的问题, -0.5 这个可归为-1, 但是比-0.5再多一点点,或少一点点,值倾斜的方向就变了,
thankyou。学习了!
你数据用的是什么码?如果是带符号的,那么再检查信号本身有无直流分量。
