基2蝶算模組 fft8

2021-06-01 22:45:36 字數 1222 閱讀 1366

滿眼的管腳線看得眼暈,尤其是在測試的時候,才發現測試物件的思考更糾結。

對於蝶算模組,其功能是由控制器輸出4個控制計數,butter_fly在每乙個時鐘接收一組數。內部設兩級快取交替儲存輸入,同時計算出結果按原址存到ram裡。如下圖所示:

對於cmul,每個時鐘接收8個資料,非同步得出結果。基二的蝶型公式是 a=a+b*wn, a=a-b*wn,涉及到小數運算,將小數定標,提高64倍,考慮到溢位,每一步計算之後回退128倍,公式如下:

assign r=(a_r*64 +b_r*wn1a +b_i*wn1b) /128;

assign i=(a_i*64 +b_r*wn2a +b_i*wn2b) /128;

對於bf模組,其作用是控制給cmul的資料傳送,如下:

case(cnt4_buf)

2'b00:begin ta_r1<=q_r; ta_i1<=q_i; twn11<=sin; twn21<=cos; a_r<=ta_r2; a_i<=ta_i2; b_r<=tb_r2; b_i<=tb_i2; wn1a<=twn22; wn1b<=-twn12; wn2a<=twn12; wn2b<=twn22; end

2'b01:begin tb_r1<=q_r; tb_i1<=q_i; a_r<=ta_r2; a_i<=ta_i2; b_r<=tb_r2; b_i<=tb_i2; wn1a<=-twn22; wn1b<=twn12; wn2a<=-twn12; wn2b<=-twn22; end

2'b10:begin ta_r2<=q_r; ta_i2<=q_i; twn12<=sin; twn22<=cos; a_r<=ta_r1; a_i<=ta_i1; b_r<=tb_r1; b_i<=tb_i1; wn1a<=twn21; wn1b<=-twn11; wn2a<=twn11; wn2b<=twn21; end

2'b11:begin tb_r2<=q_r; tb_i2<=q_i;

測試該模組,驗證其波形結果:

單獨的模組其實是乙個基2,2點fft,q_r是輸入資料,當輸入當別是16,8時,fft結果應該是:24,8。從圖中可以看到r作為結果,縮小了1/2,是因為防止溢位時的退位造成的。從而證明模組的正確性。

思考:1.計算時採用符號與直接呼叫lpm模組效能有什麼差異

2.溢位的判斷根據最後實際輸入資料來調整,實際使用中,若訊號並不常處在最大值,就沒有必要犧牲精度來換範圍。

模組化編譯F2FS

二 編譯完成後,把f2fs的整個目錄拷貝出來,進入目錄,修改makefile檔案,主要就是新增相關路徑,如下 obj config f2fs fs f2fs.o f2fs y dir.o file.o inode.o namei.o hash.o super.o inline.o f2fs y ch...

stm32F4 時基定時器(2)

找了很多的資料,終於把時基定時器的給弄懂了,沒有使用庫函式,直接操作暫存器。下面介紹stm32中的systick,systick 部分內容屬於nvic控制部分,一共有4個暫存器,名稱和位址分別是 stk csr,0xe000e010 控制暫存器 stk load,0xe000e014 過載暫存器 s...