亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? accelerator_optimized_fft.c

?? 在cycloneII里實現對FFT的硬件加速
?? C
字號:
#include "accelerator_optimized_fft.h"
#include "pound_defines.h"
#include "system.h"
#include "alt_types.h"

void accelerator_optimized_fft(alt_16 * __restrict__ InData,  /* real part of input data */
                        alt_16 * __restrict__ OutData)        /* real part of output data */

{
  alt_u16   twiddle_index;
  alt_u16   twiddle_incr;
  alt_u16   loop_element;
  alt_u16   loop_element_div2;
  alt_u16   l;
  alt_u16   sub_stage_index;
  alt_u16   stage_index;
  alt_u16   butterfly_index;

  /* These restricted pointers make up the bulk of the avalon masters
   * in this system */
  /* Real data ping pong buffers */
  alt_16   * __restrict__ BufferedRealCalcDataRead;
  alt_16   * __restrict__ BufferedRealCalcDataReadPort2; 
  alt_16   * __restrict__ BufferedRealCalcDataWrite;
  alt_16   * __restrict__ BufferedRealCalcDataWritePort2;    
  /* Imaginary data ping pong buffers */
  alt_16   * __restrict__ BufferedImagCalcDataRead;
  alt_16   * __restrict__ BufferedImagCalcDataReadPort2;
  alt_16   * __restrict__ BufferedImagCalcDataWrite;
  alt_16   * __restrict__ BufferedImagCalcDataWritePort2;  
  /* Cosine and Sine Tables  */
  alt_16   * __restrict__ CosineTable;
  alt_16   * __restrict__ SineTable;
  /* Pointers to in and out buffers in main memory */
  alt_u32  * __restrict__ tempInputPtr = (alt_u32 *)InData;
  alt_u32  * __restrict__ tempOutputPtr = (alt_u32 *)OutData;

  /* Temporary registers for the input stage */
  alt_u16   bit_rev_index;
  alt_u32   tempInput;

  /* Registers for the calculation stage */
  alt_16   CosReal;
  alt_16   SinReal;
  alt_16   tRealData;
  alt_16   tImagData;
  alt_16   temp1, temp2, temp3, temp4;

  /* Counters for the input and output stages */
  alt_u16  inputCounter, outputCounter;
  
  /* Assign the ping ping buffers default address locations */
  BufferedRealCalcDataRead = BufferRAM1;
  BufferedRealCalcDataReadPort2 = BufferRAM1;  
  BufferedRealCalcDataWrite = BufferRAM2;
  BufferedRealCalcDataWritePort2 = BufferRAM2;
  
  BufferedImagCalcDataRead = BufferRAM3;
  BufferedImagCalcDataReadPort2 = BufferRAM3;  
  BufferedImagCalcDataWrite = BufferRAM4;
  BufferedImagCalcDataWritePort2 = BufferRAM4;                                                               
  
  /* Point the Cosine and Sine Tables to the CosRAM and SinRAM on-chip memory
   * buffers.  These memories are local to the accelerator and are not shared
   * with the Nios II processor. */                    
  CosineTable = CosRAM;
  SineTable = SinRAM;

  /* Data input buffering (Stage 1) */
  
  /* Calculate the bitreversal index and read
   * 32 bits of data from the input buffer in SDRAM (real and imaginary pair).
   * Split the data read into half and write them into real and imaginary
   * buffers concurrently */ 
  for (inputCounter = 0; inputCounter < NUM_POINTS; inputCounter++) {
    bit_rev_index = bitrev(inputCounter);  
     
    tempInput = tempInputPtr[inputCounter];    
	  BufferedRealCalcDataRead[bit_rev_index] = (alt_16)(tempInput & 0x0000FFFF); 
    BufferedImagCalcDataRead[bit_rev_index] = (alt_16)((tempInput & 0xFFFF0000)>>16); 
  }

  /* FFT Computation (Stage 2) */
  /* Step through the fft stages */
  for (stage_index = 1; stage_index <= FFT_SIZE; stage_index++) {
    loop_element = 1<<stage_index;
    loop_element_div2 = loop_element/2;

    /* Initialize twiddle factor lookup indicies */
    twiddle_index = 0;
    twiddle_incr = 1 << (FFT_SIZE-stage_index);

    /* Step through the butterflies */
    for(sub_stage_index = 0; sub_stage_index < loop_element_div2; sub_stage_index++) {

      /* Lookup twiddle factors */
      CosReal = CosineTable[twiddle_index];
      SinReal = SineTable[twiddle_index];

      /* Process butterflies with the same twiddle factors */
      for(butterfly_index = sub_stage_index; butterfly_index < NUM_POINTS; butterfly_index += loop_element) {
        l = butterfly_index + loop_element_div2;

        /* using temps (regs) to allow this to happen concurrently since
         * these are DP RAM accesses that do not overlap.  We are using read
         * pointers here so that the write pointers at the bottom can work in
         * parallel */
        temp1 = BufferedRealCalcDataRead[l];
        temp2 = BufferedImagCalcDataRead[l];
        temp3 = BufferedRealCalcDataReadPort2[butterfly_index];
        temp4 = BufferedImagCalcDataReadPort2[butterfly_index];
      
        /* Scale twiddle products to accomodate 16 bit storage */
        /* CosReal, SinReal, temp1, and temp2 are all registers so no
         * waiting occurs here (this happens concurrently) */
        tRealData = (( CosReal * temp1 ) + ( SinReal * temp2 ))>> PRESCALE;
        tImagData = (( CosReal * temp2 ) - ( SinReal * temp1 ))>> PRESCALE;

        /* tRealData, tImagData, temp3, temp4 are all registers so no
         * waiting occurs here (this happens concurrently).  We are using write
         * pointers here so that the read pointers at the top can work in
         * parallel */
        BufferedRealCalcDataWrite[l] = temp3 - tRealData;
        BufferedImagCalcDataWrite[l] = temp4 - tImagData;
        BufferedRealCalcDataWritePort2[butterfly_index] = temp3 + tRealData;
        BufferedImagCalcDataWritePort2[butterfly_index] = temp4 + tImagData;    
		            
      }
      twiddle_index += twiddle_incr;
    }
      /* Ping-Pong Buffering 
       * At the end of each iteration of the stage loop it is time to swap the
       * pin-pong buffers.  So for example we want the BufferedRealCalcRead  
       * buffer to point to the location in memory where BufferedRealCalcWrite
       * was stored on the previous pass.  We can do this with a straight 
       * assignment.  Then we need to have the BufferedRealCalcDataWrite buffer
       * point to the address in memory where BufferedRealCalcRead was stored 
       * on the previous pass.  We have already updated BufferedRealCalcRead to
       * point to BufferedRealCalcWrites address.  So to update 
       * BufferedRealCalcWrite we can take advantage of the facts that the buffers
       * are dual-ported and assign it to the location where 
       * BufferedRealCalcDataReadPort2 was pointing to on the previous pass.*/
       
      BufferedRealCalcDataRead = BufferedRealCalcDataWrite;
      BufferedRealCalcDataWrite = BufferedRealCalcDataReadPort2;
      BufferedRealCalcDataReadPort2 = BufferedRealCalcDataRead;
      BufferedRealCalcDataWritePort2 = BufferedRealCalcDataWrite;
      
      BufferedImagCalcDataRead = BufferedImagCalcDataWrite;
      BufferedImagCalcDataWrite = BufferedImagCalcDataReadPort2;
      BufferedImagCalcDataReadPort2 = BufferedImagCalcDataRead;
      BufferedImagCalcDataWritePort2 = BufferedImagCalcDataWrite;   
  }

  /* returning the interleaved results to sdram (Stage 3)
   * Since the data is 16 bit and interleaved we'll stick the real and
   * imaginary parts together and send them off to sdram */ 
  for(outputCounter = 0; outputCounter < NUM_POINTS; outputCounter++) {
    tempOutputPtr[outputCounter] = (((alt_u32)(BufferedImagCalcDataRead[outputCounter]) & 0x0000FFFF)<<16) | ((alt_u32)BufferedRealCalcDataRead[outputCounter] & 0x0000FFFF);
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女在线视频一区| 国产精品久久久久久久浪潮网站| 国产福利精品一区二区| 日韩电影免费在线看| 日日噜噜夜夜狠狠视频欧美人| 亚洲欧美一区二区三区极速播放 | 亚洲欧美综合色| 国产亚洲精久久久久久| 久久精品一区二区三区av| 久久精品一级爱片| 中文av字幕一区| 一区二区国产视频| 亚洲一区二区在线免费看| 亚洲综合久久久久| 美国三级日本三级久久99| 国产一区在线精品| 国产99久久久国产精品| 99久久国产综合精品色伊| 日本高清无吗v一区| 欧美挠脚心视频网站| 日韩视频一区在线观看| 国产视频在线观看一区二区三区 | 91丝袜美女网| 欧美一级高清片在线观看| 日韩欧美国产小视频| 欧美精彩视频一区二区三区| 亚洲欧美日韩小说| 日本中文字幕一区| 成人av电影在线| 欧美绝品在线观看成人午夜影视| 欧美精品一区二区三区在线| 中文字幕一区二区三区四区| 亚洲午夜精品网| 韩国三级中文字幕hd久久精品| 99久久久精品| 欧美大胆一级视频| 一区二区三区在线视频观看| 日韩av电影一区| 99v久久综合狠狠综合久久| 欧美一区午夜精品| 中文字幕一区二区三区在线不卡 | 日本特黄久久久高潮| 国产曰批免费观看久久久| 在线精品视频一区二区三四| 欧美电影免费观看高清完整版在线 | 青娱乐精品视频| 91在线精品一区二区三区| 日韩丝袜情趣美女图片| 亚洲综合视频在线| 高清成人免费视频| 欧美电影免费观看高清完整版在线| 一区二区三区在线免费播放| 国产jizzjizz一区二区| 日韩欧美国产一区二区在线播放| 亚洲乱码国产乱码精品精小说 | 极品少妇xxxx精品少妇| 在线观看三级视频欧美| 国产夜色精品一区二区av| 天天色 色综合| 91高清在线观看| 亚洲欧美欧美一区二区三区| 成人一区在线看| 久久久精品天堂| 国内成人免费视频| 欧美久久一区二区| 亚洲一区自拍偷拍| 色94色欧美sute亚洲线路一久| 欧美激情自拍偷拍| 国产+成+人+亚洲欧洲自线| 精品粉嫩超白一线天av| 日本麻豆一区二区三区视频| 欧美精品丝袜久久久中文字幕| 一区二区三区四区中文字幕| 北条麻妃一区二区三区| 中文字幕中文字幕在线一区| 国产成人免费视频网站高清观看视频| 日韩一区二区电影| 精品一区二区国语对白| 欧美精品一区二区三区视频| 久久精品二区亚洲w码| 在线91免费看| 久久精品国产99国产| 欧美一级片在线| 国产综合久久久久影院| 国产婷婷一区二区| 99久久精品免费看国产免费软件| 亚洲三级在线免费| 精品视频一区 二区 三区| 亚洲444eee在线观看| 日韩一区二区三区电影| 国产精品一区专区| 国产精品传媒在线| 欧美三级欧美一级| 久久精品国产**网站演员| 久久女同互慰一区二区三区| 高清成人免费视频| 一二三四社区欧美黄| 日韩一卡二卡三卡国产欧美| 国产精品一级片| 亚洲免费观看高清完整版在线观看 | 国产美女精品人人做人人爽| 久久久91精品国产一区二区精品| 不卡欧美aaaaa| 亚洲成人综合网站| 精品国精品国产| 91丨九色丨蝌蚪丨老版| 日本欧美在线观看| 国产精品久久免费看| 欧美日韩国产综合一区二区三区| 精品影视av免费| 亚洲男人的天堂在线观看| 日韩亚洲欧美一区二区三区| 不卡的av在线播放| 日韩精品久久久久久| 国产精品麻豆欧美日韩ww| 欧美日韩一区不卡| 成人一区二区视频| 日本不卡中文字幕| 国产精品美女久久久久久久久久久| 欧美中文字幕一区二区三区 | 亚洲女厕所小便bbb| 日韩一级二级三级精品视频| av在线不卡免费看| 久久不见久久见中文字幕免费| 最新热久久免费视频| 精品精品欲导航| 欧美性xxxxxx少妇| 成人免费视频视频在线观看免费| 日本午夜一本久久久综合| 一区二区三区成人| 国产精品三级av| 久久精品在线免费观看| 91精品国产综合久久久久久久久久 | 成人网男人的天堂| 精品在线一区二区三区| 五月天一区二区三区| 日韩一区日韩二区| 国产精品免费久久| 久久精品网站免费观看| 日韩一区二区电影| 欧美一区二区视频网站| 欧美视频一区在线| 色悠悠亚洲一区二区| 91视视频在线观看入口直接观看www | 国产乱码精品一品二品| 水蜜桃久久夜色精品一区的特点| 一区二区三区产品免费精品久久75| 欧美韩日一区二区三区四区| 精品理论电影在线观看| 欧美一级在线视频| 日韩欧美国产三级电影视频| 欧美日本韩国一区二区三区视频| 波多野结衣视频一区| 成人av在线播放网址| 成人av电影观看| 色欧美片视频在线观看| 色综合色狠狠综合色| 色综合婷婷久久| 欧洲亚洲国产日韩| 欧美人动与zoxxxx乱| 7777精品伊人久久久大香线蕉| 欧美女孩性生活视频| 欧美福利一区二区| 91精品国产综合久久久蜜臀图片| 91精品国产免费| 日韩免费视频线观看| 久久婷婷久久一区二区三区| 久久久久一区二区三区四区| 国产欧美一区二区三区鸳鸯浴| 中文一区二区在线观看| 亚洲欧美日韩久久精品| 亚洲国产精品久久不卡毛片| 视频在线观看国产精品| 久久99精品视频| 不卡在线观看av| 欧美色区777第一页| 精品久久久影院| 国产精品美女久久福利网站| 一区二区三区在线视频观看58| 婷婷久久综合九色国产成人| 蜜桃视频在线一区| 成人黄色在线网站| 欧美日韩一卡二卡三卡| 欧美videos大乳护士334| 国产精品国产三级国产aⅴ中文| 亚洲午夜日本在线观看| 韩国av一区二区三区在线观看| 成人国产一区二区三区精品| 欧美日韩一本到| 国产天堂亚洲国产碰碰| 亚洲成av人片一区二区| 国产精品99久久久久久宅男| 在线观看亚洲一区| 精品国产一区二区三区久久久蜜月| 国产精品久久久久影院色老大 | 久久夜色精品一区| 一区二区三区视频在线看| 久久精品国产99国产| 欧美丝袜第三区| 欧美国产欧美亚州国产日韩mv天天看完整|