FPGA信号截位策略

在FPGA中,随着信号处理层次加深,对信号进行乘、累加、滤波等运算后,可能输入时仅为8位位宽的信号会扩展成几十位位宽,位宽越宽,占用的硬件资源越多,但位宽超过一定范围后,位宽的增宽并不会对处理精度带来显著的改善,这时就需要对信号进行截位。写过FPGA HDL代码的童鞋应该都知道,截位是最为经常的一种操作。
一般来说,截位只需要截掉低几位即可,这时最简单的做法:对于无符号数来说,这样做也没有问题;当然也有四舍五入的截位方法,就是给地位加1后再进行截位。
下面讨论三种截位策略:1)直接截位;2)复数截位后加1;3)复数取绝对值后再截位。
在matlab中模拟FPGA截位过程,运行如下一段程序,得到四幅图。

a=10000*randn(1,1000);  
%% 截位方式一:直接截位  
b=floor(a/2^5);         %截去低5位  
afft=fft(a);
bfft=fft(b);  
figure;                  %观察原始信号与截位后信号的频谱  
subplot(2,1,1);plot(abs(afft)/max(abs(afft)));grid;title('原始信号');  
subplot(2,1,2);plot(abs(bfft)/max(abs(bfft)));grid;title('截位信号');
b=floor(a/2^12);        %截去低12位  
afft=fft(a);bfft=fft(b);  
figure;                 %观察原始信号与截位后信号的频谱  
subplot(2,1,1);plot(abs(afft)/max(abs(afft)));grid;title('原始信号');  
subplot(2,1,2);plot(abs(bfft)/max(abs(bfft)));grid;title('截位信号');  
 

%%  截位方式二:负数截位后加1    
b=zeros(1,length(a));  
for ii=1:length(a)  
    if a(ii)<0  
        b(ii)=floor(a(ii)/2^12)+1; %截去低12位后加1  
    else  
        b(ii)=floor(a(ii)/2^12);   %直接截位  
    end  
end  
afft=fft(a);bfft=fft(b);  
figure;                %观察原始信号与截位后信号的频谱  
subplot(2,1,1);plot(abs(afft)/max(abs(afft)));grid;title('原始信号');  
subplot(2,1,2);plot(abs(bfft)/max(abs(bfft)));grid;title('截位信号');

%%   截位方式三:负数取绝对值后再截位   
b=zeros(1,length(a));  
for ii=1:length(a)  
    if a(ii)<0  
        b(ii)=-floor(-a(ii)/2^12); %负数取绝对值后截去低12位再变回原来符号  
    else  
        b(ii)=floor(a(ii)/2^12);   %直接截位  
    end  
end  
afft=fft(a);bfft=fft(b);  
figure;                %观察原始信号与截位后信号的频谱  
subplot(2,1,1);plot(abs(afft)/max(abs(afft)));grid;title('原始信号');  
subplot(2,1,2);plot(abs(bfft)/max(abs(bfft)));grid;title('截位信号');

在这里插入图片描述
图一:直接截去低5位
在这里插入图片描述
图二:直接截去低12位
在这里插入图片描述
图三:截去低12位且复数截位加一
在这里插入图片描述
图四:截去低12位且复数取绝对值后再截位,截位完再变回原先的符号
由图三和图四可以看出,采用第二种和第三种截位策略后,直流分量消失。
其实第三种截位策略达到了这样一种效果:一对相反数在截位后仍然是一对相反数。这种效果在直接截位时对于奇数是达不到的。
其实直接截位之所以出现直流分量可以这样直观的来认识:从matlab程序中也可以看出,对于FPGA信号截位来说,实际上就是向下取整;对于有符号数来说,整数向下取整在数轴上是向原点零靠近,然后负数向下取整则是远离原点零了,这是因为负数以补码形式表示,它的补码所对应的无符号数经截位后向原点零靠近了,换算成有符号数的负数时,则是远离原点零了。因此截位实际造成的效果是符号整体向负无穷方向平移了,即对一个白噪声序列来讲,原本均值为零,截位后值变为了负数。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值