f=4000; %信號頻率為4KHz
fs=48000; %采樣率為48KHz
t=(0:1/fs:1000/fs); %定義信號的時間范圍
x=cos(2*pi*f*t); %生成信號
fir濾波器中的頻響是0~pi,因此如果采樣率是48KHz,如上圖所示通帶中心在0.168附近,那通帶的信號頻率應該是(48/2)*0.168 = 4KHz左右。
fir IP的輸出實際的位寬和有效位寬可能不一致,如下圖所示的IP輸出位寬為40bit,實際有效位寬為36bit。有效帶寬內包含兩bit符號位,因此實際截位為bit34~bit19(截取16bit)。
本例中可以輸入一個4KHz的正弦波,由於在通帶內因此不會衰減,看輸出的最高有效位在哪,實際測試最高有效位也是bit33,符號位為bit34.
FFT使用:
fft的IP使用和fix16_15還是fix16_0沒有關系,不影響計算的結果,重點在於量化的精度,如果精度差太大就和matlab的結果差太大導致數值上對不上。
影響fft精度的因素:
1. phase factor 旋轉因子的位寬
2. 輸入數據的位寬(數據有效位寬為16bit時,fft的輸入放到只24bit,相當於輸入數據乘以256,也可以改善精度)
3. 輸入數據的范圍過小也影響精度,應該同比例放大至位寬范圍內最大值。
4. 動態配置IP時,需要仔細查看文檔pg109,Page55 講的注意事項及方法。
5. 對於Non-realtime以及realtime的不同模式,IP輸出的接口信號是不一樣的,動態配置也和這個模式有關系。
6. 沒啥特殊情況,建議使用realtime模式
7. 某些情況下,fft和ifft的輸出結果實部可能很接近,不必糾結於此,看matlab對應的結果即可,另外此時虛部相差很大。
8. 輸入是16bit的情況下,如果輸入值很小(比方最大兩三百這種),那么輸出的值和matlab的偏差會很大,極有可能連符號位都對不上,其實是因為精度導致的,
此時把fft的輸入設置成24bit,將16bit數據映射到高16bit,低8bit可以理解為作為fft運算中間值的精度擴展位,運算的結果再取高32位,可以極大的改善精度,基本能和matlab對應上。