ã¯ããã«
ééããªããããžã¿ã«ä¿¡å·åŠçã®äž»ãªåæããŒã«ã¯é«éããŒãªãšå€æïŒFFTïŒã§ãã ãã®ã¢ã«ãŽãªãºã ã¯ãç§åŠæè¡ã®ã»ãŒãã¹ãŠã®åéã§äœ¿çšãããŠããŸãã ããŒãªãšå€æã®æãåçŽãªç©ççãªäŸã¯ã人éã«ããé³ã®ç¥èŠã§ãã ç§ãã¡ãé³ãèããã³ã«ãè³ä»ã¯èªåçã«è€éãªèšç®ãå®è¡ããŸããããã¯ãæ°å¹Žã®æ°åŠã®åŠç¿åŸã«åããŠå®è¡ã§ããŸãã ãã®çŸè±¡ã®æ¬è³ªã¯ãèŽèŠåšå®ãããŸããŸãªé«ãã®é³ã®é£ç¶ããã©ãŠããã¹å€ã®ã¹ãã¯ãã«ã®åœ¢ã§é³ãè¡šããè³ãåãåã£ãæ å ±ãç¥èŠé³ã«å€ããããšã§ãã
ç¡ç·å·¥åŠã®åé¡ã§ã¯ãFFTã¢ã«ãŽãªãºã ã¯ç³ã¿èŸŒã¿ããã³ããžã¿ã«çžé¢åšã®èšèšã§äœ¿çšãããç»ååŠçããªãŒãã£ãªããã³ãããªæ©åšïŒã€ã³ã©ã€ã¶ãŒãã¹ãã¯ãã«ã¢ãã©ã€ã¶ãŒããã³ãŒããŒïŒã§äœ¿çšãããŸãã ããã«ãFFTã¡ãœããã¯ããã¹ãŠã®çš®é¡ã®æå·åããã³ããŒã¿å§çž®ã¢ã«ãŽãªãºã ïŒjpegãmpeg4ãmp3ïŒã®æ ¹åºã«ãããé·ãæ°åãæ±ãå Žåã«ã圹ç«ã¡ãŸãã FFTã¯ãœããŒã·ã¹ãã ã§æ°ŽäžèŠèãæœæ°ŽèŠãæ€åºããããã«äœ¿çšãããã¬ãŒããŒã·ã¹ãã ã§ã¯é床ãé£è¡æ¹åãã¿ãŒã²ãããŸã§ã®è·é¢ã«é¢ããæ å ±ãååŸããããã«äœ¿çšãããŸãã
MapleãMATLABãGNU OctaveãMathCADãMathematicaãªã©ãç§åŠç 究çšã«èšèšãããã»ãŒãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžã§ãããŸããŸãªFFTã¢ãžã¥ãŒã«ãå©çšã§ããŸãã å°é家ã¯ãããŒãªãšå€æã®ããã»ã¹ãç解ããå¿ èŠã«å¿ããŠåé¡ã解決ããããã«ãããé©åã«é©çšã§ããå¿ èŠããããŸãã
FFTã¢ã«ãŽãªãºã ã®æåã®ãœãããŠã§ã¢å®è£ ã¯ã20äžçŽåé ã®IBMã³ã³ãã¥ãŒã¿ãŒã»ã³ã¿ãŒã§ããžã§ã³ãã¥ãŒããŒã®ææ®ã®äžããžã§ã³ã¯ãŒãªãŒã«ãã£ãŠè¡ãããŸããã 1965幎ã«ã¯ãé«éããŒãªãšå€æã¢ã«ãŽãªãºã ã«é¢ããèšäºãå ¬éããŸããã ãã®æ¹æ³ã¯å€ãã®FFTã¢ã«ãŽãªãºã ã®åºç€ã圢æããéçºè ã®ååCooley-Tukeyã«ã¡ãªãã§åœåãããŸããã ãã以æ¥ãå®è¡ãããæäœã®æ°ãæžããããšãã«ã®ãŒã³ã¹ããšãªãœãŒã¹ãåæžãããªã©ãããŸããŸãªFFTã¡ãœãããšã¢ã«ãŽãªãºã ãéçºããã³èšè¿°ãããéåžžã«å€ãã®ç°ãªãåºçç©ãšã¢ãã°ã©ããçºè¡ãããŸããã ä»æ¥ãFFTã¯1ã€ã®ååã§ã¯ãªããããŒãªãšå€æããã°ããèšç®ããããã«èšèšãããå€æ°ã®ç°ãªãã¢ã«ãŽãªãºã ã®ååã§ãã
çè«
ãããžã¿ã«ä¿¡å·åŠçããªã©ãç¡ç·å·¥åŠéšã®ã³ãŒã¹ã®çè«ã«ã€ããŠã¯è©³ãã説æããŸããã 代ããã«ãçè«çãªç 究ãšãç¹å®ã®FFTã¢ã«ãŽãªãºã ã®å®è£ ã®å®çšçãªèšç®ãšæ©èœã®äž¡æ¹ã«ç²Ÿéã§ãããæãæçšãªãœãŒã¹ã®éžæãæäŸããŸãã
Habréã«é¢ããèšäºïŒ
- ããŒãªãšå€æã«é¢ããç°¡åãªèšèã§
- ããŒãªãšå€æã®å®çšå
- ããŒãªãšå€æã®åäœ...
- ããŒãªãšããžã¿ã«ç»ååŠç
- Matlabãšé«éããŒãªãšå€æ
- ä¿¡å·ã®ã¹ãã¯ãã«åæ
æžç±ïŒ
- E.S. EificherãBarry W. Dervisãããžã¿ã«ä¿¡å·åŠçã å®è·µçã¢ãããŒã
- Rabiner L.ãGold B.ãããžã¿ã«ä¿¡å·åŠçã®çè«ãšå¿çš
DSPLIBãŠã§ããµã€ãïŒ
ã¢ã«ãŽãªãºã
FFTããŒãã¯ãããŒã¹2ã®Kyuli-Tukiã¢ã«ãŽãªãºã ã«åŸã£ãŠäœæãããŸããããã®ãããªå®è£ ã®ãã¹ãŠã®èšç®ã¯ãåºæ¬çãªãã¿ãã©ã€æŒç®ã®ç¹°ãè¿ãå®è¡ã«åæžãããŸãã å€ææ¹æ³ã¯ãåšæ³¢æ°ãã·ã¡ãŒã·ã§ã³ïŒFFTã®å ŽåïŒããã³äžæãã·ã¡ãŒã·ã§ã³ïŒIFFTã®å ŽåïŒã䜿çšããã³ã³ãã¢ã¹ããŒã ã«åºã¥ããŠããŸãã ã¢ã«ãŽãªãºã ã¯äºé䞊ååã¹ããŒã ã䜿çšããŸãã ãã®ã¢ãããŒãã«ãããADCããã®è€éãªãµã³ãã«ã®é£ç¶ã¹ããªãŒã ãåŠçã§ãããã®ãµã³ããªã³ã°åšæ³¢æ°ã¯åŠçã®ã¯ããã¯åšæ³¢æ°ã®2åã§ãã ã€ãŸãã1ã¯ããã¯ãµã€ã¯ã«ã®ããã¿ãã©ã€ãFFTã¯ã2ã€ã®è€éãªãµã³ãã«ã®èšç®ãäžåºŠã«å®è¡ããŸãã 4åãŸãã¯8åã®äžŠååŠçã䜿çšããå ŽåãåŠçåšæ³¢æ°ã®4ã8åã®åšæ³¢æ°ã§ADCãŸãã¯ä»ã®ãœãŒã¹ããã®ããŒã¿ã¹ããªãŒã ãåŠçã§ããŸãã ãã®ãããªã¹ããŒã ã¯ãå€çžããŒãªãšå€æïŒå€çžFFTïŒã®åé¡ã§ãã䜿çšãããç¹ã«èå³æ·±ããã®ã§ãã
FPGAãããã«RAMBã¡ã¢ãªãä¿åããã«ã¯ãFFTã®ç¹å®ã®æ®µéïŒNFFT> 4096ãã€ã³ãïŒããéå§ããå転ä¿æ°ã®ç·åœ¢è£éã䜿çšããŸãïŒãã€ã©ãŒçŽæ°ã®1次å°é¢æ°ãžã®æ¡åŒµïŒã ããã«ãããä¿æ°ã®ã»ããå šäœãä¿åãã代ããã«ãä¿æ°ã®äžéšã®ã¿ã䜿çšããå ã®ã»ããããè¿äŒŒèšç®ã«ãã£ãŠæ®ããååŸã§ããŸãã DSP48ããªããã£ãã®ãªãœãŒã¹ãç ç²ã«ããããšã§ãRAMBãããã¯ã¡ã¢ãªã®ãªãœãŒã¹ãç¯çŽãããŸããããã¯ãFFTããŒãã«ãšã£ãŠãFPGAã®ããŒããŠã§ã¢å®è£ ã«ãããŠéèŠãªå Žæã§ãã ããã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
ãããã¯å³
å®çŸãããFFTããŒãã®æ§é ã§ã¯ã3ã€ã®æ©èœããŒããåºå¥ã§ããŸãïŒæŽæ°åããæµ®åå°æ°ç¹ä»ãã®ç¹å¥ãªåœ¢åŒãžã®ããŒã¿å€æãä¿¡å·ãµã³ãã«ãèšé²ããããã®å ¥åãããã¡ãŒãããã³ããŸããŸãªå®æããå°çšããŒããå«ãFFTã³ã¢ã
åæãããžã§ã¯ãã®æŠç¥å³ïŒ å ¥åãããã¡ãŒ+ FPã³ã³ããŒã¿ãŒ+ FFTã³ã¢
å¹çãé«ããããããã¹ãŠã®èšç®ã¯ç¹å¥ãª23ãããæµ®åå°æ°ç¹åœ¢åŒFP23ã§å®è¡ãããŸãã ããã¯ãFP18ããã³FP27ã¢ã«ãŽãªãºã ã®é²æ©çãªå®è£ ã§ãããããã«åºã¥ããŠãã¹ãŠã®ããžãã¯ãæ§ç¯ãããŸãã FP23圢åŒã®ç¹åŸŽã¯ãã¯ãŒãé·-23ããããä»®æ°-16ãææ°-6ãããã³ç¬Šå·-1ã§ããFP23圢åŒã¯ãFPGAã¢ãŒããã¯ãã£ã«ç¹ã«é©åããŠããããŠãããŒãµã«ããžã¿ã«åŠçãŠãããDSP48ãã¡ã¢ãªãããã¯ãªã©ã®æ°Žæ¶ãããã¯ã®åäœã®å éšæ©èœãèæ ®ããŠããŸãRAMB18ã æµ®åå°æ°ç¹åœ¢åŒã䜿çšãããšãæ¯å¹ ã«é¢ä¿ãªãADCããã®ä¿¡å·ãåŠçããããã®é«ç²ŸåºŠãæäŸãããèšç®ã®ããã深床ã«å¶éã®ããæŽæ°ããŒããŠã§ã¢ã³ã³ãã¥ãŒãã£ã³ã°ãåããã·ã¹ãã ã«å žåçãªããŒã¿ã®ã¹ã±ãŒãªã³ã°ã«ãããèšç®ãšã©ãŒãåé¿ãããŸãã ç§ã®åã®èšäºã§ããã«ã€ããŠèªãããšãã§ããŸãã
次ã®å³ã¯ãé·ãN = 2 ^ nã®ã·ãŒã±ã³ã¹ã®ãã€ãã©ã€ã³FFTèšç®ã¹ããŒã ã瀺ããŠããŸãã 次ã®ãã®ãå«ãŸããŸãã
- å ¥åãããã¡-FFTã®å ¥åã§ã®åæããŒã¿æºåãæäŸããŸãïŒå®è£ ãšäœ¿çšãããADCåè·¯ã«å¿ããŠãµã³ãã«ã®åé 眮ïŒã
- å転ä¿æ°ã®ãžã§ãã¬ãŒã¿ -æ£åŒŠæ³¢ãšäœåŒŠæ³¢ã®ãµã³ãã«ãä¿åããåæ£ã¡ã¢ãªãšãããã¯ã¡ã¢ãªã®ããŒãã
- ãã¿ãã©ã€ -FFTã³ã¢ã®åºæ¬æäœïŒåšæ³¢æ°ãšæéã®éåŒãïŒ
- é 延ç·ãšã¯ãã¹ - ã¹ã€ãã -åŠçãããé åã®èŠçŽ ã®ãè¶ãã®å ¥åãç®çã®ã€ã³ããã¯ã¹ã§æäŸããŸãã
FFTã³ã¢ã³ã³ãã€ãŒã¯ããã®å ¥åã®ããŒã¿ãèªç¶ãªé åºã§å°çããããã«æ§ç¯ãããFFTã®åºåã§ã¯ãããŒã¿ã¹ããªãŒã ãæŸé»éé ã§åœ¢æãããŸãã OBPFã®å Žåãå察ã¯çã§ããå ¥åããŒã¿ã¯ãã€ããªéé ã§ãåºåã¯èªç¶é ãŸãã¯åçš®é ã§ãã ããã¯ãå ¥åããŒã¿ãå³å¯ã«èªç¶ãªé åºã§ããå¿ èŠããããåºåããŒã¿ãæå¹ãªãªãã·ã§ã³ã«äŸåããã¶ã€ãªã³ã¯ã¹ã®æ¢è£œã«ãŒãã«ãšæ¯èŒããŠããã®FFTãšOBPFã®ãã³ãã«ã®äž»ãªå©ç¹ã§ãã
ãã€ããªéé ãšã¯äœã§ãããèªç¶é ããã©ã®ããã«å€åãããã¯ã次ã®å³ã§æ確ã«ç€ºãããŠããŸãïŒN = 8ãµã³ãã«ã®ã·ãŒã±ã³ã¹ã®å ŽåïŒã
å ¥åãããã¡
FPGAãããã®åæ£ã¡ã¢ãªãŸãã¯å éšã¡ã¢ãªäžã«æ§ç¯ãããŸãã ææ°ã®å®è£ ã§ã¯ãå ¥åã§Nåã®è€çŽ æ°ãµã³ãã«ãå°çããåºåã§N / 2åã®ãµã³ãã«ã®2ã€ã®ãã±ããã圢æãããæåã®ãã±ããã«ã¯ãµã³ãã«[0; N / 2 -1]ãããã³2çªç®ã®ãã±ãã[N / 2; N-1]ã å®éãå ¥åãããã¡ãŒã¯FFTããŒãã®ãŒãé 延ã©ã€ã³ã§ããããã®äžã§ãã©ã€ããªããŒã¿ã®äžŠã¹æ¿ããçºçããŸãã
ãããã¡ã¡ã¢ãªãŸãã¯é 延ã©ã€ã³ãå®è£ ããããã®VHDLã®ãœãŒã¹ã³ãŒãã¯éåžžã«åçŽã§ãæ¬è³ªçã«ãã¥ã¢ã«ããŒãã¡ã¢ãªãå®è¡ããŸãã
PR_RAMB: process(clk) is begin if (clk'event and clk = '1') then if (enb = '1') then ram_dout <= ram(conv_integer(addrb)); end if; if (ena = '1') then if (wea = '1') then ram(conv_integer(addra)) <= ram_din; end if; end if; end if; end process;
å転ä¿æ°ãžã§ãã¬ãŒã¿ãŒ
ãã¿ãã©ã€èšç®ã®å段éã§ã¯ãç°ãªãæ°ã®ä¿æ°ãå¿ èŠã§ãã ããšãã°ãæåã®ã¹ããŒãžã§ã¯1ã€ã®ä¿æ°ã®ã¿ãå¿ èŠã§ããã2çªç®ã®ã¹ããŒãž2ã§ã¯3çªç®ã®ä¿æ°ã4ãªã©ã§ãã 2ã®çŽ¯ä¹ã«æ¯äŸããŸãã ãã®ç¹ã«é¢ããŠãå転ä¿æ°ã¯ãæ£åŒŠæ³¢ãšäœåŒŠæ³¢ã®ãµã³ãã«ãä¿åããROMã¡ã¢ãªåœ¢åŒã®åæ£åïŒSLICEMïŒããã³å éšïŒRAMBïŒFPGAã¡ã¢ãªã«åºã¥ããŠå®è£ ãããŸãã çµæžçãªã¹ãã¬ãŒãžã®ããã«ãã¡ã¢ãªãªãœãŒã¹ãåæžããææ³ã䜿çšãããŸãã ããã¯ããµã€ã³ããã³ã³ãµã€ã³åšæã®4åã®1ã®å©ããåããŠãã¡ã¢ãªã¢ãã¬ã¹ã®ã«ãŠã³ãã®ç¬Šå·ãšæ¹åã䜿çšããæŒç®ã®ã¿ã䜿çšããŠãé«èª¿æ³¢ä¿¡å·ã®å šåšæãæ§ç¯ã§ãããšããäºå®ã«ãããŸãã å¿ èŠã«å¿ããŠãä¿æ°ã®8åã®1ã®ã¿ãä¿åã§ããæ®ãã®ã»ã¯ã·ã§ã³ã¯ãé«èª¿æ³¢ä¿¡å·ã®ããŒã¿ãœãŒã¹ãåãæ¿ããŠãã«ãŠã³ã¿ãŒã®æ¹åãå€æŽããããšã§ååŸã§ããŸãã çŸåšã®å®è£ ã§ã¯ãããã«ããããã©ãŒãã³ã¹ã¯åäžããããããã¯ã¡ã¢ãªã®ãªãœãŒã¹ããããã«ç¯çŽãããã¯ãªã¹ã¿ã«ã®å æè«çãªãœãŒã¹ã®éãå€§å¹ ã«å¢å ããŸãã
ã³ãµã€ã³ã®ã·ã§ãŒãã³ã°ã®äŸïŒ
- 第1ååæïŒã¢ãã¬ã¹ã«ãŠã³ã¿ãŒ+ 1ãcosã«ãŠã³ãã
- 第2ååæïŒ+1ã¢ãã¬ã¹ã«ãŠã³ã¿ãŒã-sinã«ãŠã³ãã
- 第3ååæïŒã¢ãã¬ã¹ã«ãŠã³ã¿ãŒ-1ããµã³ãã«-sinã
- 第4ååæïŒã¢ãã¬ã¹ã«ãŠã³ã¿ãŒ-1ãcosãµã³ãã«ã
ã¢ãã¬ã¹ããã³ããŒã¿ã«ãŠã³ã¿ãŒã®ãã«ããã¬ã¯ãµãŒã®åçŽãªããžãã¯ã«ãããFPGAã¡ã¢ãªã4åç¯çŽã§ããŸãã
ä¿æ°ã¯16ãããã®å®¹éãæã€æŽæ°åœ¢åŒã§ä¿åãããã¡ã¢ãªããæœåºãããåŸãFP23圢åŒã«å€æãããŸãã æŽæ°åœ¢åŒãšæµ®åå°æ°ç¹åœ¢åŒã®åè·¯ã®ããã©ãŒãã³ã¹è©äŸ¡ãå®æœããŸããã å®è·µã«ãããæåã®ãªãã·ã§ã³ã¯ã¯ãªã¹ã¿ã«ã¡ã¢ãªã1.5åç¯çŽããŸãããã³ã¢å šäœã®ããã©ãŒãã³ã¹ã¯ãŸã£ããäœäžãããäžéšã®æ®µéã§ã®ãã©ãŒãããå€æã®é 延ã®è¿œå ã«ãããããã€ãã®å©ç¹ïŒåšæ³¢æ°ã®ãã·ã¡ãŒã·ã§ã³ã䌎ããã¿ãã©ã€ã®ä¿æ°ã®èª¿æŽïŒãããããããããšã瀺ãããŠããŸãã
FFTã®é·ããçãå Žåã®å転ä¿æ°ã¯ãSLICEMã»ã«ã®åæ£FPGAã¡ã¢ãªã«ãç·å®¹é32ãããã®512åã®è€éãªãµã³ãã«ãä¿åããå¿ èŠããã段éãŸã§ä¿åãããŸãã FFTã®é·ããé·ãå ŽåãRAMB18ã¯ãªã¹ã¿ã«ãããã¯ã¡ã¢ãªã䜿çšããã1024ãã¢ã®ãµã³ãã«ãä¿åããã«ã¯ãRAMB18ãããã¯ã2ã€ã ã䜿çšããå¿ èŠããããŸããããã¯36 * 1K = 16 * 2 * 1K = 18K * 2ã«çžåœããŸãéšåçãªããŒã¿ã¹ãã¬ãŒãžã®ä»¥åã®æ¹æ³ãããã³Radix-2ã®äºé䞊åæ§ãèæ ®ããŠãããã«ããFFTé·NFFT = 4096ãµã³ãã«ãæäŸã§ããŸãã
NFFT> 4096ãµã³ãã«ã®FFTé·ã®å Žåãä¿æ°ã¯1次å°é¢æ°ãžã®ãã€ã©ãŒçŽæ°ã«æ¡åŒµãããããªãé«ã粟床ã§å転ä¿æ°ãèšç®ããFPGAã¡ã¢ãªãããã«ç¯çŽã§ããŸãã äžéšã®çè«èšç®ãçç¥ããèšç®ã®å®éã®æ©èœã«çŽæ¥é²ã¿ãŸãã
倧ããªNFFTå€ã®å Žåãå転ä¿æ°ã¯FPGAãããã¯ã¡ã¢ãªã«çŽæ¥ä¿åãããŸãããããã€ã©ãŒæ³ã䜿çšããèšç®ã«ãã£ãŠååŸãããŸãã åçŽåããã圢åŒã®å転ä¿æ°ã®å®æ°éšãšèæ°éšã®èšç®åŒã以äžã«ç€ºããŸãã
ãããã®åŒã§ã¯ïŒ
A wã¯å転ä¿æ°ã®æ¯å¹ ã§ãïŒååãšããŠãA w = 2 16 ïŒã
2 Nmax -FPGAãããã¯ã¡ã¢ãªã®äœ¿çšãå¶éããå転ä¿æ°ã®æ倧æ°ïŒçŸåšã®å®è£ ã§ã¯ã2 Nmax = 2048ãã€ãŸãNmax = 12ïŒã
kã¯ãçŸåšã®FFTã¹ããŒãžã§ã®ãã¹ãŠã®ä¿æ°å€ã®ã«ãŠã³ã¿ãŒã§ããk= 0 ... 2 Nmax âM-1
jã¯ãFFTã®çŸåšã®ã¹ããŒãžã§ã®ä¿æ°ã®äžéå€ã®ã«ãŠã³ã¿ãŒã§ããj= 0 ... M-1
M-èšç®ã®æ®µéã«äŸåããæ°ã¯ãM = 2 stageãšããŠå®çŸ©ãããŸããããã§ãstageã¯FFTã¹ããŒãžã®çªå·ã§ãã
Re k ãIm kã¯å転ä¿æ°ã®èšç®å€ã§ãã
ãã®å³ã¯ããã€ã©ãŒæ¹åŒã«ããä¿æ°èšç®ã®å®è£ ã®ç°¡ç¥å³ã瀺ããŠããŸãïŒã¡ã¢ãªããä¿æ°ãæœåºããããã«ã¢ãã¬ã¹ã«ãŠã³ã¿ãŒã䜿çšãããããŒã¿ã䜿çšããæ°åŠçæäœãè¡ãããŸãïŒ
å転ä¿æ°ã®èšç®ã¯æ°åŠæŒç®ã䜿çšããŠå®è¡ããããããã¯ã¡ã¢ãªããããŒã¿ãæœåºãããããä¿æ°ãä¿åããå段éã§ã¯ãªãœãŒã¹DSP48ããã³RAMB18ã䜿çšããŸãã æ瀺ãããèšç®åŒã§ã¯ã2ã€ã®é«èª¿æ³¢é¢æ°ã®ä¹ç®æŒç®ãš1ã€ã®DSP48ã®ãããã¯ã«çžåœããã«ãŠã³ã¿ãŒå€ã«ããä¹ç®æŒç®ã䜿çšããŠãã¢ã«ãŽãªãºã ãèšè¿°ãããŸããã
ã«ãŒãã«ã§Taylorã¹ããŒã ã䜿çšãããŠããªãå Žåã次ã®åã¹ããŒãžã§ãããã¯ã¡ã¢ãªã®ãªãœãŒã¹ã¯æ¬¡æ°2ã«æ¯äŸããŠå¢å ããŸãã4096ãµã³ãã«ã§ã¯ãââ4 RAMBããªããã£ãã8192ãµã³ãã«-8ããªããã£ããªã©ã«è²»ããããŸãã Taylorã¢ã«ãŽãªãºã ã䜿çšããå Žåããããã¯ã¡ã¢ãªããªããã£ãã®æ°ã¯åžžã«2ã«åºå®ããããŸãŸã§ãã
ãµã€ã³ä¿æ°ããã³ã³ãµã€ã³ä¿æ°ãäœæããããã®ã³ãŒãã¯ãVHDLé¢æ°ã«åºã¥ããŠæ§ç¯ãããŸãïŒMATHããã±ãŒãžã䜿çšããå¿ èŠããããŸãïŒã é¢æ°ãåæãããããŒã¿ãæŽæ°åœ¢åŒã®32ãããããŒã¿ãã¯ãã«ã«æ£åžžã«å€æãããŸãã
function rom_twiddle(xx : integer) return std_array_32xN is variable pi_new : real:=0.0; variable re_int : integer:=0; variable im_int : integer:=0; variable sc_int : std_array_32xN; begin for ii in 0 to 2**(xx-1)-1 loop pi_new := (real(ii) * MATH_PI)/(2.0**xx); re_int := INTEGER(32768.0*COS( pi_new)); im_int := INTEGER(32768.0*SIN(-pi_new)); sc_int(ii)(31 downto 16) := STD_LOGIC_VECTOR(CONV_SIGNED(im_int, 16)); sc_int(ii)(15 downto 00) := STD_LOGIC_VECTOR(CONV_SIGNED(re_int, 16)); end loop; return sc_int; end rom_twiddle;
æåæ¯ã®å®è£ ã®ããã®ãªãœãŒã¹ã®è¡šïŒ
ãã¿ãã©ã€
FFTããã³IFFTã®åãã¿ãã©ã€ã¯ã4ã€ã®ä¹ç®åšãš6ã€ã®å æžç®åšã䜿çšããè€éãªä¹ç®ãšå ç®/æžç®ã®æ©èœãå®çŸããŸãã æ瀺ãããæ©èœãããã¯ã®ãã¡ãä¹ç®åšã®ã¿ãDSP48ã»ã«ã1ã€ãã€äœ¿çšããŸãã ãããã£ãŠãFFTãã¿ãã©ã€ããšã«DSP48ããªããã£ãã¯4ã€ãããããŸããã åšæ³¢æ°ãšæéã®éåŒãã䌎ããã¿ãã©ã€ã®èšç®åŒã¯ãäžèšã®ãœãŒã¹ã«èšèŒãããŠããŸãã è¶ã¯éåžžã«ç°¡åã«å®çŸãããŸãã ãã¿ãã©ã€ã¯ãããã¯ã¡ã¢ãªã®ãªãœãŒã¹ãæ¶è²»ããŸããã ããã§ã®èœãšãç©Žã¯ã·ã³ãã«ã§ç®¡çãç°¡åã§ããããŒã¿ãèšç®ããå転ä¿æ°Wnãã¢ã³ããŒãããããã»ã¹ã§ãèšç®ã®é 延ãèæ ®ããå¿ èŠããããŸãã FFTãšIFFTã®å Žåããããã®é 延ã¯ç°ãªããŸãïŒ
é 延ç·
ã¯ãã¹ã¹ã€ãããšé 延ç·ã¯ãåFFTã¹ããŒãžã«å¿ èŠãªé åºã§ããŒã¿çœ®æãå®è£ ããŸãã é åã¢ã«ãŽãªãºã ã®æã詳现ãªèª¬æã¯ã Rabiner and Goldã®æ¬ã«èšèŒãããŠããŸãã åæ£ãŸãã¯ãããã¯FPGAã¡ã¢ãªã䜿çšããŸãã æ®å¿µãªãããããã«ã¯ã¡ã¢ãªãç¯çŽããããã®ããªãã¯ã¯ãããŸããã ããã¯æãæé©åã§ããªããããã¯ã§ããããã®ãŸãŸå®è£ ãããŸãã
äžè¬çãªé 延ç·ã®å®è£ ã®ããã®ãªãœãŒã¹ã®è¡šïŒ
NFFT = 16ã®å Žåã®ããŸããŸãªæ®µéã§ã®é 延ç·ã§ã®ãã€ããªé åã®ããã»ã¹ã瀺ãæ¬ããåçãåé€ã§ããããã«ããŸãã
C ++ã§ã¯ããã®ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ããã«å®è£ ãããŸãã
for (int cnt=1; cnt<stages+1; cnt++) { int CNT_ii = pow(2.0,(stFFT-cnt)); int CNT_jj = pow(2.0,(cnt-1)); for (int jj=0; jj<CNT_jj; jj++) { for (int ii=0; ii<CNT_ii; ii++) { int jN = ii+jj*(N_FFT/pow(2.0,cnt-1)); int iN = N_FFT/(pow(2.0,cnt)); int xx = jj*N_FFT/pow(2.0,cnt); // mix data // -------- A, B, WW, IND[A], IND[B], IND[W] -------- // ButterflyFP(Ax, Bx, CFW, jN, jN+iN, ii*CNT_jj); } } }
ãã¿ãã©ã€ã¯ãçªå·jNããã³jN + iNã®ãµã³ãã«Aããã³Bãåä¿¡ãã WWä¿æ°ã¯çªå·ii * CNT_jjã«ãªããŸãã ããã»ã¹ãå®å šã«ç解ããã«ã¯ãæ¬ã®ãã€ããªé åã¹ããŒã ãšäŸãèŠãŠãã ããã
ç·ãªãœãŒã¹
ãããªãã¢ã¯ã·ã§ã³ã¯éåžžã«ç°¡åã§ã-ãã¹ãŠã®ããŒãã¯ãããŸããŸãªæäœïŒè¶ã®æ°åŠãããŸããŸãªæ®µéã®ä¿æ°ã®ã¢ã³ããŒãïŒã®å®è¡ã®é 延ãèæ ®ããŠãäºãã«æ£ããæ¥ç¶ããå¿ èŠããããŸãã ãã¹ãŠãæ£ããè¡ãããå Žåãæçµçµæã§ã¯ãäœæ¥ã³ã¢ãå®æããŸãã
次ã®è¡šã¯ãFP23FFTK FFTã³ã¢ãšã¶ã€ãªã³ã¯ã¹FFTã³ã¢ïŒãªãã·ã§ã³ã®æµ®åå°æ°ç¹ãRadix-2ããã€ãã©ã€ã³ã¹ããªãŒãã³ã°I / OïŒã®ãªãœãŒã¹èšç®ã瀺ããŠããŸãã ã¶ã€ãªã³ã¯ã¹ã«ãŒãã«ã®è¡šã«ã¯ããããã¯ã¡ã¢ãªã®ãªãœãŒã¹ã®2ã€ã®åã瀺ãããŠããŸãïŒ ïŒ1ïŒ -ãã€ããªéããèªç¶ïŒ ãããå転åºåããŒã¿ ïŒã«é åºãå€æããã ïŒ2ïŒ -å€æããïŒ èªç¶åºåããŒã¿ ïŒã
è¡šãããããããã«ãFP23FFTKã³ã¢ã¯ãNFFT = 64Kã§2.5åå°ãªãDSP48ããªããã£ããå æããŸããããã¯ãäž»ã«ãåãæšãŠãããä»®æ°ãšææ°ãæã€ããŒã¿åœ¢åŒïŒFP23察FP32ïŒã«ãããã®ã§ãã ããã«ãã«ãŒãã«ã¯ã ããããªããŒã¹ãªãã·ã§ã³ã®ãããã¯ã¡ã¢ãªã³ã³ããŒãã³ãã2.5å ãã¶ã€ãªã³ã¯ã¹ã«ãŒãã«ã®ããã¥ã©ã«ãªãã·ã§ã³ã®4åã®1ããæ¶è²»ããŸããã ããã¯ãåãæšãŠãããããŒã¿åœ¢åŒã§æ£åœåã§ããŸããã1.5åããåŸãããŸããã æ®ãã®æ¹åã¯ãå転ä¿æ°ã®ã¹ãã¬ãŒãžæ©èœãšãã€ã©ãŒã¢ã«ãŽãªãºã ã®äœ¿çšã«é¢é£ããŠããŸãã
äŸïŒã¶ã€ãªã³ã¯ã¹FFTã³ã¢ã¯å ¥åããŒã¿ãèªç¶ãªé åºã§åä¿¡ããå¿ èŠããããŸãïŒ ã«ãŒãã«æ©èœïŒ ïŒããããã£ãŠãNFFT = 64Kã®ã¶ã€ãªã³ã¯ã¹ã³ã¢ã®FFT + IFFTãã³ãã«ã®å Žåãã1600ãããã¯ã¡ã¢ãªã»ã«ãå¿ èŠã§ãFP23FFTK圢åŒã®åããã³ãã«ã®å Žåã®ã¿ãã 400åã®RAMBã»ã«ãOBPFã®å ŽåãããŒã¿ãèªç¶ãªåœ¢ã«å€æããå¿ èŠã¯ãªããåºåã§ã¯ããŒã¿ã¯ãã§ã«èªç¶ãªé åºã«ãªã£ãŠããŸãã ãã®æ©èœã«ãããããã©ãŒãã³ã¹ãæãªãããšãªããå°ããªFPGAã¯ãªã¹ã¿ã«ã®é«éç³ã¿èŸŒã¿ã«ã³ã³ãã¯ããªå§çž®ãã£ã«ã¿ãŒïŒFFT + OBPFãã³ãã«ïŒãæ§ç¯ã§ããŸãïŒ
以äžã¯ãNFFT = 65536ãã€ã³ãã®FFTã³ã¢åæãã°ã§ãã
ã«ãŒãã«ããã©ãŒãã³ã¹
ããŒããŠã§ã¢ã®å¶éããããããVirtex-6ïŒXC6VSX315TïŒãšKintex-7ïŒXC7K325TïŒã®2ã€ã®ã¯ãªã¹ã¿ã«ã§ã®ã¿FFTã³ã¢ããã¹ãããŸããã
ã¶ã€ãªã³ã¯ã¹FPGA Virtex-6 SX315Tã®NFFT = 64Kãµã³ãã«ã§ã®FFT + IFFTã®æã§ã¯ãF dsp = 333 MHzã®åšæ³¢æ°ã§å®å®ãããã£ã«ã¿ãŒåäœãå®çŸã§ããŸããã ã¶ã€ãªã³ã¯ã¹FFTã³ã¢ããã®åšæ³¢æ°ã§åäœããŸãããã䜿çšããããªãœãŒã¹ã®éã¯å€§å¹ ã«å¢å ããŸããã
Kintex-7 FPGAã®å ŽåãNFFT = 8Kã§ç¬ç«ãããã£ã«ã¿ãŒãåããå®å®ãããã«ããã£ãã«åè·¯ãå®è£ ãããåŠçåšæ³¢æ°ãF dsp = 333 MHzã«çãããªããŸã ã
æ®å¿µãªããã333 MHzãè¶ ããåšæ³¢æ°ããã³ä»ã®ãã¡ããªã®FPGAã§ã¯ãããŒãã®åäœã¯ç¢ºèªãããŸããã§ããã
次ã®è¡šã¯ãããŸããŸãªFFTé·ã«ã€ããŠãã«ãŒãã«ã®å ¥åããåºåãŸã§ã®é 延æéïŒNFFTãµã³ãã«ã®é·ãã§ããŒã¹ããå®å šã«èšç®ïŒã瀺ããŠããŸãã è¡šãããããããã«ãã¶ã€ãªã³ã¯ã¹ã®çµæã¯æ®å¿µã§ãã FP23FFTKã«ãŒãã«ã䜿çšãããšãå®å šãªFFTèšç®ã®æéãçŽ2.5åççž®ã§ããŸãã ã ãŸããIPã¶ã€ãªã³ã¯ã¹ã§èªç¶é åºã§ã®å€æãæå¹ã«ãããšãå€ã¯ããã«å€§ãããªããŸãã
FPGAå®è£ äŸ
1. 4ãã£ãã«ã®ãã€ã¬ã¯ãFFTã FPGAïŒVirtex-6 SX315TïŒã1300 RAMBãã1400 DSP48ïŒã 4x FP23FFTKãNFFT = 16K
ãã®ä»ã®äŸ...
2. 8ã€ã®å§çž®ãã£ãã«ïŒFFT + OBPFïŒã FPGAïŒVirtex-6 SX315TïŒã1300 RAMBãã1400 DSP48ïŒã 16x FP23FFTKãNFFT = 16K
3. FFT + OBPF 64KïŒå€§ããªå§çž®ãã£ã«ã¿ãŒïŒã FPGAïŒXC7VX1140TFLG-2ïŒã3700 RAMBãã3600 DSP48ïŒã
4. ã©ã³ãã FFTé ç·ã®å³ ïŒè¶ã«äŒŒãŠããŸãïŒïŒ
3. FFT + OBPF 64KïŒå€§ããªå§çž®ãã£ã«ã¿ãŒïŒã FPGAïŒXC7VX1140TFLG-2ïŒã3700 RAMBãã3600 DSP48ïŒã
4. ã©ã³ãã FFTé ç·ã®å³ ïŒè¶ã«äŒŒãŠããŸãïŒïŒ
ã«ãŒãã«ãã§ãã¯
FPGAã§ã®æµ®åå°æ°ç¹åœ¢åŒã®FFTã«ãŒãã«ã®éçºãšãããã°ã«ã¯ãããŸããŸãªéçºããŒã«ã䜿çšãããŸããã
AïŒ FFTã³ã¢ã®RTLã¢ãã«ã®ãã¹ãã¯ãXilinx Vivado CADããã³Aldec Active-HDL CADã䜿çšããŠå®è¡ãããŸããã Vivadoã®é«ãããã©ãŒãã³ã¹ã«ãããããããããã€ãã®æ¬ ç¹ãããããã®1ã€ã¯ã³ãŒãç·šéããŒã«ã®äœãã§ãã 補åã¯çµ¶ããé²åããŠããããã§ãããããã€ãã®äŸ¿å©ãªã¬ãžã§ããããŸã ããã°ã©ã ã«ãªãããããœãŒã¹ã³ãŒãã¯ã¡ã¢åž³++ã§èšè¿°ãããVHDL / Verilogãã¡ã€ã«ã§åäœããããã«æ§æãããŠããŸãã Vivadoãšã¯ç°ãªããActive-HDLã¢ãã«ã¯ã¯ããã«é«éã§ãããã¢ããªã±ãŒã·ã§ã³ã®çµäºåŸã«ã¿ã€ã ãã£ãŒããä¿åããããšãã§ããŸãã Modelsimã¯ãã©ã€ã»ã³ã¹ããªãããäœæ¥äžã«äœ¿çšãããŸããã§ãã:)
BïŒ FFTã«ãŒãã«ã®ããã°ã©ã ã¢ãã«ã®ãã¹ãã¯ãMicrosoft Visual Studioã§å®è¡ãããRTLã¢ãã«ãç¹°ãè¿ãC ++ã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ãé 延ãšã¯ããã¯åšæ³¢æ°ã䜿çšãããèšèšã®ããŸããŸãªæ®µéïŒå転ä¿æ°ã®ãžã§ãã¬ãŒã¿ãŒïŒã§è¿ éãã€å¹ççã«ãããã°ã§ããããã«ãªããŸãããé ååãæ¿ãããŒããæ°åŠæŒç®ãTaylorã¢ã«ãŽãªãºã ã®å®è£ ãå®å šãªå®å šãªFFTã³ã¢ïŒã
CïŒ Matlab / GNU Octaveã§å®å šãªãã¹ããå®æœãããŸããã ãããã°çšã«ããŸããŸãªãã¹ãä¿¡å·ãå«ãã¹ã¯ãªãããäœæãããŸããããåå·®ãæ¯å¹ ããªãã»ãããããã³ãã®ä»ã®ãã©ã¡ãŒã¿ãŒã®ããŸããŸãªèšå®ãæã€æãåçŽãªLFMä¿¡å·ã¯ãèŠèŠã¢ããªã³ã°ã«æé©ã§ããããšãããããŸããã é«èª¿æ³¢ä¿¡å·ãšã¯å¯Ÿç §çã«ãã¹ãã¯ãã«å šäœã§FFTã®åäœã確èªã§ããŸãã æ£åŒŠæ³¢ä¿¡å·ã§ãã¹ããããšããã©ããã«äœåºŠãèœã¡ãŠããŸãããã£ãŒãä¿¡å·ã䜿çšã§ããªããªããŸããã ç¹å®ã®åšæ³¢æ°ã®æ£åŒŠæ³¢ä¿¡å·ãFFTã®å ¥åã«é©çšãããšãåºåã§ã¯ç®çã®åšæ³¢æ°ã§è¯å¥œãªé«èª¿æ³¢ãåŸãããŸãããå ¥åæ£åŒŠæ³¢ã®åšæãå€æŽãããšããã«ãšã©ãŒãçºçããŸããã RTLã³ãŒãã®ãããã°äžã«ãããã®ãšã©ãŒã®æ§è³ªã远跡ããããšã¯å®¹æã§ã¯ãããŸããã§ããããçããèŠã€ããŸããïŒèšç®ã®ããã€ãã®æ®µéã§ã®è¶ãšå転ä¿æ°ã®ããŒãã®äžæ£ç¢ºãªé 延ã LFMä¿¡å·ã䜿çšããããšã§ãã®åé¡ã解æ¶ãããFFTèšç®ã®å段éã§æ£ããé 延ãéžæã§ããããã«ãªããŸããã ãŸããmã¹ã¯ãªããã䜿çšããŠãC ++ã¢ãã«ãšRTLã¢ãã«ã®åäœãæ¯èŒããFP23æµ®åå°æ°ç¹åœ¢åŒãšfloat / double圢åŒã®èšç®ã®éãã確èªããŸããã
ãã¹ãã¢ã«ãŽãªãºã
ãã®ããã»ã¹ã¯ããæ¥åžžçã«æãããããããŸãããããã¹ãŠã®FFTããŒãã®æ£ããåäœãå®çŸããããšãã§ããã®ã¯ããã®é åºã§ããã ãããããããžã§ã¯ãã§ã«ãŒãã«ã䜿çšããå Žåã«åœ¹ç«ã¡ãŸãã
1. Matlab / Octaveã¹ã¯ãªãããå®è¡ããŠãåºæºä¿¡å·ãäœæããŸãã 次ã®å€æ°ãå¶åŸ¡ã§ããŸãã
- NFFT-FFT / OBPFã®é·ããå€æãã€ã³ãã®æ°ã
- Asig-å ¥åä¿¡å·ã®æ¯å¹ ïŒ0-32767ïŒã
- Fsig-å ¥åä¿¡å·åšæ³¢æ°ã
- F0-ãã£ãŒãã®åæåšæ³¢æ°ïŒä¿¡å·äœçžïŒã
- Fm-LFMä¿¡å·ã®ãšã³ãããŒãåšæ³¢æ°ïŒéç©åœ¢ãšã³ãããŒãã®å ŽåïŒã
ãã®çµæãC ++ããã³RTLã¢ãã«ã§äœ¿çšããã2ã€ã®ãã¡ã€ã«ãïŒå®ã³ã³ããŒãã³ããšèã³ã³ããŒãã³ãçšã«ïŒäœæãããŸãã
2. Microsoft Visual Studioã§ãããžã§ã¯ããäœæããé©åãªãã£ã¬ã¯ããªã§C ++ã®ãœãŒã¹ã³ãŒããååŸããŸãã
3.ãããžã§ã¯ãããã«ãããŠå®è¡ããŸãã hãã¡ã€ã«ã§æ¬¡ã®å€æ°ãèšå®ã§ããŸãã
- NFFT-FFT / IFFTã®é·ãïŒãã©ã°ã©ã1ã®éžæã«äŸåïŒã
- SCALEã¯ãFP23圢åŒããINT16圢åŒã«ããŒã¿ãå€æããåŸã®æ°å€ã®ç¯å²ã決å®ããã¹ã±ãŒãªã³ã°ä¿æ°ã§ãã å€ã®ç¯å²ã¯0ã0x3Fã§ãã
- _TAYïŒ0/1ïŒ-ãã€ã©ãŒã¢ã«ãŽãªãºã ã«ããä¿æ°èšç®ã®äœ¿çšïŒNFFT> 4096ã®å ŽåïŒã
4. VivadoãŸãã¯Active-HDLç°å¢ã§HDLãããžã§ã¯ããäœæããVHDLã§ãœãŒã¹ãã¡ã€ã«ãååŸããŸãã
5.ãã¹ããã³ããã£ã¬ã¯ããªã®ãã¡ã€ã«ã䜿çšããŠã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ããŸãã ãã®ãã¡ã€ã«ã§æ¬¡ã®ãªãã·ã§ã³ãèšå®ã§ããŸãã
- NFFT-FFT / IFFTã®é·ãïŒãã©ã°ã©ã1ã®éžæã«äŸåïŒã
- SCALEã¯ãFP23圢åŒããINT16圢åŒã«ããŒã¿ãå€æããåŸã®æ°å€ã®ç¯å²ã決å®ããã¹ã±ãŒãªã³ã°ä¿æ°ã§ãã å€ã®ç¯å²ã¯0ã0x3Fã§ãã
- USE_SCALEïŒTRUE / FALSEïŒ-ãã€ã©ãŒã¢ã«ãŽãªãºã ã«ããä¿æ°ã®èšç®ãŸãã¯ä¿æ°ã®èšç®ãçŽæ¥äœ¿çšããŸãïŒNFFT> 4096ã®å ŽåïŒã å¥3ããã®_TAYå€æ°ã®æ»ãå€ã
- USE_FLY_FFTïŒTRUE / FALSEïŒ-FFTã³ã¢ã§ã®è¶ã®äœ¿çšã ãããã°ã®ããã«ããã®ãªãã·ã§ã³ã¯ãã®ãŸãŸã§ãå®éçãªå©ç¹ã¯ãããŸããã
- USE_FLY_IFFTïŒTRUE / FALSEïŒ-OBPFã®ã³ã¢ã§ã®è¶ã®äœ¿çšã
6. mã¹ã¯ãªããïŒé ç®1ããïŒãåå®è¡ããŠãFFTããã³OBPFã®C ++ / RTLã«ãŒãã«ã®åäœã確èªããŸãã
ãããã®éæ³ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããšãå ¥åä¿¡å·ã®ã°ã©ããšãFFTããã³OBPFããŒããééããä¿¡å·ã®ã°ã©ããç»é¢ã«åæ ãããŸãã 1ã€ã®FFTããŒãã®ã¿ããã¹ãããã«ã¯ãmathãã£ã¬ã¯ããªããå¥ã®mã¹ã¯ãªãããååŸããŠããœãŒã¹ãã¡ã€ã«ã«ããã€ãã®å€æŽãå ããå¿ èŠããããŸãã
C ++ããã³RTLã¢ãã«ã®èŠèŠçæ€èšŒïŒFFT + OBPFãã³ãã«ïŒïŒ
FFTã³ã¢ã®ãã¹ãçµæ
ãã¯ã€ããã€ãºãå«ããã€ãºä¿¡å·ã®ãã¹ãïŒVivadoã®ã¢ãã«ïŒ
FFTå ¥åïŒ
å¥ã®ãã¹ãäŸïŒå ¥åããã³FFTçµæïŒïŒ
Kintex-7 FPGAã§ã®ããŒããŠã§ã¢ã§ã®ãã¹ãïŒChipScopeã§ã®ãããã°ïŒïŒ
ãã£ã«ã¿ãŒæäœ-å§çž®LFMã€ã³ãã«ã¹ïŒãœãŒã¹ã³ãŒãã«å§çž®ãã£ã«ã¿ãŒã®å®è£ ã¯ãããŸããïŒïŒ
FFTå ¥åïŒ
å¥ã®ãã¹ãäŸïŒå ¥åããã³FFTçµæïŒïŒ
Kintex-7 FPGAã§ã®ããŒããŠã§ã¢ã§ã®ãã¹ãïŒChipScopeã§ã®ãããã°ïŒïŒ
ãã£ã«ã¿ãŒæäœ-å§çž®LFMã€ã³ãã«ã¹ïŒãœãŒã¹ã³ãŒãã«å§çž®ãã£ã«ã¿ãŒã®å®è£ ã¯ãããŸããïŒïŒ
FFT FP23FFTKã³ã¢æ©èœ
- ã¶ã€ãªã³ã¯ã¹ã®ã²ãŒãããã³ããªããã£ãã®ã¬ãã«ã§ã®å®è£ ã
- èšè¿°èšèª-VHDLã
- NFFTå€æé·= 8-256Kãã€ã³ãã
- NFFTå€æé·ã®æè»ãªèª¿æŽã
- ç¹æ®ãªæµ®åå°æ°ç¹æ°åœ¢åŒFP23ïŒ16ãããä»®æ°ïŒã
- åºå®å°æ°ç¹åœ¢åŒã«å€æãããšãã®åºåã®ã¹ã±ãŒãªã³ã°ã
- ãã€ã©ãŒçŽæ°ã®1次å°é¢æ°ãžã®å±éã«ããå転ä¿æ°ã®ã³ã³ãã¯ããªã¹ãã¬ãŒãžã
- åæ£ã¡ã¢ãªããã³ãããã¯ã¡ã¢ãªã§ã®ä¿æ°ã®æéã®1/4ã®ã¹ãã¬ãŒãžã
- FFTã®ãã¿ãã©ã€-æéã®ãã·ã¡ãŒã·ã§ã³ãIFFTã®ãã¿ãã©ã€ã
- FFTïŒå ¥åã®ããŒã¿-çŽæ¥é ãåºåã®ãã€ããªéé ã
- OBPFïŒå ¥åã§ã®ããŒã¿ããã€ããªéé ã§ãåºåã§-çŽæ¥ã
- äºé䞊ååŠçãåããã³ã³ãã¢åŠçåè·¯ã åºæ°2
- ããŒã¿ã®æå°ããŒã¹ãã¯ãé£ç¶ã¢ãŒããŸãã¯ãããã¯ã¢ãŒãã®NFFTãµã³ãã«ã«çãããªããŸãã
- é«éã³ã³ãã¥ãŒãã£ã³ã°ãšå°éã®ãªãœãŒã¹ã
- æ¢åã®ã³ã¢ãšæ¯èŒããŠãå®å šãªèšç®ã®å€§å¹ ã«çãé 延æéã
- ææ°ã®FPGAïŒVirtex-6ã7ã·ãªãŒãºãUltrascaleïŒã§ã®å®è£
- FFT + OBPFãã³ãã«ã®é«äŸ¡ãªããããªããŒã¹æäœã¯äžèŠ
- ãªãŒãã³ãœãŒã¹ã
ãœãŒã¹ã³ãŒã
VHDLäžã®FFT FP23FFTK FHDã«ãŒãã«ã®ãã¹ãŠã®ãœãŒã¹ïŒFP23圢åŒã®åºæ¬æäœãå«ãïŒãC ++ã§ã®ãã§ãã¯çšã¢ãã«ãããã³Matlab / Octaveã®mã¹ã¯ãªããã¯ãgithubã®ãããã¡ã€ã«ã§å©çšã§ããŸãã
ä»åŸã®èšç»
ãã¡ããããããžã§ã¯ãã®éçºã¯ããã§çµããã§ã¯ãããŸããã ç§ã®èšç»ã§ã¯ããã§ã«äœæãããã¢ãã«ã«åºã¥ããŠã次ã®ãããªå€ãã®èå³æ·±ãæ°ããããšãå®è¡ã§ããŸãã
- 倧ããªFFTé·ã®èšç®ã®ç²ŸåºŠãé«ããã«ã¯ãFPGAæ©èœãèæ ®ããŠFP32圢åŒïŒIEEE-754ãšåæ§ïŒãå®è£ ããŸããä»®æ°é·ã¯25ãããã§ãã
- FP32圢åŒã®FFTããã³IFFTããŒããNFFTé·= 256K以äžãäŸãšããŠå§çž®ãã£ã«ã¿ãŒã䜿çšã
- Radix-4ãRadix-8ã¹ããŒã ã«ããå€çžFFTãããã«ããããã€ãã©ã€ã³ã¢ãŒãã§ADCããã®ããŒã¿ã¹ããªãŒã ãéåžžã«é«ãåšæ³¢æ°ã§åŠçã§ããŸãã
- NFFT = 1M-256Mãã€ã³ãã®å€éšã¡ã¢ãªã䜿çšããè¶ é·FFTã¹ããŒã ïŒ2D-FFTã«åºã¥ãïŒã
-
SystemVerilogã®ãœãŒã¹ãæžãæããŸããå¿ èŠã§ããïŒ
ãããã«
å®è£ ããã»ã¹ã§ã¯ãéåžžã«å°ãªããªãœãŒã¹ã§é«ãããã©ãŒãã³ã¹ãæäŸããé«æ§èœã³ã¢ãååŸã§ããŸãããã¶ã€ãªã³ã¯ã¹ã³ã¢ãšæ¯èŒããŠãFP23FFTK ã¯ãªãœãŒã¹ãå šäœçãªã¬ã€ãã³ã·ãããã³ããããæ倧ããŒã¿åŠçé »åºŠã®ç¹ã§åã¡ãŸããããã«ãFP23FFTKãããžã§ã¯ãã®FFTã³ã¢ãšOBPFã³ã¢ã®ãã³ãã«ã¯èªç¶ãªé åºã§ã®å€æãå¿ èŠãšãããæ倧å€æé·ã¯FPGAãªãœãŒã¹ã«ãã£ãŠã®ã¿å¶éãããŸãïŒ
ç§ã¯ãããŒããŠã§ã¢ãšãã®ãããžã§ã¯ãã®å®å šãªå®è£ ã§å®å®ããçµæãåŸãããã«æ°å¹Žãè²»ãããŸãããïŒæ®å¿µãªãããçŽç²ãªæéã¯ã«ãŠã³ãããŸããã§ããïŒããã®ãããžã§ã¯ãã¯ããã£ãããã¹ã¿ãŒããå€æ¹ãé±æ«ã«äœæãããå®æçã«æŸæ£ãããããŸããŸãªããŒããžã®ã¢ãããŒããéšåçãŸãã¯å®å šã«å€æŽãããŸãããå€ãã®å Žåãäžéšã®ã¢ã€ãã¢ã¯æšãŠããããã匷ãæãåºãããããæã«ã¯çŽç²ã«å¶ç¶ã«éãããããŸãããã®ä»äºã®éçšã§ç§ãããäž»ãªçµè«ã®1ã€ã¯ãç¬ç«ããæ段ã«ããèšèšã®å段éã®åŸ¹åºçãªãã§ãã¯ã®å¿ èŠæ§ã§ããããšãã°ãC ++ã¢ãã«ããªããšãå®è£ ããŸã£ããé²ããããšãã§ããªãå Žåããã£ããããããŒãã®äžè¬çãªãã¹ãã®åã«ãå€ãã®å°ããªãã¹ããäœæããåéšåãåå¥ã«ãããã°ããå¿ èŠããããŸããã
ãã®ã«ãŒãã«ãDSPã®ã¿ã¹ã¯ã§èª°ããå©ãããããžã§ã¯ãã§ã¢ããªã±ãŒã·ã§ã³ãèŠã€ããããšãé¡ã£ãŠããŸããç§ã¯åŸ®åŠã«ããã€ãã®ç¹ãçç¥ãããããã«çŠç¹ãåãããŸããã§ããïŒç©åå€æ誀差ã®èšç®ãFP23圢åŒã§ã®éååãã€ãºãªã©ïŒãç§ã¯åžžã«dsmv2014ã«æè¬ããŸããdsmv2014ã¯ãç§ã®ã¢ã€ãã¢ãåžžã«æè¿ããFPGAã§ã®ããžã¿ã«ä¿¡å·åŠçã®ããŸããŸãªã¿ã¹ã¯ã®å®è£ ã«å¯Ÿããåéºçãªåãçµã¿ãç©æ¥µçã«åãå ¥ããŸããã
ãæž èŽããããšãããããŸããïŒ