fpga数据位宽截取_FPGA信号截位策略研究
在FPGA中,隨著信號處理的層次加深,對信號進行乘、累加、濾波等運算后,可能輸入時僅為8位位寬的信號會擴展成幾十位位寬,位寬越寬,占用的硬件資源就越多,但位寬超過一定范圍后,位寬的增寬并不會對處理精度帶來顯著的改善,這時就需要對信號進行截位。寫過FPGA HDL代碼的童鞋都應該知道,截位是最為經常的一種操作。
一般來說,截位只需截掉低幾位即可,這是最簡單的做法;對于無符號數來說,這樣做也沒有問題;當然也有四舍五入的截位方法,就是給次低位加一后再進行截位。
下面討論三種截位截略: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('截位信號');
圖一:直接截去低五位
圖二:直接截去低12位
圖三:截去低12位且負數截位后加一
圖四:截去低12位且負數取絕對值后再截位,截完位再變回原先的符號
由圖三和圖四可以看出,采用第二種和第三種截位策略后,直流分量消失。
其實第三種截位策略是達到了這樣一種效果:一對相反數在截位后仍然是一對相反數。這種效果在直接截位時對于奇數來說是達不到的。
其實直接截位之所以出現直流分量可以這樣直觀的來認識:從matlab程序中也可以看出,對于FPGA信號截位來說,實際上就是向下取整;對于有符號數來講,正數向下取整在數軸上是向原點零靠近,然后負數向下取整則是遠離原點零了,這是因為負數以補碼形式表示,它的補碼所對應的無符號數經截位后向原點零靠近了,換算成有符號的負數時,則是遠離原點零了。因此截位實際造成的效果是信號整體向負無窮方向平移了,即對于一個白噪聲序列來講,原本均值為零,截位后均值變為了負數。
總結
以上是生活随笔為你收集整理的fpga数据位宽截取_FPGA信号截位策略研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个关于微信个性签名
- 下一篇: 4g运行内存手机还能用多久_看完就明白: