(57)【要約】【課題】仕様に応じてＦＦＴポイント数を変更してＦＦＴ演算を実行することが可能なプロセッサを提供する。【解決手段】  回転因子生成命令に応答して、データメモリに格納された、複数のステージでのバタフライ演算により実現されるＦＦＴの最終ステージに係る回転因子データを基に、残りのステージに係るステージ毎の回転因子データを生成してメモリへ書き込み、データメモリから入力されるデータ及び回転因子データに基づいてＦＦＴのバタフライ演算を実行し、演算結果のデータをデータメモリへ書き込むようにして、仕様に応じてＦＦＴポイント数を変更しながらＦＦＴ演算を実行できるようにする。【選択図】図１
2016139394.tif 000002
【特許請求の範囲】
【請求項１】
高速フーリエ変換のための複数のステージでのバタフライ演算に用いる回転因子データを格納するメモリから入力されるデータ及び前記回転因子データに基づいて前記高速フーリエ変換における前記バタフライ演算を実行し、演算結果のデータを前記メモリへ書き込む第１の演算処理部と、
回転因子生成命令に応答して、前記メモリに格納された前記高速フーリエ変換の最終ステージに係る前記回転因子データを基に、前記最終ステージまでの他のステージに係るステージ毎の前記回転因子データを生成して前記メモリへ書き込む第２の演算処理部とを有することを特徴とするプロセッサ。
【請求項２】
前記第１の演算処理部は、前記演算結果のデータを内部レジスタに格納することなく前記メモリへ書き込み、
前記第２の演算処理部は、生成した前記回転因子データを内部レジスタに格納することなく前記メモリへ書き込むことを特徴とする請求項１記載のプロセッサ。
【請求項３】
前記第２の演算処理部は、後段のステージに係る前記回転因子データの一部を選択して抽出し前段のステージに係る前記回転因子データとすることを特徴とする請求項１又は２記載のプロセッサ。
【請求項４】
前記プロセッサは、実行する複数のプログラムを切り替える度に、実行を開始する前記プログラムにおいて使用する前記高速フーリエ変換のステージに応じた前記回転因子データを前記第２の演算処理部に生成させることを特徴とする請求項１〜３の何れか１項に記載のプロセッサ。
【請求項５】
前記プロセッサは、実行する複数のプログラムの全体において使用する前記高速フーリエ変換のステージに応じた前記回転因子データを、前記プログラム全体の実行開始時に前記第２の演算処理部に生成させることを特徴とする請求項１〜３の何れか１項に記載のプロセッサ。
【請求項６】
前記第２の演算処理部は、前記後段のステージに係る前記回転因子データを一定の間隔で間引いて前記前段のステージに係る前記回転因子データを生成することを特徴とする請求項３記載のプロセッサ。
【請求項７】
前記第２の演算処理部は、第（ｉ＋１）番目（ｉは自然数）のステージに係る前記回転因子データを１つおきに抽出し第ｉ番目のステージに係る前記回転因子データを生成することを特徴とする請求項３記載のプロセッサ。
【請求項８】
前記第２の演算処理部により生成した前記回転因子データの前記メモリへの書き込み領域を前記ステージ毎に設定することを特徴とする請求項１〜７の何れか１項に記載のプロセッサ。
【請求項９】
命令によって与えられる前記高速フーリエ変換のポイント数に基づいて、前記高速フーリエ変換の最終ステージに係る前記回転因子データを生成して前記メモリに書き込む第３の演算処理部を有することを特徴とする請求項１〜８の何れか１項に記載のプロセッサ。
【請求項１０】
前記第３の演算処理部は、前記命令のオペランドから取得される前記高速フーリエ変換のポイント数と前記ポイント数で３６０°を分割した角度の関数値とを受け、前記関数値及び生成した前記回転因子データを用いた演算を行うことによって前記高速フーリエ変換の最終ステージに係る前記回転因子データのうちの別の前記回転因子データを生成することを特徴とする請求項９記載のプロセッサ。
【請求項１１】
前記第３の演算処理部は、生成した前記回転因子データを内部レジスタに格納することなく前記メモリへ書き込むことを特徴とする請求項９又は１０記載のプロセッサ。
【請求項１２】
前記回転因子データを格納する前記メモリを有することを特徴とする請求項１〜１１の何れか１項に記載のプロセッサ。
【請求項１３】
高速フーリエ変換のための複数のステージでのバタフライ演算に用いる回転因子データを格納するメモリと、
前記メモリから入力されるデータ及び前記回転因子データに基づいて前記高速フーリエ変換における前記バタフライ演算を実行し、演算結果のデータを前記メモリへ書き込む第１の演算処理部、及び回転因子生成命令に応答して、前記メモリに格納された前記高速フーリエ変換の最終ステージに係る前記回転因子データを基に、前記最終ステージまでの他のステージに係るステージ毎の前記回転因子データを生成して前記メモリへ書き込む第２の演算処理部を有するプロセッサとを有することを特徴とするプロセッサシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサ及びプロセッサシステムに関する。
【背景技術】
【０００２】
汎用的なプロセッサは、メモリからデータを読み出してプロセッサ内部のレジスタへ書き込み、レジスタからデータを読み出して演算し演算結果のデータをレジスタへ書き込む。そして、最後の演算結果のデータをメモリへ書き込む。このように汎用プロセッサは、メモリとの間で読み書きするデータ等を含む演算処理に係るデータを内部レジスタへ読み書きし、レジスタと演算部との間で処理を実行する。
【０００３】
無線通信におけるベースバンド信号処理などでは大量の行列演算処理やベクトル演算処理が必要となっており、その処理を汎用プロセッサで実行しようとすると、プロセッサ内部のレジスタが大量に必要となる。行列演算処理やベクトル演算処理のように大量のデータに同様の演算処理を施す場合、メモリに対してデータを直接に読み書きして演算処理を行うストリーム型のアーキテクチャが適している。
【０００４】
内部レジスタを介さずに、データをメモリから読み出して演算し、演算結果のデータをメモリへ書き込むという一連の処理動作を複数のサイクルにわたって行い、これを１命令として実行するプロセッサ（メモリｔｏメモリ型プロセッサ）がある。また、ＳＩＭＤ（Single Instruction Multiple Data）方式のように、１サイクルあたり１データでなく複数データを処理し、演算の並列度を上げることが一般的に行われている。
【０００５】
図１７は、内部レジスタを介さずに、データをメモリから読み出して演算し、演算結果のデータをメモリへ書き込むプロセッサ（メモリｔｏメモリ型プロセッサ）の構成例を示す図である。図１７には、３入力２出力（３ソース（source）−２デスティネーション（destination））の命令処理部１７０１を有するプロセッサを示している。
【０００６】
データメモリ１７０８から読み出した入力データＳＲＣ０、ＳＲＣ１、ＳＲＣ２が、プロセッサの命令処理部１７０１において、ＦＩＦＯ（First-In First-Out）バッファ１７０４及び入力バッファ１７０５を介して演算部１７０２に入力される。演算部１７０２は、制御部１７０３の制御に従って入力データＳＲＣ０、ＳＲＣ１、ＳＲＣ２による演算を行い、その演算結果の出力データＤＳＴ０、ＤＳＴ１を、出力バッファ１７０６及びＦＩＦＯバッファ１７０７を介してデータメモリ１７０８へ書き込む。
【０００７】
制御部１７０３は、命令メモリ１７０９から命令を読み出し、その命令に応じて演算部１７０２を制御する。データメモリ１７０８は、命令処理部１７０１での演算処理に係るデータ等を記憶する。１サイクルで複数のメモリ空間にアクセス可能とするため、図１７に示したデータメモリ１７０８は４つのバンク（Ｂａｎｋ０〜Ｂａｎｋ３）を有し、バンクインタリーブ方式によりアクセスの競合を回避できるようになされている。
【０００８】
また、無線通信におけるベースバンド信号処理において、高速フーリエ変換（ＦＦＴ：Fast Fourier Transform）は、使用されることの多い処理の１つである。ＦＦＴは、
【数１】
2016139394.tif 000003
で表される離散フーリエ変換を高速に計算する方法である。ＦＦＴは、ともに複素数であるサンプル値データｇ（ｎ）と回転因子Ｗnの乗算及びその乗算結果の総和を求める加減算回数を大幅に減少させたアルゴリズムである。
【０００９】
Ｃｏｏｌｅｙ−Ｔｕｋｅｙ方式を使った基数２の時間間引き型ＦＦＴについて説明する。基数２の時間間引き型ＦＦＴでは、基本演算構成として図１８（Ａ）に示す演算が適用される。図１８（Ａ）に示す演算はバタフライ演算と呼ばれ、入力値Ｘ１、Ｘ２及び回転因子Ｗnに応じ、出力値Ｙ１＝Ｘ１＋Ｘ２×Ｗn、及び出力値Ｙ２＝Ｘ１−Ｘ２×Ｗnが出力される。
【００１０】
Ｎポイント（サンプル点）での基数２のＦＦＴは、（ｌｏｇ2Ｎ）のステージを有し、各ステージは（Ｎ／２）のバタフライ演算を有する。図１８（Ｂ）は、８ポイント（サンプル点）での基数２の時間間引き型ＦＦＴの信号フローを示す図である。８ポイントでの基数２のＦＦＴは、３つのステージ（ｓｔａｇｅ１、２、３）を有し、各ステージは４つのバタフライ演算を有する。１つのバタフライ演算は、２つのデータ（入力値）と１つの回転因子とを入力とし、２つのデータ（出力値）を出力する。図１８（Ｃ）は、８ポイントのＦＦＴにおける回転因子Ｗnを示す図である。
【００１１】
内部レジスタを介さずに、データをメモリから読み出して演算し、演算結果のデータをメモリへ書き込むプロセッサ（メモリｔｏメモリ型プロセッサ）は、より多くのデータを１サイクルで入出力し処理する。例えば図１８（Ｂ）に示した８ポイントでのＦＦＴを例にすると、初段のインデックス０、４の入力データとインデックス０の回転因子Ｗ0のパラメータを入力して２つの出力データを出力するのではなく、初段のインデックス０、４、１、５の４つの入力データとインデックス０の回転因子Ｗ0のパラメータを２つ入力して４つの出力データを出力するといった処理を１サイクルで行う。
【００１２】
実際には、１サイクルにおいて、４つではなく、もっと多くの入力データと回転因子を入力して処理し（ＦＦＴのためのバタフライ演算を行い）出力データを出力する。１サイクルにおいて、３２個の入力データと１６個の回転因子データを入力し、３２個の出力データを出力する例を図１４に示す。図１４は、内部レジスタを介さずに、データをメモリから読み出して演算し、演算結果のデータをメモリへ書き込むプロセッサ（メモリｔｏメモリ型プロセッサ）により、ＦＦＴ演算を実行する場合の構成例を示す図である。
【００１３】
図１４において、データメモリ１４０９の４つのバンク（Ｂａｎｋ０〜Ｂａｎｋ３）の各々は、１ライン（１アドレス）あたり１６個のデータ要素の幅を有しているものとする。回転因子テーブル１４０７には、プロセッサの命令処理部１４０１において演算可能とするＦＦＴの最大ポイント数に応じた回転因子データ（回転因子のパラメータ）が格納されている。
【００１４】
例えば演算可能とするＦＦＴの最大ポイント数が５１２である場合、回転因子として５１２／２＝２５６要素が必要となり、回転因子テーブルに格納される回転因子データのインデックスは０〜２５５の値をとる。ここで、回転因子をＷn＝ｅｘｐ（−２πｎｊ／Ｎ）で示したとき、Ｎがプロセッサの命令処理部１４０１において演算可能とするＦＦＴの最大ポイント数に相当し、ｎが回転因子のインデックスに相当する。
【００１５】
データメモリ１４０９の各バンクと命令処理部１４０１の演算部１４０２との間でデータが入出力される。また、ＦＦＴ演算に必要な回転因子データが、セレクタ回路１４０８により回転因子テーブル１４０７から選択されて演算部１４０２に入力される。このようにプロセッサは、それぞれ１６個の入力データＤＩＮ１、ＤＩＮ２を２入力し、１６個の回転因子データを１入力し、それぞれ１６個の出力データＤＯＵＴ１、ＤＯＵＴ２を２出力して、ＦＦＴ演算を実現する。１サイクルで１ステージ分の演算が完了しない場合には、複数サイクルに分けて１ステージ分の演算を行う。
【００１６】
つまり、データメモリ１４０９から読み出した１６個の入力データＤＩＮ１が、ＦＩＦＯバッファ１４０３−１及び入力バッファ１４０４−１を介して０番目〜１５番目の入力データ要素として演算部１４０２に入力される。同様に、データメモリ１４０９から読み出した１６個の入力データＤＩＮ２が、ＦＩＦＯバッファ１４０３−２及び入力バッファ１４０４−２を介して１６番目〜３１番目の入力データ要素として演算部１４０２に入力される。実行するＦＦＴのポイント数、ステージ数、処理サイクル数に応じ、セレクタ回路１４０８により回転因子テーブル１４０７から選択した回転因子データが、入力バッファ１４０４−３を介して０番目〜１５番目の回転因子データ要素として演算部１４０２に入力される。
【００１７】
演算部１４０２は、入力された入力データ及び回転因子データを用いて、ＦＦＴ演算に係る入力データシャッフル処理、バタフライ演算処理、及び出力データシャッフル処理等を行う。そして、演算部１４０２は、０番目〜１５番目の出力データ要素として、処理結果の１６個の出力データＤＯＵＴ１を、出力バッファ１４０５−１及びＦＩＦＯバッファ１４０６−１を介してデータメモリ１４０９へ書き込む。同様に、演算部１４０２は、１６番目〜３１番目の出力データ要素として、処理結果の１６個の出力データＤＯＵＴ２を、出力バッファ１４０５−２及びＦＩＦＯバッファ１４０６−２を介してデータメモリ１４０９へ書き込む。
【００１８】
図１５は、図１４に示したプロセッサにおいて、１２８ポイントでのＦＦＴを行う場合に演算部１４０２に入力される回転因子データを示す図である。図１５においては、各ステージの処理サイクル毎に演算部１４０２に入力される回転因子データを、演算可能とするＦＦＴの最大ポイント数が５１２であるときの回転因子データのインデックスを用いて示している。
【００１９】
例えば、ステージ１の各処理サイクル０〜３においては、０番目〜１５番目の回転因子データ要素としてインデックス０の回転因子データが演算部１４０２に入力される。ステージ２の各処理サイクル０〜３においては、０番目〜１５番目のうちの偶数番目の回転因子データ要素としてインデックス０の回転因子データが演算部１４０２に入力され、奇数番目の回転因子データ要素としてインデックス１２８の回転因子データが演算部１４０２に入力される。セレクタ回路１４０８が図１５に示すように回転因子テーブル１４０７から回転因子データを選択して演算部１４０２に入力することで、プロセッサにおいて１２８ポイントでのＦＦＴ演算が実現される。
【００２０】
ＦＦＴ演算で必要とされる回転因子データの一部を準備しておき、それを基に実数部及び虚数部の指定や符号反転を行うことにより、ＦＦＴ演算で必要とされる回転因子データを生成する技術が提案されている（例えば、特許文献１、２参照）。例えば、特許文献１では、ＦＦＴ演算で必要とされる回転因子を重複せずに三角関数の正の値のみをメモリに記憶させておき、回転因子のインデックスの値に基づきメモリから得られたデータを、得ようとする回転因子が実数部か虚数部かを指定する信号及びインデックスの値に基づいて選択的に符号反転させることにより回転因子を得る技術が開示されている。また、ＦＦＴ演算の各ステージの実行中に回転因子の反復的な性質に影響を与えることによって、メモリアクセスにおいてより効率的であり、複数の反復的な回転因子を再利用することによって電力を節約し、結果的により簡単なアドレス生成アーキテクチャを有するＦＦＴを処理するための方法が提案されている（例えば、特許文献３参照）。
【先行技術文献】
【特許文献】
【００２１】
【特許文献１】特開平５−３２４６９７号公報
【特許文献２】特開２０００−２２２３８８号公報
【特許文献３】特開２００２−３１２３４３号公報
【発明の概要】
【発明が解決しようとする課題】
【００２２】
図１４に示したようなＦＦＴ演算を実行可能なプロセッサにおいて、ＦＦＴ演算に使用される回転因子データが格納されている回転因子テーブルは、ハードウェア固定であり、例えばＲＯＭ（Read Only Memory）等のメモリに格納されている。そのため、回転因子テーブルとして用意した最大のＦＦＴポイント数よりも大きいポイント数のＦＦＴ演算を実行することができず、実行可能なＦＦＴ演算が制限されてしまうという課題があった。本発明の目的は、仕様に応じてＦＦＴポイント数を変更してＦＦＴ演算を実行することが可能なプロセッサを提供することにある。
【課題を解決するための手段】
【００２３】
プロセッサの一態様は、メモリから入力されるデータ及び回転因子データに基づいて高速フーリエ変換におけるバタフライ演算を実行し、演算結果のデータをメモリへ書き込む第１の演算処理部と、回転因子生成命令に応答して、メモリに格納された高速フーリエ変換の最終ステージに係る回転因子データを基に、最終ステージまでの他のステージに係るステージ毎の回転因子データを生成してメモリへ書き込む第２の演算処理部とを有する。
【発明の効果】
【００２４】
開示のプロセッサは、メモリに格納された高速フーリエ変換の最終ステージに係る回転因子データを基に他のステージに係る回転因子データを生成しメモリへ書き込み高速フーリエ変換を行うので、仕様に応じてポイント数を変更して高速フーリエ変換を実行することが可能となる。
【図面の簡単な説明】
【００２５】
【図１】本発明の第１の実施形態におけるプロセッサの構成例を示す図である。
【図２】５１２ポイントでのＦＦＴ演算の回転因子データを示す図である。
【図３】５１２ポイントでのＦＦＴ演算の回転因子データを示す図である。
【図４】５１２ポイントでのＦＦＴ演算の回転因子データを示す図である。
【図５】第１の実施形態における回転因子テーブル生成を説明するための図である。
【図６】第１の実施形態における回転因子テーブル生成を説明するための図である。
【図７】第１の実施形態における回転因子テーブル生成処理の例を示すフローチャートである。
【図８】第１の実施形態における回転因子テーブルのメモリ配置例を示す図である。
【図９】第１の実施形態におけるプロセッサの構成例を示す図である。
【図１０】第１の実施形態におけるプロセッサの他の構成例を示す図である。
【図１１】図１０に示すプロセッサでの回転因子テーブル生成を説明するための図である。
【図１２】第１の実施形態におけるプロセッサの動作例を示す図である。
【図１３】第１の実施形態におけるプロセッサの他の動作例を示す図である。
【図１４】ＦＦＴ演算を実行可能なメモリｔｏメモリ型プロセッサの構成例を示す図である。
【図１５】１２８ポイントでのＦＦＴ演算の回転因子データを示す図である。
【図１６】回転因子テーブルをメモリに展開する例を説明するための図である。
【図１７】メモリｔｏメモリ型プロセッサの構成を示す図である。
【図１８】高速フーリエ変換を説明するための図である。
【図１９】算出すべきＦＦＴポイント数を１２８としたときの回転因子テーブルを説明するための図である。
【図２０】第２の実施形態におけるプロセッサの構成例を示す図である。
【図２１】第２の実施形態における第３の演算処理部の構成例を示す図である。
【図２２】第２の実施形態における回転因子ベーステーブル生成処理の例を示すフローチャートである。
【図２３】第２の実施形態における回転因子ベーステーブル生成処理を説明するための図である。
【発明を実施するための形態】
【００２６】
以下、本発明の実施形態を図面に基づいて説明する。
【００２７】
（第１の実施形態）
本発明の第１の実施形態について説明する。
前述のようにＦＦＴ演算に使用する回転因子データが格納された回転因子テーブルがハードウェア固定であることにより、プロセッサにおいて実行可能なＦＦＴ演算は、回転因子テーブルとして用意した最大のＦＦＴポイント数に制限されてしまう。これを解決する１つの方法として、回転因子テーブルをハードウェア固定ではなく、メモリに展開する方法が考えられる。
【００２８】
図１６は、最大のＦＦＴポイント数が５１２に対応する回転因子テーブルの回転因子データをメモリに展開した例を示す図である。図１６において、縦方向にメモリにおけるアドレスを示し、横方向にビット方向における回転因子データの並びを示している。図１６に示す例では、データメモリの１つのバンクは、１ラインあたり１６個の回転因子データを配置することができるデータ幅を有し、回転因子データが１アドレスあたり１６個分配列されている。なお、図１６では、回転因子データのインデックスを図示している。
【００２９】
図１６に示すように回転因子テーブルの回転因子データをメモリに展開した場合、例えば図１５に示したステージ６のサイクル１において使用する回転因子データを取得する際には図１６において太破線で囲んだ箇所の回転因子データを必要とする。この場合には、アドレス８〜アドレス１５へアクセスするので、すべての回転因子データの取得に８サイクルかかる。また、各サイクルにおいて読み出される１つのアドレスの１６個の回転因子データのうちから太破線で囲んだ箇所の２つの回転因子データを抽出するセレクタ回路が必要となる。
【００３０】
また、例えば図１５に示したステージ７のサイクル１において使用する回転因子データを取得する際には図１６において太線で囲んだ箇所の回転因子データを必要とする。この場合には、アドレス４〜アドレス７へアクセスするので、すべての回転因子データの取得に４サイクルかかる。また、各サイクルにおいて読み出される１つのアドレスの１６個の回転因子データのうちから太線で囲んだ箇所の４つの回転因子データを抽出するセレクタ回路が必要となる。
【００３１】
回転因子テーブルを図１６に例示したようにメモリに展開して、ＦＦＴ演算に必要な回転因子データを選択し抽出するようにすることで、回転因子データの取得と同時にＦＦＴ演算が可能である。しかし、ＦＦＴ演算に使用する回転因子データの取得に時間がかかるため、プロセッサの性能速度を低下させてしまう。また、回転因子テーブルの記憶に要する記憶容量は小さくなるが、回転因子テーブルから所望の回転因子データを抽出するためのセレクタ回路が複雑となり、回路規模も大きくなってしまう。このように回転因子テーブルを単純にメモリに展開すると、回路規模としても演算性能としても不利となる。
【００３２】
そこで、第１の実施形態におけるプロセッサでは、回路規模の増大や演算性能の劣化を伴うことなく、仕様に応じてＦＦＴポイント数を変更してＦＦＴ演算を実行できるようにする。本実施形態では、プロセッサにて実行することがあるプログラムで使用するＦＦＴ命令のうちの最大のＦＦＴポイント数での最終（最大）ステージのバタフライ演算を実行するための回転因子データをデータメモリに用意する。そして、プロセッサが、データメモリに用意した回転因子データに基づいて、他の（残りの）ステージのバタフライ演算を実行するための回転因子データを生成してメモリに展開することで、ＦＦＴ演算に用いる回転因子テーブルを作成する。
【００３３】
なお、以下に説明する実施形態において、プロセッサは、Ｃｏｏｌｅｙ−Ｔｕｋｅｙ方式での基数２の時間間引き型ＦＦＴを実行するものとし、ＦＦＴポイント数は２のべき乗の値をとるものとする。また、以下に説明する実施形態におけるプロセッサは、例えば内部レジスタを介さずに、データをメモリから読み出して演算し、演算結果のデータをメモリに書き込むプロセッサ（メモリｔｏメモリ型プロセッサ）である。また、いわゆるＳＩＭＤ（Single Instruction Multiple Data）方式のように、１サイクルにおいてＦＦＴのバタフライ演算を複数実行可能であるとする。
【００３４】
図１は、第１の実施形態におけるプロセッサの構成例を示す図である。図１においては、第１の実施形態におけるプロセッサの命令処理部を示している。第１の実施形態におけるプロセッサの命令処理部は、制御部１０、演算部２０、ＦＩＦＯ（First-In First-Out）バッファ３１、３４、入力バッファ３２、及び出力バッファ３３を有する。
【００３５】
データメモリから読み出したデータは、ＦＩＦＯバッファ３１及び入力バッファ３２を介して演算部２０に入力される。演算部２０は、入力されたデータによる演算を制御部１０の制御に従って行い、その演算結果のデータを、出力バッファ３３及びＦＩＦＯバッファ３４を介してデータメモリへ書き込む。なお、ＦＦＴ演算の回転因子データを含む演算処理に係るデータ等を記憶するデータメモリは、例えばプロセッサチップに内蔵されたメモリであり、複数のバンクを有し、各バンクは１ラインあたり１６個のデータ要素を配置することができるデータ幅を持つ。また、データメモリは、バンクインタリーブ方式によりアクセスの競合を回避できるようになっている。
【００３６】
制御部１０は、図示しない命令メモリから命令を読み出し、その命令に応じて演算部２０を制御する。演算部２０は、第１の演算処理部２１及び第２の演算処理部２２Ａを有する。第２の演算処理部２２Ａは、制御部１０の制御に従って回転因子テーブル生成処理を実行する。第１の演算処理部２１は、回転因子テーブル生成処理を除いた、ＦＦＴ演算処理を含む各種の演算処理を制御部１０の制御に従って実行する。例えば、第１の演算処理部２１は、制御部１０からＦＦＴ演算の実行が指示されると、入力されるデータ（回転因子データを含む）を用いて、ＦＦＴ演算に係る入力データシャッフル処理、バタフライ演算処理、及び出力データシャッフル処理等を行う。
【００３７】
第２の演算処理部２２Ａは、２データ間引き部２３Ａ、セレクタ制御部２５Ａ、及びセレクタ２６Ａを有する。２データ間引き部２３Ａは、データメモリから読み出し、ＦＩＦＯバッファ３１及び入力バッファ３２を介して入力される回転因子データ（１ラインあたり１６データ要素）から２データ毎に間引きして出力する。本実施形態では、２データ間引き部２３Ａは、入力される１ラインあたりの０番目〜１５番目の回転因子データのうちから偶数番目（０、２、４、６、８、１０、１２、１４番目）の回転因子データを選択して出力する。
【００３８】
セレクタ制御部２５Ａは、命令オペランドから取得されたＦＦＴポイント数やＦＦＴステージ数に応じた制御部１０の制御に従ってセレクタ２６Ａを制御する。セレクタ２６Ａは、２データ間引き部２３Ａから出力される回転因子データを、セレクタ制御部２５Ａによる制御に応じて出力バッファ３３の前半部（０番目〜７番目）又は後半部（８番目〜１５番目）の一方、もしくは前半部及び後半部の両方に出力する。すなわち、２データ間引き部２３Ａにより１６個から８個に間引かれた回転因子データが、セレクタ２６Ａを介して、出力バッファ３３の前半部又は後半部の一方、もしくは前半部及び後半部の両方に出力される。
【００３９】
ここで、５１２ポイントでのＦＦＴを行う場合に各ステージのバタフライ演算を実行するために演算部に入力される回転因子データについて、図２〜図４を参照して説明する。図２〜図４においては、各ステージの処理サイクル毎に演算部に入力される回転因子データ列ＴＩを、演算可能とするＦＦＴの最大ポイント数が５１２であるときの回転因子データのインデックスを用いて示している。
【００４０】
図２（Ａ）は、ステージ１（最初のステージ）の各サイクルにおいて演算部に入力される回転因子データを示している。図２（Ｂ）は、ステージ２の各サイクルにおいて演算部に入力される回転因子データを示しており、図２（Ｃ）は、ステージ３の各サイクルにおいて演算部に入力される回転因子データを示している。また、図３（Ａ）、図３（Ｂ）、及び図３（Ｃ）のそれぞれは、ステージ４、ステージ５、及びステージ６の各サイクルにおいて演算部に入力される回転因子データをそれぞれ示している。また、図４（Ａ）、図４（Ｂ）、及び図４（Ｃ）のそれぞれは、ステージ７、ステージ８、及びステージ９の各サイクルにおいて演算部に入力される回転因子データをそれぞれ示している。
【００４１】
図２〜図４に示した各ステージにおいて演算部に入力される回転因子データのインデックスのパターンに着目すると、下記のようになる。
ステージ１：０、０、０、０、・・・（０のみ）
ステージ２：０、１２８、０、１２８、・・・（０、１２８の交互の繰りし）
ステージ３：０、６４、１２８、１９２、０、６４、・・・（０から１９２まで６３ずつ飛ばし）
ステージ４：０、３２、６４、・・・、２２４、０、・・・（０から２２４まで３１ずつ飛ばし）
ステージ５：０、１６、３２、・・・、２４０、０、・・・（０から２４０まで１５ずつ飛ばし）
ステージ６：０、８、１６、・・・、２４８、０、・・・（０から２４８まで７ずつ飛ばし）
ステージ７：０、４、８、・・・、２５２、０、・・・（０から２５２まで３ずつ飛ばし）
ステージ８：０、２、４、・・・、２５４、０、・・・（０から２５４まで１ずつ飛ばし）
ステージ８：０、１、２、・・・、２５５、０、・・・（０から２５５まで連続）
【００４２】
したがって、前述したパターンの回転因子データが、ステージ及びサイクル毎に用意できれば、ＦＦＴポイント数が５１２以下のＦＦＴ演算が可能となる。本実施形態では、プロセッサにて実行する可能性がある最大のＦＦＴポイント数が５１２である場合、図４（Ｃ）に示したような５１２ポイントのＦＦＴにおける最終（最大）ステージであるステージ９のバタフライ演算を行う回転因子データをデータメモリに用意する。このステージ９の回転因子データを基に、演算部２０の第２の演算処理部２２Ａが、ステージ１〜ステージ８のバタフライ演算を行う回転因子データを生成しデータメモリに展開することで、ＦＦＴ演算に用いる回転因子テーブルが作成される。
【００４３】
図５及び図６を参照して、演算部２０の第２の演算処理部２２Ａによる回転因子テーブル生成（最大のＦＦＴポイント数が５１２である場合）について説明する。図５（Ａ）に示す回転因子データ（ステージ９に対応）がデータメモリに予め用意されているものとする。なお、以下に示す回転因子生成命令Ａ及び回転因子生成命令Ｂは、それぞれ１つの命令で１つのステージの回転因子データを生成する。
【００４４】
演算処理部２２Ａは、ステージ８に係る回転因子データを生成するために、制御部１０から回転因子生成命令Ａの実行が指示されると、図５（Ａ）に示すステージ９に係る回転因子データを入力とし、データ要素を１つずつ飛ばしてデータを詰めることにより、図５（Ｂ）に示すステージ８に係る回転因子データを生成する。詳細には、演算処理部２２Ａは、データメモリから読み出したステージ９の回転因子データを２データ間引き部２３Ａにより１つおきに間引き、セレクタ２６Ａを介して出力バッファ３３の前半部及び後半部に交互に出力する。例えば、ステージ９のサイクル０、１における回転因子データを１つおきに間引く（図５（Ａ）においてハッチングを施して図示したデータ要素を抽出する）ことにより、ステージ８のサイクル０における回転因子データが生成される。
【００４５】
同様に、演算処理部２２Ａは、ステージ７に係る回転因子データを生成するために、制御部１０から回転因子生成命令Ａの実行が指示されると、前述のようにして生成された図５（Ｂ）に示すステージ８に係る回転因子データを入力とし、データ要素を１つずつ飛ばしてデータを詰めることにより、図５（Ｃ）に示すステージ７に係る回転因子データを生成する。以下、図６（Ａ）に示すステージ６に係る回転因子データ、及び図６（Ｂ）に示すステージ５に係る回転因子データも、回転因子生成命令Ａをそれぞれ実行することにより同様に生成される。このようにして、ステージ５〜ステージ９のバタフライ演算を行うための回転因子データが生成される。
【００４６】
また、演算処理部２２Ａは、ステージ４に係る回転因子データを生成するために、制御部１０から回転因子生成命令Ｂの実行が指示されると、図６（Ｂ）に示すステージ５に係る回転因子データを入力とし、データ要素を１つずつ飛ばしてデータを詰め、さらにそのデータ配列をコピーすることにより、図６（Ｃ）に示すステージ４に係る回転因子データを生成する。詳細には、演算処理部２２Ａは、データメモリから読み出したステージ５の回転因子データを２データ間引き部２３Ａにより１つおきに間引き、セレクタ２６Ａを介して出力バッファ３３の前半部及び後半部の両方に出力し１６個のデータ要素にして出力する。例えば、ステージ５のサイクル０における回転因子データを１つおきに間引き（図６（Ｂ）においてハッチングを施して図示したデータ要素を抽出し）、それを複写するようにして出力することにより、ステージ４のサイクル０における回転因子データが生成される。
【００４７】
同様に、演算処理部２２Ａは、ステージ３に係る回転因子データを生成するために、制御部１０から回転因子生成命令Ｂの実行が指示されると、前述のようにして生成された図６（Ｃ）に示すステージ４に係る回転因子データを入力とし、データ要素を１つずつ飛ばしてデータを詰めた後にそのデータ配列をコピーすることにより、図６（Ｄ）に示すステージ３に係る回転因子データを生成する。以下、図６（Ｅ）に示すステージ２に係る回転因子データ、及び図６（Ｆ）に示すステージ１に係る回転因子データも、回転因子生成命令Ｂをそれぞれ実行することにより同様に生成される。このようにして、ステージ１〜ステージ４のバタフライ演算を行うための回転因子データが生成される。
【００４８】
次に、本実施形態における回転因子テーブル生成処理の動作について説明する。図７は、第１の実施形態における回転因子テーブル生成処理の例を示すフローチャートである。なお、プロセッサにて実行するプログラムで使用する最大のＦＦＴポイント数での最終（最大）ステージに対応する回転因子データは、プログラマー等によって予め用意されデータメモリに作成されている。
【００４９】
まず、回転因子テーブル生成処理を開始すると、変数ｉが最終（最大）ステージの値から１減じた値に設定される（Ｓ１０１）。なお、最大のＦＦＴポイント数がＮであるとき、最終（最大）ステージの値は（ｌｏｇ2Ｎ）で求められる。次に、回転因子データの生成に使用する回転因子データを読み出すソース領域として、最大のＦＦＴポイント数での最終ステージに対応する回転因子データが格納されているデータメモリのメモリ領域が設定される（Ｓ１０３）。
【００５０】
続いて、生成した回転因子データを書き込むデスティネーション領域として、データメモリにおけるソース領域と異なるメモリ領域が設定される（Ｓ１０３）。次に、変数ｉの値が５より小さいか否かが判定され（Ｓ１０４）、変数ｉの値が５より小さくない場合には回転因子生成命令Ａを実行し（Ｓ１０５）、変数ｉの値が５より小さい場合には回転因子生成命令Ｂを実行する（Ｓ１０６）。なお、ここではデータメモリの各バンクが１ライン（１アドレス）あたり１６個のデータ要素を配置することができるデータ幅を有する場合の例を示している。１ライン（１アドレス）あたりＮ個のデータ要素を配置することができるデータ幅を有する場合、変数ｉの値が（ｌｏｇ2Ｎ）＋１より小さいか否か判定すれば良い。
【００５１】
前述したステップＳ１０５にて第２の演算処理部２２Ａにより回転因子生成命令Ａが実行され、又はステップＳ１０６にて第２の演算処理部２２Ａにより回転因子生成命令Ｂが実行されることにより、生成された回転因子データが、ステップＳ１０３において設定されたデスティネーション領域に書き込まれる。回転因子生成命令Ａの実行によって、前述したようにステージ（ｉ＋１）のサイクル２ｊ、２ｊ＋１（ｊは０以上の整数）に係る回転因子データからステージｉのサイクルｊに係る１サイクル分の回転因子データが生成される。また、回転因子生成命令Ｂの実行によって、前述したようにステージ（ｉ＋１）のサイクル０に係る回転因子データからステージｉのサイクル０に係る１サイクル分の回転因子データが生成される。
【００５２】
次に、変数ｉの値が１であるかが判定され（Ｓ１０７）、変数ｉの値が１であれば回転因子テーブル生成処理を終了する。一方、変数ｉの値が１でなければ、変数ｉの値が１減じた値に設定される（Ｓ１０８）。次に、回転因子データの生成に使用する回転因子データを読み出すソース領域として、（ｉ＋１）のときのデスティネーション領域、すなわちステージ（ｉ＋１）に対応する回転因子データが格納されているデータメモリのメモリ領域が設定される（Ｓ１０９）。
【００５３】
続いて、変数ｉの値がプログラムの使用マクロ内の最終（最大）ステージの値以上であるか否かが判定され（Ｓ１１０）、変数ｉの値がプログラムの使用マクロ内の最終（最大）ステージの値以上である場合にはステップＳ１０３に進み、ステップＳ１０３以降の処理を行う。一方、変数ｉの値がプログラムの使用マクロ内の最終（最大）ステージの値以上でない場合には、生成した回転因子データを書き込みデスティネーション領域として、データメモリにおけるソース領域と同じ領域が設定され（Ｓ１１１）、ステップＳ１０４に進んでステップＳ１０４以降の処理を行う。
【００５４】
なお、ステージ毎に回転因子生成命令を分割せずに、一度にすべてのステージの回転因子データを生成する方法もあるが、ステージ毎に回転因子生成命令を分割することで、生成した回転因子データを書き込む領域を各ステージ毎に独立して設定することが可能となる。例えば、最大のＦＦＴポイント数が５１２である回転因子データが存在するが、実際に行うＦＦＴのポイントが６４までである場合には、ステージ７及びステージ８に係る回転因子データは不要である。この場合には、ステージ８及びステージ７の回転因子データの生成において、ソース領域とデスティネーション領域とを同じ領域とすることで回転因子テーブルの記憶に要するメモリ領域を削減することができる。
【００５５】
回転因子テーブル生成処理を実行した後、各ステージのバタフライ演算に用いる回転因子データ（回転因子テーブル）は、例えば図８に示すようにデータメモリにマッピングされる。このように各ステージのバタフライ演算で使用される回転因子データを有する回転因子テーブルが作成されると、図９に示すような３入力２出力（３ソース（source）−２デスティネーション（destination））の演算部２０を有する命令処理部１００に、回転因子データをデータメモリ２００から入力することでＦＦＴ演算を行うことが可能となる。
【００５６】
図９は、前述したようにして作成された回転因子テーブルを用いＦＦＴ演算を行うプロセッサの構成例を示す図である。データメモリ２００から読み出した入力データＤＩＮ１、ＤＩＮ２及び回転因子データ列ＴＩが、ＦＩＦＯバッファ３１及び入力バッファ３２を介して演算部２０に入力される。演算部２０は、入力データＤＩＮ１、ＤＩＮ２及び回転因子データ列ＴＩを用いてＦＦＴのバタフライ演算を行い、その演算結果の出力データＤＯＵＴ１、ＤＯＵＴ２を、出力バッファ３３及びＦＩＦＯバッファ３４を介してデータメモリ２００へ書き込む。
【００５７】
例えば、データメモリ２００から読み出した１６個の入力データＤＩＮ１が、ＦＩＦＯバッファ３１−１及び入力バッファ３２−１を介して０番目〜１５番目の入力データ要素として演算部２０に入力される。同様に、データメモリ２００から読み出した１６個の入力データＤＩＮ２が、ＦＩＦＯバッファ３１−２及び入力バッファ３２−２を介して１６番目〜３１番目の入力データ要素として演算部２０に入力される。また、データメモリ２００から読み出した、実行するＦＦＴのポイント数、ステージ数、処理サイクル数に応じた１６個の回転因子データＴＩ１が、ＦＩＦＯバッファ３１−３及び入力バッファ３２−３を介して０番目〜１５番目の回転因子データ要素として演算部２０に入力される。
【００５８】
そして、演算部２０は、入力された入力データ及び回転因子データを用いて、ＦＦＴ演算に係る入力データシャッフル処理、バタフライ演算処理、及び出力データシャッフル処理等を行う。演算部２０は、０番目〜１５番目の出力データ要素として、処理結果の１６個の出力データＤＯＵＴ１を、出力バッファ３３−１及びＦＩＦＯバッファ３４−１を介してデータメモリ２００へ書き込む。同様に、演算部２０は、１６番目〜３１番目の出力データ要素として、処理結果の１６個の出力データＤＯＵＴ２を、出力バッファ３３−２及びＦＩＦＯバッファ３４−２を介してデータメモリ２００へ書き込む。
【００５９】
図１に示した例では、１入力１出力（１ソース（source）−１デスティネーション（destination））の第２の演算処理部２２Ａにより回転因子データ生成処理を行っている。しかし、これに限定されるものではなく、例えば１入力２出力（１ソース（source）−２デスティネーション（destination））の第２の演算処理部２２Ｂにより回転因子データ生成処理を行うようにしても良い。
【００６０】
図１０は、第１の実施形態におけるプロセッサの他の構成例を示す図である。図１０においては、第１の実施形態におけるプロセッサの命令処理部を示している。図１０において、図１に示した構成要素と同様の機能を有する構成要素には同一の符号を付し、重複する説明は省略する。図１０に示すプロセッサの命令処理部は、制御部１０、演算部２０、ＦＩＦＯバッファ３１、３４Ａ、３４Ｂ、入力バッファ３２、及び出力バッファ３３Ａ、３３Ｂを有する。
【００６１】
演算部２０は、第１の演算処理部２１及び第２の演算処理部２２Ｂを有する。第２の演算処理部２２Ｂは、図１に示した第２の演算処理部２２Ａと同様に、制御部１０の制御に従って回転因子テーブル生成処理を実行する。第２の演算処理部２２Ｂは、２データ間引き部２３Ａ、セレクタ制御部２５Ａ、及びセレクタ２６Ａに加え、さらに４データ間引き部２３Ｂ、セレクタ制御部２５Ｂ、及びセレクタ２６Ｂを有する。なお、出力バッファ３３Ａ及びＦＩＦＯバッファ３４Ａは、図１に示した出力バッファ３３及びＦＩＦＯバッファ３４にそれぞれ対応する。
【００６２】
４データ間引き部２３Ｂは、データメモリから読み出し、ＦＩＦＯバッファ３１及び入力バッファ３２を介して入力される回転因子データ（１ラインあたり１６データ要素）から４データ毎に間引きして出力する。本実施形態では、４データ間引き部２３Ｂは、図１１において下段に示すように、入力される１ラインあたりの０番目〜１５番目の回転因子データのうちから０、４、８、１２番目の回転因子データを選択して出力する。なお、図１１の中段には、２データ間引き部２３Ａによる回転因子データの選択、出力を参考として示している。
【００６３】
セレクタ制御部２５Ｂは、命令オペランドから取得されたＦＦＴポイント数やＦＦＴステージ数に応じた制御部１０の制御に従ってセレクタ２６Ｂを制御する。セレクタ２６Ｂは、セレクタ制御部２５Ｂによる制御に応じて、４データ間引き部２３Ｂから出力される回転因子データを出力バッファ３３Ｂに出力する。すなわち、４データ間引き部２３Ｂにより１６個から４個に間引かれた回転因子データを、セレクタ２６Ｂにより出力バッファ３３Ｂの４分割した領域に適切に出力することで、ステージ（ｉ＋１）に係る回転因子データを基にステージ（ｉ−１）に係る回転因子データを生成することが可能となる。
【００６４】
以上のように第１の実施形態によれば、プログラムで使用するＦＦＴ命令のうちの最大のＦＦＴポイント数での最終（最大）ステージのバタフライ演算を行う回転因子データをデータメモリに用意する。そして、プロセッサが、データメモリに用意した回転因子データに基づいて、他の（残りの）ステージのバタフライ演算を行うための回転因子データを生成してデータメモリに展開することで、ＦＦＴ演算に用いる回転因子テーブルを作成する。これにより、本実施形態におけるプロセッサでは、回路規模の増大や演算性能の劣化を伴うことなく、仕様に応じてＦＦＴポイント数を変更しながらＦＦＴ演算を実行することが可能となる。
【００６５】
図１２は、第１の実施形態におけるプロセッサの動作例を示す図である。図１２に示す動作例は、プロセッサが、それぞれのプログラムの実行開始時にそのプログラムで実行するＦＦＴに応じた回転因子テーブル生成処理を実行する例である。図１２（Ａ）に示すように、実行するプログラムの切り替えを順次行い、リセット後にプログラム（１）、プログラム（２）、プログラム（３）と順に行うものとする。
【００６６】
プログラム（１）は、１２８ポイントのＦＦＴを行う命令１２０２及び５１２ポイントのＦＦＴを行う命令１２０３を含み、プログラム（２）は、４０９６ポイントのＦＦＴを行う命令１２０５を含む。プログラム全体において使用される最大のＦＦＴポイント数は４０９６であるので、４０９６ポイントでのＦＦＴの最終（最大）ステージであるステージ１２に対応するインデックス０〜２０４７の回転因子データがデータメモリに用意されている。
【００６７】
プログラム（１）の実行を開始するときに回転因子生成命令を実行して（１２０１）、データメモリに用意されたステージ１２に係る回転因子データを基に、プログラム（１）の内で最大である５１２ポイントのＦＦＴを行うためのステージ１〜ステージ９の各ステージに係る回転因子データを生成する。また、プログラム（２）の実行を開始するときに回転因子生成命令を実行して（１２０２）、データメモリに用意されたステージ１２に係る回転因子データを基に、プログラム（２）の内で最大である４０９６ポイントのＦＦＴを行うためのステージ１〜ステージ１１の各ステージに係る回転因子データを生成する。
【００６８】
図１２（Ｂ）は、プロセッサが、それぞれのプログラムの実行開始時にそのプログラムで実行するＦＦＴに応じた回転因子テーブル生成処理を実行する場合の動作例を示すフローチャートである。まず、リセットが解除され（Ｓ２０１）、変数ｉが１に設定される（ステップＳ２０２）。そして、変数ｉに応じたプログラム（ｉ）の内にＦＦＴ命令が含まれているか否かが判定される（Ｓ２０３）。ＦＦＴ命令を含む場合にはプログラム（ｉ）内で使用する最大のＦＦＴステージ（ＦＦＴポイント数）に関する情報を取得し（Ｓ２０４）、取得した最大のＦＦＴステージに応じて回転因子テーブル生成処理を実行する（Ｓ２０５）。
【００６９】
続いて、プログラム（ｉ）を実行し（Ｓ２０６〜Ｓ２１１）、命令を順次発行する（Ｓ２０７）。発行された命令がＦＦＴ命令であれば、プロセッサは、回転因子テーブル生成処理により生成された回転因子データを用いてＦＦＴ演算処理を実行する（Ｓ２０８のＹｅｓ及びＳ２０９）。発行された命令がＦＦＴ命令でなければ、プロセッサは、発行された命令に応じた通常処理を実行する（Ｓ２０８のＮｏ及びＳ２１０）。
【００７０】
プログラム（ｉ）の実行が完了すると、次に実行するプログラム（ｉ＋１）があるか否かが判断され（Ｓ２１２）、次に実行するプログラムがなければ処理を終了する。一方、次に実行するプログラム（ｉ＋１）がある場合には、変数ｉの値を１増加させ（Ｓ２１３）、その変数ｉに応じたプログラム（ｉ）への切り替えを行う（Ｓ２１４）。そして、プログラム（ｉ）への切り替えが完了し、プログラム（ｉ）の開始が指示されると（Ｓ２１５）、ステップＳ２０３に進み、ステップＳ２０３以降の処理を行う。このようにプロセッサが、それぞれのプログラムの実行開始時にそのプログラムで実行するＦＦＴに応じた回転因子テーブル生成処理を実行することで、プログラム毎に回転因子テーブルを最適化でき、メモリの使用効率を改善することが可能となる。
【００７１】
ここで、図１２に示した例では、プロセッサが、それぞれのプログラムの実行開始時にそのプログラムで実行するＦＦＴに応じた回転因子テーブル生成処理を実行するようにしている。しかし、これに限定されず、例えばデータメモリの容量に余裕がある場合などには、図１３に示すように、プロセッサが、プログラム全体の実行開始時にプログラム全体での最大のＦＦＴポイント数のＦＦＴに応じた回転因子テーブル生成処理を実行するようにしても良い。図１３は、本実施形態におけるプロセッサの他の動作例を示す図である。
【００７２】
図１３（Ａ）に示すように、実行するプログラムの切り替えを順次行い、リセット後にプログラム（１）、プログラム（２）、プログラム（３）と順に行うものとする。前述した例と同様に、プログラム（１）は、１２８ポイントのＦＦＴを行う命令１３０２及び５１２ポイントのＦＦＴを行う命令１３０３を含み、プログラム（２）は、４０９６ポイントのＦＦＴを行う命令１３０４を含む。
【００７３】
また、同様に、プログラム全体において使用される最大のＦＦＴポイント数は４０９６であるので、４０９６ポイントでのＦＦＴの最終（最大）ステージであるステージ１２に対応するインデックス０〜２０４７の回転因子データがデータメモリに用意されている。しかし、図１３に示す例では、プログラム全体の実行を開始するとき、すなわちリセット解除時に回転因子生成命令を実行して（１３０１）、データメモリに用意されたステージ１２に係る回転因子データを基に、プログラム全体で最大である４０９６ポイントのＦＦＴを行うためのステージ１〜ステージ１１の各ステージに係る回転因子データを生成する。
【００７４】
図１３（Ｂ）は、プロセッサが、プログラム全体の実行開始時にプログラム全体での最大のＦＦＴポイント数のＦＦＴに応じた回転因子テーブル生成処理を実行する場合の動作例を示すフローチャートである。まず、リセットが解除され（Ｓ３０１）、プログラム全体の内にＦＦＴ命令が含まれているか否かが判定される（Ｓ３０２）。ＦＦＴ命令を含む場合にはプログラム全体の内で使用する最大のＦＦＴステージ（ＦＦＴポイント数）に関する情報を取得し（Ｓ３０３）、取得した最大のＦＦＴステージに応じて回転因子テーブル生成処理を実行する（Ｓ３０４）。
【００７５】
続いて、変数ｉが１に設定される（ステップＳ３０５）。そして、プログラム（ｉ）を実行し（Ｓ３０６〜Ｓ３１１）、命令を順次発行する（Ｓ３０７）。発行された命令がＦＦＴ命令であれば、プロセッサは、回転因子テーブル生成処理により生成された回転因子データを用いてＦＦＴ演算処理を実行する（Ｓ３０８のＹｅｓ及びＳ３０９）。発行された命令がＦＦＴ命令でなければ、プロセッサは、発行された命令に応じた通常処理を実行する（Ｓ３０８のＮｏ及びＳ３１０）。
【００７６】
プログラム（ｉ）の実行が完了すると、次に実行するプログラム（ｉ＋１）があるか否かが判断され（Ｓ３１２）、次に実行するプログラムがなければ処理を終了する。一方、次に実行するプログラム（ｉ＋１）がある場合には、変数ｉの値を１増加させ（Ｓ３１３）、その変数ｉに応じたプログラム（ｉ）への切り替えを行う（Ｓ３１４）。そして、プログラム（ｉ）への切り替えが完了し、プログラム（ｉ）の開始が指示されると（Ｓ３１５）、ステップＳ３０６に進み、ステップＳ３０６以降の処理を行う。
【００７７】
（第２の実施形態）
次に、本発明の第２の実施形態について説明する。
前述した第１の実施形態では、プロセッサにて実行することがあるプログラムで使用するＦＦＴ命令のうちの最大のＦＦＴポイント数での最終（最大）ステージのバタフライ演算を行うための回転因子データをデータメモリに用意する。そして、プロセッサが、データメモリに用意した回転因子データに基づいて、他の（残りの）ステージのバタフライ演算を行うための回転因子データを生成してメモリに展開することで、ＦＦＴ演算に用いる回転因子テーブルを作成する。
【００７８】
すなわち、第１の実施形態では、最大のＦＦＴポイント数での最終（最大）ステージのバタフライ演算を行うための回転因子データを、ブート時にデータメモリに格納しておく必要がある。したがって、データメモリにおいて、最大のＦＦＴポイント数での最終（最大）ステージのバタフライ演算を行うための回転因子データの格納領域をＲＯＭ領域として確保しておく必要があり、ＲＡＭ領域として使用できるメモリ領域が少なくなってしまう。
【００７９】
ここで、算出すべきＦＦＴポイント数を１２８とした場合、回転因子は１２８／２＝６４要素が必要となり、これらの要素（回転因子データ）のインデックスを０〜６３とする。このとき、図９に示したプロセッサによる３２データ要素の入出力でのＦＦＴ演算において、各ステージの処理サイクル毎に演算部に入力される回転因子データ列は、図１９（Ａ）に示すようになる。
【００８０】
図１９（Ａ）に示した回転因子テーブルの作成は、図１９（Ｂ）に示すようなステージ７に対応する回転因子データがメモリ上に展開されていれば、前述した第１の実施形態と同様にして実現できる。ここで、プログラムで使用する最大のＦＦＴポイント数での最終（最大）ステージに対応する回転因子テーブル、例えば最大ＦＦＴポイント数が１２８であるときの図１９（Ｂ）に示したような回転因子テーブルを、回転因子ベーステーブルと呼ぶ。
【００８１】
ＦＦＴ演算における回転因子Ｗnは、算出したいＦＦＴポイント数をＮとすると、Ｗn＝ｅｘｐ（ｊ・ｎθ）で表される。ただし、θ＝−２π／Ｎである。また、ｅｘｐ（ｊ・ｎθ）は、下記のように展開できる。
【数２】
2016139394.tif 000004
すなわち、ｅｘｐ（ｊ・（θ×１））の値を与えることで、ｎ＝０〜（Ｎ−１）のＦＦＴ演算における回転因子Ｗnを順に求めることができる。
【００８２】
そこで、以下に説明する第２の実施形態では、予め回転因子ベーステーブルを用意してブート時にデータメモリに格納するのではなく、算出したいＦＦＴポイント数で３６０°（２π）を分割した最小角度をθとしてｅｘｐ（ｊ・θ）、具体的にはｃｏｓθ及びｓｉｎθの値とＦＦＴポイント数とを与えることでプロセッサにて回転因子ベーステーブルを作成してデータメモリに展開する。これにより、データメモリに回転因子ベーステーブル用のメモリ領域を確保する必要がなくなり、ＲＡＭ領域として使用できるメモリ領域が広がり、データメモリを効率よく利用することができる。
【００８３】
図２０は、第２の実施形態におけるプロセッサの構成例を示す図である。図２０においては、第２の実施形態におけるプロセッサの命令処理部を示している。図２０において、図１に示した構成要素と同様の機能を有する構成要素には同一の符号を付している。第２の実施形態におけるプロセッサの命令処理部は、制御部１０、演算部２０、ＦＩＦＯバッファ３１、３４、入力バッファ３２、及び出力バッファ３３を有する。
【００８４】
データメモリから読み出したデータは、ＦＩＦＯバッファ３１及び入力バッファ３２を介して演算部２０に入力される。演算部２０は、制御部１０の制御に従ってデータ等による演算を行い演算結果のデータを、出力バッファ３３及びＦＩＦＯバッファ３４を介してデータメモリへ書き込む。なお、本実施形態においても、データメモリは、複数のバンクを有し、バンクインタリーブ方式によりアクセスの競合を回避できるようになっており、例えば各バンクが１ラインあたり１６個のデータ要素を配置することができるデータ幅を持つ。
【００８５】
制御部１０は、図示しない命令メモリから命令を読み出し、その命令に応じて演算部２０を制御する。演算部２０は、第１の演算処理部２１、第２の演算処理部２２、及び第３の演算処理部２８を有する。第３の演算処理部２８は、命令オペランドから取得されたＦＦＴポイント数やｅｘｐ（ｊ・（θ×１））の値に応じた制御部１０の制御に従って回転因子ベーステーブル生成処理を実行する。なお、θは、命令オペランドから取得されるＦＦＴポイント数Ｎで３６０°（２π）を分割した最小角度（２π／Ｎ）である。
【００８６】
第２の演算処理部２２は、前述した第１の実施形態における第２の演算処理部２２Ａもしくは第２の演算処理部２２Ｂに対応し、制御部１０の制御に従って回転因子テーブル生成処理を実行する。第１の演算処理部２１は、前述した第１の実施形態における第１の演算処理部２１に対応し、回転因子テーブル生成処理及び回転因子ベーステーブル生成処理を除いた、ＦＦＴ演算処理を含む各種の演算処理を制御部１０の制御に従って実行する。なお、第２の演算処理部２２や第１の演算処理部２１が行う処理は、第１の実施形態と同様である。
【００８７】
図２１は、本実施形態における第３の演算処理部２８の構成例を示す図である。第３の演算処理部２８は、セレクタＳＥＬ＿Ｈ、保持用のフリップフロップＦＦ＿Ｈ、複数の演算回路３０１、複数の変換回路３０２、及び制御回路３０５を有する。図２１においては、一例として、データメモリにおける１バンクのデータ幅に対応させて、演算回路３０１及び変換回路３０２を１６個ずつ設けた例を示している。
【００８８】
セレクタＳＥＬ＿Ｈは、回転因子ベーステーブルの生成を指示する命令のオペランドから取得されたｅｘｐ（ｊ・（θ×１））の値（言い換えればｃｏｓθ及びｓｉｎθの値）、及び演算回路［０］３０１−０内の演算器３０３−０の出力値ｅｘｐ（ｊ・β0）が入力され、いずれか一方を選択して出力する。保持用フリップフロップＦＦ＿Ｈは、セレクタＳＥＬ＿Ｈの出力をラッチし、ラッチした値を値ｅｘｐ（ｊ・γ）として出力する。
【００８９】
演算回路［ｉ］３０１−ｉは、ｎを整数として回転因子ベーステーブルを構成するｅｘｐ（ｊ・θ×（１６ｎ＋ｉ））の値をそれぞれ算出するための演算回路である。なお、ｉは添え字であり、ｉ＝０〜１５の整数である。なお、本実施形態において演算回路［ｉ］３０１−ｉは、プロセッサにおいて処理する長い配列に対するダイナミックレンジを確保するために浮動小数点型データとして演算処理を行う。演算回路［ｉ］３０１−ｉでの演算に浮動小数演算を利用することで精度の良い回転因子ベーステーブルを生成することができる。
【００９０】
演算回路［０］３０１−０は、演算器３０３−０、セレクタＳＥＬ＿０−１、ＳＥＬ＿０−２、及びフリップフロップＦＦ＿０を有する。セレクタＳＥＬ＿０−２は、フリップフロップＦＦ＿０の出力値、及び演算回路［１５］３０１−１５内のフリップフロップＦＦ＿１５の出力値が入力され、いずれか一方を選択して値ｅｘｐ（ｊ・α0）として出力する。演算器３０３−０は、セレクタＳＥＬ＿０−２の出力値ｅｘｐ（ｊ・α0）及び保持用フリップフロップＦＦ＿Ｈの出力値ｅｘｐ（ｊ・γ）を受けてｅｘｐ（ｊ・（α0＋γ））の演算を行い、演算結果を値ｅｘｐ（ｊ・β0）として出力する。
【００９１】
セレクタＳＥＬ＿０−１は、演算器３０３−０の出力値ｅｘｐ（ｊ・β0）、及び予め与えられるｅｘｐ（ｊ・（θ×０））の値（すなわちｃｏｓ０＝１及びｓｉｎ０＝１）が入力され、いずれか一方を選択して出力する。フリップフロップＦＦ＿０は、セレクタＳＥＬ＿０−１の出力をラッチし、ラッチした値を出力する。
【００９２】
演算回路［１］３０１−０は、演算器３０３−１、セレクタＳＥＬ＿１−１、及びフリップフロップＦＦ＿１を有する。演算器３０３−１は、フリップフロップＦＦ＿１の出力値ｅｘｐ（ｊ・α1）及び保持用フリップフロップＦＦ＿Ｈの出力値ｅｘｐ（ｊ・γ）を受けてｅｘｐ（ｊ・（α1＋γ））の演算を行い、演算結果を値ｅｘｐ（ｊ・β1）として出力する。セレクタＳＥＬ＿１−１は、演算器３０３−１の出力値ｅｘｐ（ｊ・β1）、及び命令オペランドから取得されたｅｘｐ（ｊ・（θ×１））の値が入力され、いずれか一方を選択して出力する。フリップフロップＦＦ＿１は、セレクタＳＥＬ＿１−１の出力をラッチし、ラッチした値を出力する。
【００９３】
演算回路［２］３０１−２〜演算回路［１５］３０１−１５はそれぞれ同様に構成される。演算回路［ｋ］３０１−ｋ（ｋは添え字であり、ｋ＝２〜１５の整数）は、演算器３０３−ｋ、セレクタＳＥＬ＿ｋ−２、及びフリップフロップＦＦ＿ｋを有する。セレクタＳＥＬ＿ｋ−２は、フリップフロップＦＦ＿ｋの出力値、及び演算回路［（ｋ−１）］３０１−（ｋ−１）内のフリップフロップＦＦ＿（ｋ−１）の出力値が入力され、いずれか一方を選択して値ｅｘｐ（ｊ・αk）として出力する。演算器３０３−ｋは、セレクタＳＥＬ＿ｋ−２の出力値ｅｘｐ（ｊ・αk）及び保持用フリップフロップＦＦ＿Ｈの出力値ｅｘｐ（ｊ・γ）を受けてｅｘｐ（ｊ・（αk＋γ））の演算を行い、演算結果を値ｅｘｐ（ｊ・βk）として出力する。フリップフロップＦＦ＿ｋは、演算器３０３−ｋの出力値ｅｘｐ（ｊ・βk）をラッチし、ラッチした値を出力する。
【００９４】
変換回路３０２−０〜３０２−１５は、演算回路３０１−０〜３０１−１５のそれぞれ対応するように設けられる。変換回路３０２−０〜３０２−１５は、対応する演算回路３０１−０〜３０１−１５の出力を浮動小数点型データから整数型データに変換して出力する。このように回転因子データを浮動小数点型データから整数型データに変換してデータメモリに格納するようにすることで、回転因子データの記憶に要するメモリ容量を低減することができる。
【００９５】
制御回路３０５は、第３の演算処理部２８が有するセレクタ及びフリップフロップの制御を行う。例えば、制御回路３０５は、選択し出力する信号の切り替えをセレクタの各々に対して独立して制御したり、フリップフロップの各々におけるラッチタイミングを独立して制御したりする。
【００９６】
次に、本実施形態におけるプロセッサの動作について説明する。以下では、図２２及び図２３を参照して回転因子ベーステーブル生成処理を実行する際の動作について説明するが、その他の処理を実行する際の動作については第１の実施形態と同様である。図２２は、第２の実施形態における回転因子ベーステーブル生成処理の例を示すフローチャートであり、図２３は、第２の実施形態における回転因子ベーステーブル生成処理を説明するための図である。なお、以下では、ＦＦＴポイント数が１２８であり、図１９（Ｂ）に示した６４個の回転因子データで構成される回転因子ベーステーブルを生成する場合を例に説明するが、これに限定されるものではなく、設定されるＦＦＴポイント数に応じて演算の実行回数を変更すれば良い。
【００９７】
まず、プロセッサに対して回転因子ベーステーブルの生成を指示する命令のオペランドに格納された値ｅｘｐ（ｊ・（θ×１））及びＦＦＴポイント数を取得する（Ｓ４０１）。そして、回転因子テーブル生成開始時に、演算回路［０］３０１−０のフリップフロップＦＦ＿０にセレクタＳＥＬ＿０−１を介して値ｅｘｐ（ｊ・（θ×０））をラッチさせる。また、演算回路［１］３０１−１のフリップフロップＦＦ＿１にセレクタＳＥＬ＿１−１を介して値ｅｘｐ（ｊ・（θ×１））をラッチさせるとともに、保持用フリップフロップＦＦ＿ＨにセレクタＳＥＬ＿Ｈを介して値ｅｘｐ（ｊ・（θ×１））をラッチさせる（Ｓ４０２）。
【００９８】
次に、サイクル１にて、演算回路［２］３０１−２の演算器３０３−２に、セレクタＳＥＬ＿２−２を介して演算回路［１］３０１−１のフリップフロップＦＦ＿１の出力値ｅｘｐ（ｊ・（θ×１））を入力するともに、保持用フリップフロップＦＦ＿Ｈの出力値ｅｘｐ（ｊ・（θ×１））を入力する。演算器３０３−２は、ｅｘｐ（ｊ・（θ×（１＋１）））の演算を実行する。そして、サイクル２にて、演算回路［２］３０１−２のフリップフロップＦＦ＿２が、演算器３０３−２の演算結果ｅｘｐ（ｊ・（θ×２））をラッチする（Ｓ４０４）。
【００９９】
また、サイクル２にて、演算回路［３］３０１−３の演算器３０３−３に、セレクタＳＥＬ＿３−２を介して演算回路［２］３０１−２のフリップフロップＦＦ＿２の出力値ｅｘｐ（ｊ・（θ×２））を入力するともに、保持用フリップフロップＦＦ＿Ｈの出力値ｅｘｐ（ｊ・（θ×１））を入力する。演算器３０１−３は、ｅｘｐ（ｊ・（θ×（２＋１）））の演算を実行する。そして、サイクル３にて、演算回路［３］３０１−３のフリップフロップＦＦ＿３が、演算器３０３−３の演算結果ｅｘｐ（ｊ・（θ×３））をラッチする（Ｓ４０４）。
【０１００】
以降、同様にサイクル３〜サイクル１５にて、演算回路３０１−３〜３０１−１５が、ｅｘｐ（ｊ・（θ×４））→ｅｘｐ（ｊ・（θ×５））→・・・→ｅｘｐ（ｊ・（θ×１５））というように順に演算を実行する（Ｓ４０３〜Ｓ４０５）。このようにして、第３の演算処理部２８は、複数サイクルかけてｅｘｐ（ｊ・（θ×０））〜ｅｘｐ（ｊ・（θ×１５））の値を算出する。
【０１０１】
また、サイクル１５では、演算回路［０］３０１−０の演算器３０３−０に、セレクタＳＥＬ＿０−２を介して演算回路［１５］３０１−１５のフリップフロップＦＦ＿１５の出力値ｅｘｐ（ｊ・（θ×１５））を入力するともに、保持用フリップフロップＦＦ＿Ｈの出力値ｅｘｐ（ｊ・（θ×１））を入力する。演算器３０３−０は、ｅｘｐ（ｊ・（θ×（１５＋１）））の演算を実行する。そして、サイクル１６にて、保持用フリップフロップＦＦ＿Ｈが、演算回路［０］３０１−０の演算器３０３−０での演算結果ｅｘｐ（ｊ・（θ×１６））をラッチする（Ｓ４０６）。なお、この演算回路［０］３０１−０の演算器３０３−０での演算結果ｅｘｐ（ｊ・（θ×１６））は、制御回路３０５の制御によって演算回路［０］３０１−０のフリップフロップＦＦ＿０にはラッチされない。すなわち、演算回路［０］３０１−０のフリップフロップＦＦ＿０にラッチされている値は、ｅｘｐ（ｊ・（θ×０））のままである。
【０１０２】
続いて、サイクル１６にて、演算回路３０１−０〜３０１−１５の各フリップフロップＦＦ＿０〜ＦＦ＿１５が保持している値ｅｘｐ（ｊ・（θ×０））〜ｅｘｐ（ｊ・（θ×１５））がデータメモリへ出力される（Ｓ４０８）。このとき、値ｅｘｐ（ｊ・（θ×０））〜ｅｘｐ（ｊ・（θ×１５））は、図２２（Ｂ）に示すフローに従って変換回路３０２−０〜３０２−１５により浮動小数点型データから整数型データに変換されてデータメモリへ出力される（Ｓ４２１、Ｓ４２２）。
【０１０３】
また、サイクル１６にて、演算回路［０］３０１−０の演算器３０３−０に、セレクタＳＥＬ＿０−２を介してフリップフロップＦＦ＿０の出力値ｅｘｐ（ｊ・（θ×０））を入力するともに、保持用フリップフロップＦＦ＿Ｈの出力値ｅｘｐ（ｊ・（θ×１６））を入力する。演算器３０３−０は、ｅｘｐ（ｊ・（θ×（０＋１６）））の演算を実行する（Ｓ４１０）。同様に、サイクル１６にて、各演算回路３０１−１〜３０１−１５の演算器３０３−１〜３０３−１５に、それぞれ内部のフリップフロップＦＦ＿１〜ＦＦ１５の出力値ｅｘｐ（ｊ・（θ×１））〜ｅｘｐ（ｊ・（θ×１５））を入力するともに、保持用フリップフロップＦＦ＿Ｈの出力値ｅｘｐ（ｊ・（θ×１６））を入力する。そして、演算器３０１−１〜３０１−１５で、ｅｘｐ（ｊ・（θ×（１７））〜ｅｘｐ（ｊ・（θ×（３１））を算出する（Ｓ４１０）。
【０１０４】
そして、サイクル１７にて、各演算回路３０１−０〜３０１−０のフリップフロップＦＦ＿０〜ＦＦ＿１５が、演算器３０３−０〜３０３−１５の演算結果ｅｘｐ（ｊ・（θ×（１６））〜ｅｘｐ（ｊ・（θ×（３１））をラッチする（Ｓ４０９〜Ｓ４１１）。続いて、演算回路３０１−０〜３０１−１５の各フリップフロップＦＦ＿０〜ＦＦ＿１５が保持している値ｅｘｐ（ｊ・（θ×（１６））〜ｅｘｐ（ｊ・（θ×（３１））が変換回路３０２−０〜３０２−１５により浮動小数点型データから整数型データに変換されてデータメモリへ出力される（Ｓ４０８）。
【０１０５】
以降、ｅｘｐ（ｊ・（θ×ｎ）と示したときのｎの値が（ＦＦＴポイント数／２）より小さい間、各演算回路３０１−１〜３０１−１５の演算器３０３−１〜３０３−１５で、それぞれ内部のフリップフロップＦＦ＿１〜ＦＦ１５の出力値と保持用フリップフロップＦＦ＿Ｈの出力値とを用いて同様の演算を繰り返し行う。このようにして、ｅｘｐ（ｊ・（θ×（３２））〜ｅｘｐ（ｊ・（θ×（４７））の値、及びｅｘｐ（ｊ・（θ×（４８））〜ｅｘｐ（ｊ・（θ×（６３））の値を算出してデータメモリへ出力する。これにより、図１９（Ｂ）に示した回転因子ベーステーブルを生成してデータメモリに展開することができる。
【０１０６】
第２の実施形態によれば、算出したいＦＦＴポイント数で３６０°（２π）を分割した最小角度をθとしてｅｘｐ（ｊ・θ）の値とＦＦＴポイント数とを与えることで回転因子ベーステーブルを作成してデータメモリに展開する。これにより、データメモリに回転因子ベーステーブル用のメモリ領域を確保しておく必要がなくなり、ＲＡＭ領域として使用できるメモリ領域が広がる。また、回転因子ベーステーブルを格納したメモリ領域に異なるデータを書き込んだとしても、改めて回転因子ベーステーブルを作成してデータメモリに展開することも可能である。なお、本実施形態では、ｅｘｐ（ｊ・（θ×（１５））までの値を求める際に１サイクル毎に１つの値を算出するようにしているが、１サイクル中に複数の値を求めるような構成としても良い。
【０１０７】
なお、前述した各実施形態では、データメモリの各バンクは１ラインあたり１６個のデータ要素を配置することができるデータ幅を持つものとしているが、これに限定されるものではなく、他のデータ幅を有する場合でも同様に適用可能である。また、データメモリは、プロセッサチップに内蔵されたものとしているが、プロセッサとは別のチップとして実装されていても良い。
【０１０８】
また、前記実施形態は、何れも本発明を実施するにあたっての具体化のほんの一例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、またはその主要な特徴から逸脱することなく、様々な形で実施することができる。
【符号の説明】
【０１０９】
１０  制御部
２０  演算部
２１  第１の演算処理部
２２、２２Ａ、２２Ｂ  第２の演算処理部
２３Ａ  ２データ間引き部
２３Ｂ  ４データ間引き部
２５Ａ、２５Ｂ  セレクタ制御部
２６Ａ、２６Ｂ  セレクタ
２８  第３の演算処理部
３１、３４  ＦＩＦＯバッファ
３２  入力バッファ
３３  出力バッファ
１００  命令処理部
２００  データメモリ
【図１】
2016139394.tif 000005
【図２】
2016139394.tif 000006
【図３】
2016139394.tif 000007
【図４】
2016139394.tif 000008
【図５】
2016139394.tif 000009
【図６】
2016139394.tif 000010
【図７】
2016139394.tif 000011
【図８】
2016139394.tif 000012
【図９】
2016139394.tif 000013
【図１０】
2016139394.tif 000014
【図１１】
2016139394.tif 000015
【図１２】
2016139394.tif 000016
【図１３】
2016139394.tif 000017
【図１４】
2016139394.tif 000018
【図１５】
2016139394.tif 000019
【図１６】
2016139394.tif 000020
【図１７】
2016139394.tif 000021
【図１８】
2016139394.tif 000022
【図１９】
2016139394.tif 000023
【図２０】
2016139394.tif 000024
【図２１】
2016139394.tif 000025
【図２２】
2016139394.tif 000026
【図２３】
2016139394.tif 000027