【文献】
Venkatram Muddhasani and Meghanad D. Wagh,Bilinear algorithm for discrete cosine transforms of prime length,Signal Processing,ELSEVIER,2006年,Vol.86, Issue 9,pp.2393-2406
(58)【調査した分野】(Int.Cl.,DB名)
各セットのM個の内部入力値に対して、前記ベース演算の実行時に前記ベース回路により用いられる対応するセットの係数値を生成するよう構成された係数生成回路をさらに備える、請求項1〜請求項8のいずれか1項に記載のデータ処理装置。
前記空間領域から前記周波数領域へのフォワード変換および前記周波数領域から前記空間領域への逆変換のうちの1つを実行するよう構成された、請求項1〜請求項9のいずれか1項に記載のデータ処理装置。
各セットのM個の内部入力値に対して前記係数生成回路により生成された前記対応するセットの係数値が、データ処理装置がフォワード変換を実行するよう構成されているかまたは逆変換を実行するよう構成されているかに関わらず、同一である、請求項9に従属する場合の請求項10に記載のデータ処理装置。
前記変換回路が前記ベース回路に提供するための追加的セットのM個の内部入力値を生成するようさらに構成され、前記ベース回路が、離散コサイン変換行列による前記追加的セットのM個の内部入力値の行列積に等価である離散コサイン変換演算を実行することにより、前記追加的セットのM個の内部入力値に対して離散コサイン変換を実行するよう構成された、請求項3に従属する場合の請求項1〜請求項11のいずれか1項に記載のデータ処理装置。
前記ビデオデータのエンコードを実行する間はフォワード離散コサイン変換を実行するよう構成され、前記ベース回路が、前記複数セットのM個の内部入力値に対する前記ベース演算の実行の後にフォワード離散変換演算を前記離散コサイン変換演算として実行するよう構成された、請求項12に記載のデータ処理装置。
前記ビデオデータのデコードを実行する間は逆離散コサイン変換を実行するよう構成され、前記ベース回路が、前記複数セットのM個の内部入力値に対する前記ベース演算の実行の前に逆離散変換演算を前記離散コサイン変換演算として実行するよう構成された、請求項12に記載のデータ処理装置。
前記加算器回路が、各セットの前記M個の内部入力値を生成するために、前記加算演算および減算演算のうちの少なくとも1つを並列的に実行するためのM個のレーンの並列処理を提供するSIMD回路として構成される、請求項4に従属する場合の請求項1〜請求項17のいずれか1項に記載のデータ処理装置。
前記追加的加算器回路が、前記ベース回路により生成された各セットの前記M個の内部出力値に対して加算演算および減算演算のうちの前記少なくとも1つを並列的に実行するためのM個のレーンの並列処理を提供するSIMD回路として構成される、請求項5に従属する場合の請求項1〜請求項18のいずれか1項に記載のデータ処理装置。
N個のデータ値のそれぞれの行およびそれぞれの列に対して前記空間領域と前記周波数領域との間の前記変換を別個に実行することにより、N×Nの配列のデータ値を含むビデオデータブロックに対する演算を実行するよう構成され、
前記行および前記列のそれぞれに対して前記ベース回路により実行される乗算の合計数が、
3n−1+3n−2+…+9+Z(ただしZは≦9であり、N=2nである)である、
請求項1〜請求項19のいずれか1項に記載のデータ処理装置。
現在選択されたビデオ規格に応じて各セットのM個の内部入力値に対して前記ベース回路に供給される前記対応するセットの前記係数を設定することを前記係数生成回路に対して行わせることにより、異なるビデオ規格をサポートするよう構成可能である、請求項9に従属する場合の請求項1〜請求項20のいずれか1項に記載のデータ処理装置。
【発明の概要】
【発明が解決しようとする課題】
【0009】
より高い性能およびより低いエリアコストのビデオエンコーダおよびデコーダを提供することが継続的に望まれている。したがって、ビデオデータに適用されるフォワード変換演算および逆変換演算を実行する間に要求される乗算の個数を減少化させることが望まれるであろう。この望みは、より新しいビデオ規格(例えばHEVC規格など)によりサポートされる変換のサイズが増大化されるにつれて、より切実なものとなりつつある。
【課題を解決するための手段】
【0010】
第1の態様の観点からは、本発明は、ビデオデータ処理時に空間領域と周波数領域との間の変換を実行するためのデータ処理装置を提供し、このデータ処理装置は、N個の入力値を受け取り、前記N個の入力値の空間領域と周波数領域との間の変換を表すN個の出力値を生成するための一連の演算を実行するよう構成された変換回路と、変換回路に戻すためのM個の内部出力値を生成するために、変換回路により生成されたM個(ただしMは4以上である)の内部入力値を受け取り、係数cの配列を含み且つ
c
0 c
1 c
2 …c
M−1
c
1 c
2 c
3 …c
M
c
2 c
3 c
4 … c
M+1
…
c
M−1 c
M c
M+1 … c
2M−2
の形を有する行列による前記M個の内部入力値の行列積に等価であるベース演算を実行するよう構成されたベース回路と、を備え、変換回路は、前記一連の演算を実行する間、N個の入力値から複数セットの前記M個の内部入力値を生成することと、複数セットの前記M個の内部出力値を生成するために各セットのM個の内部入力値を前記ベース回路に提供することと、前記複数セットのM個の内部出力値からN個の出力値を導出することと、を行うよう構成される。
【0011】
本発明によれば、データ処理装置はベース回路を反復的に使用するよう構成される。なおベース回路は、係数cの配列を含み且つ
c
0c
1 c
2 …c
M−1
c
1c
2 c
3 …c
M
c
2c
3 c
4 … c
M+1
…
c
M−1c
M c
M+1 … c
2M−2
の形を有する行列によるM個の内部入力値の行列積に等価であるベース演算を実行するよう構成される。
【0012】
Mは4以上であり、1つの実施例においてMは4に等しい。変換回路は、複数セットのM個の内部入力値を生成するために、最初に提供されたM個の入力値に操作を加える。なおここで、各セットのM個の内部入力値はベース回路に通される。したがって、ベース回路は変換回路により生成された各セットのM個の内部入力値に対して反復的に使用される。次に変換回路はN個の出力値を、ベース回路により生成された複数セットのM個の内部出力値から導出する。
【0013】
本発明の上述の技術はしばしば、2次元変換を実装するために、一連の1次元変換に対して反復的に用いられるであろう。それぞれの1次元変換に対して、1セットのN個の入力値がデータ処理装置の変換回路に入力されるであろう。本発明によれば、各セットのM個の内部入力値は、特定の提供されたセットのN個の入力値に対して1回だけベース回路に通され、ベース回路により生成された内部出力値のいずれもが、ベース回路により実行される乗算の後続の反復に対する入力として用いられることはない。したがって、本発明に係る装置を用いるならば反復的な乗算は実行されず、したがってこのことにより、本装置はHEVCビデオ規格などの現代の規格に要求されるビットイグザクトな結果を生成することが可能である。
【0014】
ベース回路内で用いられる特定の形の行列は、通常の対角線に対して斜交する対角線上の要素(すなわち正に傾斜する対角線上の要素)がすべて等しくなっている正方行列であり、ハンケル行列としても知られる。本発明の発明者らは、現代のビデオ処理基準により要求されるより大きい変換に対してさえも、空間領域と周波数領域との間の要求される変換が、ハンケル行列を用いて、より小さいサイズの反復的な行列積を可能にする様式で因数分解されることを見出した。
【0015】
ベース回路により実行されるベース演算は、上述した形のハンケル行列のいかなる特定の事例も処理することができ、したがって係数c
0〜c
2M−2に割り当てられた値に関わらずハンケル行列によるM個の内部入力値の行列積に等価である演算を実行することができる。したがって、例えば、ベース回路は、たとえ係数c
0〜c
2M−2の全部が異なる値を有したとしても、および/またはこれらの係数の全部がベース回路に提供されるM個の内部入力値の各セットに対して異なったとしても、要求される演算を実行することができる。
【0016】
さらに、本発明の技術はエンコードおよびデコードの両方に対して用いられ得、異なるサイズのNに対して容易に拡張される。
【0017】
上述の構成により、空間領域と周波数領域との間でN個の入力値を変換するために要求される乗算の個数における顕著な減少化が可能であることが見出された。例えば、新しいHEVCビデオ規格により要求される前述の32点の変換について考えると、本発明の技術によれば、HEVC標準ソフトウェアにより用いられる部分的バタフライ手法と比較して約1/3の乗算の個数が要求されることが見出された。HEVC標準ソフトウェア(http://r2d2n3po.tistory.com/61においてHM−8.0としても知られる)は論文標準(paper Standard)に対する標準的実装として用いられる標準Cコード実装である。
【0018】
空間領域と周波数領域との間で実行される変換は様々な形を取り得るが、しかし1つの実施形態では、離散コサイン変換である。
【0019】
変換回路が、ベース回路に提供される各セットのM個の内部入力値が生成されるよう構成されることができる方法は多数存在する。一方、1つの実施形態において変換回路は並べ替え回路を備え、並べ替え回路は、K個のグループの入力値を生成するために、受け取られたN個の入力値を並べ替えるよう構成される。なお、K=N/Mであり、したがって各グループはM個のメンバーを有し、各メンバーは前記受け取られたN個の入力値のうちの1つである。次に加算器回路は、各セットの前記M個の内部入力値を生成するために、選択されたグループからの対応するメンバーに対して加算演算および減算演算のうちの少なくとも1つを実行するよう構成される。
【0020】
並べ替え回路により実行される実際の並べ替えは、装置が空間領域から周波数領域へのフォワード変換を実行するために、または周波数領域から空間領域への逆変換を実行するために用いられているかに依存するであろう。同様に、加算器回路により実行される加算演算および減算演算は、フォワード変換が実行されているかまたは逆変換が実行されているかに応じて異なるであろう。
【0021】
変換回路がN個の出力値を複数セットのM個の内部出力値から導出するよう構成される様式は、実施形態に応じて変動し得る。一方、1つの実施形態において、変換回路は、N個の中間出力値を生成するためにベース回路により生成された複数セットの前記M個の内部出力値に対して加算演算および減算演算のうちの少なくとも1つを実行するよう構成された、追加的加算器回路をさらに備える。加算器回路および追加的加算器回路により実行される加算/減算は、装置がフォワード変換を実行するために、または逆変換を実行するために用いられているかに依存するであろう。
【0022】
1つの実施形態において、変換回路は、シフトされた中間出力値を生成するためにN個の中間出力値に対してシフト演算を実行するよう構成されたシフト回路をさらに備える。シフト演算は、様々なセットのM個の内部入力値に対してベース回路の反復的演算が実行された後、N個の中間出力値が生成された後に、1回だけ実行されることに注意すべきである。このことは、結果が正確であること保証するように作用する。1回シフトされた値は出力され、循環されない(他の関連する1次元変換のために入力値を形成するかもしれない場合を除く)。
【0023】
1つの実施形態において、シフト演算は飽和演算を含む。再び、シフト演算の場合と同様に、飽和演算も1回だけ実行される。
【0024】
1つの実施形態において、変換回路は、前記N個の出力値を生成するためにN個のシフトされた中間出力値を並べ替えるよう構成された追加的並べ替え回路をさらに備える。追加的並べ替え回路により実行される並べ替えは、N個の入力値に対して並べ替え回路により実行された並べ替えに依存するであろう。
【0025】
1つの実施形態において、この装置は、各セットのM個の内部入力値に対して、ベース演算を実行するときにベース回路により用いられる対応するセットの係数値を生成するよう構成された係数生成回路をさらに備える。したがって、このセットの係数値は、ベース回路の各反復に対して設定されることができる。
【0026】
前述のようにこの装置は、空間領域から周波数領域へのフォワード変換または周波数領域から空間領域への逆変換を実行するために用いられることができる。1つの実施形態において、この装置は、フォワード変換の実行または逆変換の実行の間で切り替えが可能となるよう構成可能である。
【0027】
1つの特定の実施形態において、各セットのM個の内部入力値に対して係数生成回路により生成された対応するセットの係数値は、データ処理装置がフォワード変換を実行するよう構成されているかまたは逆変換を実行するよう構成されているかに関わらず、同一である。したがって、並べ替え回路、加算器回路、追加的加算器回路、および追加的並べ替え回路の動作は、この装置がフォワード変換を実行しているかまた逆変換を実行しているかに応じて変更されるであろうが、ベース回路の基本的演算は不変であり、この装置が同一のビデオ規格に準拠して動作すると仮定すると、正確に同一の係数が係数生成回路により生成される。
【0028】
様々な実施形態に係る装置が前述のベース演算の複数反復を実行する一方で、通常は、小さい変換、特にM×Mの変換を実行することが依然として必要とされるであろう。したがって、1つの実施形態において、変換回路は、ベース回路に提供するための追加的セットのM個の内部入力値を生成するようさらに構成され、ベース回路は、離散コサイン変換行列による前記追加的セットのM個の内部入力値の行列積に等価である離散コサイン変換演算を実行することにより、前記追加的セットのM個の内部入力値に対して離散コサイン変換を実行するよう構成される。
【0029】
1つの特定の実施形態において、データ処理装置は、ビデオデータのエンコードを実行する間にフォワード離散コサイン変換を実行するよう構成され、ベース回路は、前記複数セットのM個の内部入力値に対するベース演算の実行の後にフォワード離散変換演算を離散コサイン変換演算として実行するよう構成される。
【0030】
それとは対比的に、データ処理装置がビデオデータのデコードを実行する間に逆離散コサイン変換を実行するよう構成されている場合、ベース回路は、前記複数セットのM個の内部入力値に対してベース演算を実行する前に逆離散変換演算を離散コサイン変換演算として実行するよう構成される。
【0031】
Nの値は実施形態に応じて変動し得る。1つの実施形態においてNはMの倍数である。1つの特定の実施形態においてNは2の累乗に制約される。
【0032】
前述のように、Mは4以上であり得、1つの実施形態においてMは4に等しく設定される。したがって、係る実施形態において、実行される全部の乗算は、Nのサイズに関わりなく4×4行列に対するものである。
【0033】
加算器回路は様々な方法で構成されることができるが、しかし1つの実施形態において加算器回路は、各セットの前記M個の内部入力値を生成するために前記加算演算および減算演算のうちの少なくとも1つを並列的に実行するためのM個のレーンの並列処理を提供するSIMD回路として構成される。
【0034】
同様に、1つの実施形態において、追加的加算器回路は、ベース回路により生成された各セットの前記M個の内部出力値に対して前記加算演算および減算演算のうちの少なくとも1つを並列的に実行するためのM個のレーンの並列処理を提供するSIMD回路として構成され得る。
【0035】
上述のように、空間領域と周波数領域との間でN個の入力値を変換するために要求される乗算の個数は、上述の実施形態に係る技術を用いると、顕著に減少化される。1つの特定の実施形態において、データ処理装置は、空間領域と周波数領域との間の前記変換をN個のデータ値の各行および各行に対して別個に実行することにより、N×N配列のデータ値を含むビデオデータブロックに対して動作するよう構成され、各前記行および各前記列に対して前記ベース回路により実行される乗算の総数は3
n−1+3
n−2+…+9+Zである(ただしZは≦9であり、N=2
nである)。Zの値は単一のM×M離散コサイン変換を実行するために要求される乗算の個数に依存し、32×32配列(すなわちN=32)上で動作するよう構成され且つM=4である1つの特定的な実装において、6つの乗算が単一の4×4離散コサイン変換に対して要求される(すなわちZ=6)ことが見出された。上記の式から、これにより123個の乗算が要求されることとなる。これは、前述の部分的バタフライ手法により要求されるであろう乗算の個数の約1/3である。
【0036】
上述の実施形態に係る装置は顕著な柔軟性を提供することが見出されている。同一の装置がフォワード変換および逆変換の両方を実行するよう構成されることが可能であるばかりか、それに加えてこの装置は異なるビデオ規格をサポートするよう構成され得る。特に、1つの実施形態において、この装置は、現在選択されたビデオ規格に応じて各セットのM個の内部入力値に対してベース回路に供給される対応するセットの係数を設定することを係数生成回路に行わせることにより、異なるビデオ規格をサポートするよう構成可能である。
【0037】
第2の態様の観点からは、本発明は、ビデオデータ処理時に空間領域と周波数領域との間の変換を実行するための方法を提供し、この方法は、N個の入力値を受け取り、前記N個の入力値の空間領域と周波数領域との間の変換を表すN個の出力値を生成するための一連の演算を実行するために変換回路を用いることと、変換回路により生成されたM個(ただしMは4以上である)の内部入力値を受け取り、変換回路に戻すためのM個の内部出力値を生成するために、係数cの配列を含み且つ
c
0 c
1 c
2 …c
M−1
c
1 c
2 c
3 …c
M
c
2 c
3 c
4 … c
M+1
…
c
M−1 c
M c
M+1 … c
2M−2
の形を有する行列による前記M個の内部入力値の行列積に等価であるベース演算を実行するためにベース回路を用いることと、を含み、変換回路による前記一連の演算の実行は、N個の入力値から複数セットの前記M個の内部入力値を生成することと、複数セットの前記M個の内部出力値を生成するためにベース回路に各セットのM個の内部入力値を提供することと、前記複数セットのM個の内部出力値からN個の出力値を導出することと、を含む。
【0038】
第3の態様の観点からは、本発明は、ビデオデータ処理時に空間領域と周波数領域との間の変換を実行するためのデータ処理装置を提供し、このデータ処理装置は、N個の入力値を受け取り、前記N個の入力値の空間領域と周波数領域との間の変換を表すN個の出力値を生成するための一連の演算を実行するための変換手段と、変換手段に戻すためのM個の内部出力値を生成するために、変換手段により生成されたM個(ただしMは4以上である)の内部入力値を受け取り、係数cの配列を含み且つ
c
0 c
1 c
2 …c
M−1
c
1 c
2 c
3 …c
M
c
2 c
3 c
4 … c
M+1
…
c
M−1 c
M c
M+1 … c
2M−2
の形を有する行列による前記M個の内部入力値の行列積に等価であるベース演算を実行するためのベース回路手段と、を備え、変換手段は、前記一連の演算を実行する間、N個の入力値から複数セットの前記M個の内部入力値を生成し、複数セットの前記M個の内部出力値を生成するために各セットのM個の内部入力値をベース回路手段に提供し、前記複数セットのM個の内部出力値からN個の出力値を導出する。
【0039】
本発明について、以下の添付の図面において示される本発明の実施形態を参照しつつ、単なる例として、さらに詳細に説明する。
【発明を実施するための形態】
【0041】
図1はビデオデータのフレーム10を示す。なおこのフレームはブロック15の配列であり、各ブロックはデータ値20のN×N配列を含む。それぞれのデータ値は通常、複数ビット(例えば16ビット)のデータを含むであろう。入力ビデオデータに対してエンコード演算が実行されるときは、そのデータを空間領域から周波数領域に変換するために、それぞれの係るブロック15に2次元変換演算が実行されるであろう。通常、フォワード離散コサイン変換(FDCT)演算が係るエンコードを実行するために実行されるであろう。同様に、ビデオデータのエンコードされたフレームをデコードするときは、受け取られたエンコードされた信号を周波数領域から空間領域に変換するために、それぞれのブロックに2次元逆離散コサイン変換(IDCT)演算が実行されるであろう。
【0042】
実際、2次元DCT演算は一連の1次元DCT演算により実行される。例えば、通常は、1次元DCT演算が行のそれぞれに対して実行され、それによりいくつかの中間結果が生成され、引き続き、対応する一連の1次元DCT演算がこれらの中間結果のそれぞれの列に対して実行される。したがって、N×Nブロックに対して、要求される2次元DCT演算を実装するために2N個の1次元DCT演算が実行される必要があることとなる。
【0043】
図2は、入力値x
0〜x
N−150の行または列に対して実行される標準的な1次元DCT演算を概略的に示す。これらのN個の入力値50に、N×N行列の係数値を含むN×N行列60が掛けられる。
図2に概略的に示すように、それぞれの行における係数に対して対応する入力値が掛けられ、それらの乗算結果が合計されて、関連する出力値が作られる。このようにしてN個の出力値X
0〜X
N−170が生成されるであろう。
【0044】
それぞれの1次元変換演算に対して多量の乗算が実行されなければならないことが、
図2から理解されるであろう。例えば、Nが32である場合を考えると、それぞれの1次元変換演算は32×32個の乗算、すなわち1024個の乗算を要求するであろう。前述のように、既知のバタフライ技術は乗算の個数を減少させるために用いられることができる。特にNが32である場合を再び考えると、既知のバタフライ技術を用いると乗算の個数を342に減少させることができる。しかし、ビットイグザクトな結果を達成しつつ、それぞれの1次元変換演算を実行するために要求される乗算の個数をさらに減少化させることが望まれるであろう。
【0045】
図3Aは、N×NのIDCT行列を一連のより小さい行列に細分化することを可能にするために、逆変換演算に対して説明される実施形態にしたがって採用される因数分解手法を概略的に示す。特に、説明される実施形態によればN×NのIDCT行列100は効果的に行列110により置き換えられる。なお行列110は行列100よりも大きい(すなわち対角線がより長い)が、非ゼロ要素をより少なく含み、通常、行列110におけるより多くの係数値は実際にゼロである。行列110を通る対角線経路に沿って、いくつかのより小さいM×M行列が定義される。この具体例では、Mは4に等しいと仮定され、図示のように一連のL4行列120が提供され、各L4行列は前述の形のハンケル行列(すなわち通常の対角線に対して斜交する対角線上の要素がすべて等しくなっている線形相関行列)である。L4行列120の1例における係数の実際値は通常、L4行列の他の例における値とは異なるであろう。
【0046】
図示のように、最初のIDCT(T4)行列130が提供され、この行列130は4×4のサイズのIDCT行列である。説明される実施形態に係る装置内に提供されるベース回路は、行列110の上部左側における行列から始まるこれらの定義された4×4行列の例130および120を用いて行列積を反復的に実行するために用いられることができる。しかしベース回路に提供されるM個の内部入力値は、供給されるN個の入力値に基づいてそれぞれの反復に対して別個に導出されなければならない。
図4を参照して後に検討するように、これは、K個のグループの入力値を生成するために受け取られたN個の入力値を並べ替える並べ替え回路を用いることにより達成される。なおここでK=N/Mであり、したがって各グループはM個のメンバーを有し、各メンバーは受け取られたN個の入力値のうちの1つである。さらに、次に加算器回路は、各セットのM個の内部入力値を生成するために、選択されたグループからの対応するメンバーに対して一連の加算演算および減算演算を実行するために用いられる。実行されなければならない要求される加算演算および減算演算は、
図3Aに示す0および+/−1の行列105内で定義される。同様に、ベース回路により生成される内部出力値は、N個の入力値のIDCTに対応するN個の出力値を生成するために用いられる前に、操作を必要とする。特に、
図4を参照して後に検討するように、追加的加算器回路はベース回路により生成された複数セットのM個の内部出力値に対して一連の加算演算および減算演算を実行するために用いられる。なおここで、0および+/−1の値の行列115が、要求される加算演算および減算演算を指定する。
【0047】
図3Bは、いかにして同一の基本的な因数分解手法がフォワードDCT演算を実行するために用いられることができるかを示す。特に、N×NのFDCT行列140は、同様の構成のより小さいM×M(この場合4×4)の行列を含む行列150に効果的に細分化される。特に、一連のL4行列120が再び提供されるが、この事例では、FDCT4×4(F4)行列160が
図3AのIDCT4×4(T4)行列130に代わって提供される。加えて、
図3Aの例ではT4行列の積がベース回路による最初の反復として実行される一方で、ベース回路はF4行列の積160を最終反復として実行する。再び、0および+/−1の値の行列145が、それぞれの反復に対してベース回路に提供される内部入力値を生成するときに加算器回路により実行される加算演算および減算演算を定義するために用いられ、同様に、0および+/−1の行列155がベース回路により生成される内部出力値を処理するために用いられる追加的加算器回路により要求される加算演算および減算演算を指定するために用いられる。
【0048】
図3Aおよび
図3Bに示す様々な行列の相対的サイズを考え、次に元の行列100および140がN×Nであると仮定し、さらにN=2
n=4×2
n−2であるならば、行列110または150の幅は4×(3
n−3+3
n−4+…+3+1+1)である。N=32である具体例を考えると、n=5となり、したがって行列110または150の幅は4×(9+3+1+1)すなわち56となる。したがって、行列110および150のそれぞれは56×56の行列となるであろう。その事例では、行列105および145は32(横)×56(縦)となり、行列115および155は56(横)×32(縦)となるであろう。
【0049】
図4は1つの実施形態に係るデータ処理装置内に提供される構成要素を示すブロック図である。並べ替え回路200は、各セットのN個の入力値を受け取るよう構成され、内部格納器205内に格納されるK個のグループの入力値を作るために、これらのN個の入力値に対して並べ替えを実行するよう構成される。KはN/Mに等しく、したがってそれぞれのグループはM個のメンバーを有する。ここで各メンバーは受け取られたN個の入力値のうちの1つである。したがって例えばNが32でありMが4である場合、格納器205内に8個のグループが存在することであろう。
【0050】
次に加算器回路210が、ベース回路215(本明細書ではL
M回路とも呼称される)に提供される各セットのM個の内部入力値を生成するために用いられる。加算器回路は、選択されたグループからの対応するメンバーに対して演算を行うよう構成され、したがって1つの反復において、選択されたいくつかのグループからのメンバー0に対して演算を実行し得、他の反復ではいくつかのグループからのメンバー1に対して演算を実行し得る。
図3Aおよび
図3Bを参照して前述したように、行列105および125は、任意の特定の反復に対して要求される加算演算および減算演算を判定するために、加算器回路により参照される。
【0051】
逆変換が実行される
図3Aの事例を考えると、第1反復の間、加算器回路は、M×MのIDCT行列を形成するTM行列を用いて行列積が実行されるM個の内部入力値を生成することが理解されるであろう。
図3Aの具体例に対して、Mは4であると仮定され、したがって第1反復の間に加算器回路210により生成されるM個の内部入力値に対して、ベース回路215を用いてT4行列130による行列積が行われるであろう。係数生成回路220はT4行列130内に含まれる係数の値を生成する。次にベース回路215はM個の内部出力値を生成するために要求される行列積演算を実行し、このM個の内部出力値は追加的加算器回路225に導かれるであろう。次に、追加的加算器回路は、格納器230内に格納される中間出力値を生成するために行列115により定義される加算演算および減算演算を実行する。これらの中間出力値は、K個のグループの中間出力値を形成すると考えられ得る。ここで再び、各グループはM個のメンバーを有し、各メンバーは中間出力値のうちの1つである。格納器230は、全部の反復が実行されるときまでに格納器230がN個の中間出力値の全部によりポピュレートされるよう、ポピュレートされる。
【0052】
図3Aの例に戻ると、小さい4×4のIDCT変換が実行される第1反復の後、次に一連の行列積が、生成されたセットのM個の内部入力値を、様々な線形相関行列120により乗算するために、複数の反復にわたって実行されるであろう。
図3Aにおいて、これらの線形相関行列のそれぞれは4×4のハンケル行列の形を取る。それぞれの反復に対して、加算器回路210は、各セットの内部入力値を生成するときに実行される適切な加算演算および減算演算を判定するために、行列105を参照するであろう。係数生成回路220はそれぞれの反復に対して適切な係数値を生成するであろう。同様に、追加的加算器回路225は、各反復の間にベース回路により生成される内部出力値に対して実行される適切な加算演算および減算演算を判定するために、行列115を参照するであろう。
【0053】
要求される反復の全部が実行されたときには、格納器230はすでにN個の内部出力値によりポピュレートされていて、これらの内部出力値はシフトおよび飽和回路235に通され、その回路において、シフトおよび飽和演算が、シフトおよび飽和された中間出力値を生成するために、実行される。シフトおよび飽和演算はN個の中間出力値の全部が生成された後に1回だけ実行され、これは結果がビットイグザクトであることを保証するように作用し、特に処理を実行する間に複数段階でシフトおよび飽和演算を反復的に実行することにより導入されるであろう丸め誤差が回避されることに注意すべきである。
【0054】
次にシフトおよび飽和された中間出力値は追加的並べ替え回路240に通され、追加的並べ替え回路240は、要求されるN個の出力値を生成するために、N個のシフトおよび飽和された中間出力値を並べ替えるよう構成される。追加的並べ替え回路240により実行される並べ替えは、入力値に対して並べ替え回路200により実行された並べ替えに依存する。
【0055】
図4の回路は、ビデオデータをエンコードする間は空間領域から周波数領域にそのデータを変換するためのフォワード変換を実行するか、またはデータをデコードする間は周波数領域から空間領域にそのデータを変換するための逆変換を実行するよう、構成され得る。並べ替え回路200および追加的並べ替え回路240により実行される並べ替えは、装置がフォワード変換または逆変換を実行するために用いられているかに依存するであろう。同様に、加算器回路210および追加的加算器回路225により実行される加算演算および減算演算は、フォワード変換が実行されているかまたは逆変換が実行されているかに応じて異なるであろう。
【0056】
係数生成回路220は、逆変換演算を実行するときにはT4行列130に対する係数を生成する必要があり、またはフォワード変換を実行するときにはF4行列140に対する係数を生成する必要があるであろう。しかしL4行列120のそれぞれの例に対して生成される係数は、いくつかの場合(例えば、より大きいHEVC行列に対して。そこでは、フォワード行列は逆行列の入れ換えである)において、装置をフォワード変換と逆変換との実行の間で再構成するとき、不変である。したがって、複数反復のL4行列積を実行すると、ベース回路の実行はこれらの場合において不変であり、正確に同一の係数が係数生成回路220により生成される。
【0057】
この装置は様々なビデオ規格を実装するためにも用いられることができる。一方、係数生成回路220により生成される係数は異なるビデオ規格の間で変動するであろう。それとは対比的に、並べ替え回路200、加算器回路210、追加的加算器回路225、および追加的並べ替え回路240の基本的演算は通常、ビデオ規格が変わっても影響されることはない。
【0058】
図5は1つの実施形態に係る加算器回路210および追加的加算器回路225内に提供される構成要素を示す。この事例ではMは4に等しいものと仮定される。したがって、K個のグループのM個の入力値が
図4の格納器205内に格納されたときには、各グループは4つのメンバーを有することが理解されるであろう。この事例において、格納器205は、加算器回路210の一部を形成すると考えられ、4つのレジスタバンクVB0 300、VB1 305、VB2 310、およびVB3 315を備え、各レジスタバンクは、グループのそれぞれからの対応するメンバーを格納するための十分なレジスタを有する。したがって、Nが32である例を考えると、8つのグループが存在し、各グループは4つのメンバーを有する。レジスタバンク300、305、310、315のそれぞれは、8つのグループのそれぞれからの対応するメンバーが格納されることができるよう、8つのレジスタを提供するであろう。
【0059】
並べ替え回路200により生成された並べ替えられた入力値は通常、RAM内にバッファされ、次に連続的にin0およびin1入力を介して(サイクル毎に2つのデータ値)並べ替えられた順序で関連するレジスタバンク300、305、310、315にロードされる。
【0060】
対応する2入力加算器320、325、330、335はレジスタバンク300、305、310、315のそれぞれに関連付けられた状態で提供され、図示の実施形態では、各クロックサイクルの間に、これらの加算器のうちの2つはL4回路340に提供するための内部入力値を生成するために用いられ、その一方で他の2の加算器は所望により、関連付けられたレジスタバンク内に戻るよう供給されて格納される中間値を生成するために用いられ得る。L4回路340により実行される各行列積に対して、4つの内部入力値が要求され、したがって、L4回路340により実行される各行列積に対して要求される入力を生成するために2つのクロックサイクルが費やされる。
【0061】
1つの実施形態において、様々な加算器回路320、325、330、335は、L4回路340により処理される4点の変換へと32点の変換を細分化するためにバタフライ演算およびカラツバ再帰を実行する。
【0062】
加算器回路210により実行される演算は、この実施形態では、次にL4回路340の演算が4つのパイプラインステージP1からP4を占有する状態で、第1パイプラインステージP0内で実行される。次に、追加的加算器回路225は第6パイプラインステージP5を占有する。図示のように、L4回路340の最終ステージはサイクル毎に2つの内部出力値を生成し、これらの内部出力値はレジスタ345および350内に一時的に格納される。次に、レジスタ345内に格納されたそれぞれの値は適切な方法で加算器回路375または加算器回路380に提供されるであろう。同様に、レジスタ350内に格納されたそれぞれの値は適切な方法で加算器回路385または加算器回路390に提供されるであろう。最初、加算器回路375、380、385、390はこれらの値を、関連付けられたレジスタバンクWB0 355、WB1 360、WB2 365、およびWB3 370に戻すであろう。次に、加算器回路375、380、385、390は、4点L4変換出力から32点変換出力を再構築するためにバタフライ演算およびカラツバ再帰を使用し、処理の後のステージにおいて、このことの結果として、2つのレジスタバンク392および394はN個の中間出力値でポピュレートされることとなるであろう。
【0063】
全部の積がL4回路により実行されると、レジスタ392および394の内容はN個の中間出力値を表すであろう。次に、これらの値は、シフトおよび飽和された中間出力値を生成するためのシフトおよび飽和回路396および398を通るよう導かれ、次に、このシフトおよび飽和された中間出力値は、N個の出力値に対して要求される最終的な順序に戻るようこれらの値を並べ替えるための追加的並べ替え回路240に導かれることができる。
【0064】
図5の回路は、4の倍数である入力値の個数をサポートするために用いられることができ、1つの特定の実施形態において、入力値の個数は、N個の入力値が4つの入力値、8個の入力値、16個の入力値、32個の入力値、その他となるよう、2の累乗に限定される。Nが実際に4に設定される場合は、
図5に示すように、バイパス経路が、加算器回路320、325、330、335および追加的加算器回路375、380、385、390の周りに提供され得る。したがってこの最適化は、NがMに設定されたとき回路を通る低レイテンシ経路を可能にする。しかし、パイプライン経路P6のシフトおよび飽和ステージは全部の変換サイズに対して依然として用いられるであろう。
【0065】
複数の加算器回路320、325、330、335は、4セットの加算/減算を実行するために並列的に動作するよう、SIMDの様式で配列され得る。しかし、1つの実施形態において、加算器回路D0 320およびD2 330の動作は、第1サイクルでは、加算器回路320および330だけが用いられてL4回路に提供するための2つの内部入力値を生成し、一方、次のサイクルでは加算器回路325および335がL4回路に提供するための2つの追加的内部入力値を生成するために用いられるよう、加算器回路325および335の動作に対して交互配列される。その第2サイクルの間、加算器320および330が再び用いられるが、第2サイクルでは、それぞれのレジスタバンク300および310に戻るよう導かれるための中間値を生成するであろう。次のサイクルにおいて、加算器320および330がL4回路に内部入力値を提供し、加算器325および335がそれぞれのレジスタバンク305および315に戻るよう導かれるための中間値を生成する状態で、4つの加算器の全部が再び用いられ得る。これは、サイクル毎に2つの内部入力値をL4回路340に提供する一方で並列的に中間的な加算および減算が実行されることを可能にするための、効果的な機構を提供する。出力加算器回路375、380、385、390は、SIMD加算演算および減算演算を実行するために同様の様式で構成され得る。
【0066】
1つの実施形態において、それぞれの提供される入力値は16ビットのサイズであり、レジスタバンク300、305、310、315は、加算器回路320、325、330、335により実行される加算により生成され得るより大きいサイズのオペランドを収容するために、18ビットの入力および出力を有する。したがって加算器回路320、325、330、335も18ビットの入力および出力を有する。追加的加算器回路225内で、レジスタバンク355、360、365、370および加算器回路375、380、385、390のそれぞれは、1つの実施形態において、L4回路340内で実行される乗算の結果として生成され得るサイズの内部出力値を収容するために、32ビットの入力および出力の幅を有する。シフトおよび飽和回路396および398の動作は、レジスタバンク392および394から受け取られた関連する32ビットの入力を取り、16ビットの出力(すなわち、入力値と同一サイズの出力値)を作る。
【0067】
図6Aおよび
図6Bは1つの実施形態に係る
図4の回路の動作を示すフローチャートを提供する。ステップ400において、N個の入力値が並べ替え回路200に提供され、引き続きステップ405において、K個のグループのM個の値を作るために並べ替えが実行される(並べ替えは、装置がFDCTまたはIDCTを実行するよう構成されるかどうかに依存する)。ステップ410において、装置がIDCTを実行するよう構成されているかどうかが判定される。IDCTを実行するよう構成されている場合、処理はステップ415に進行し、ステップ415において、加算器回路210が、IDCT演算が実行されるM個の内部入力値を生成するために用いられる。ステップ420において、これらのM個の内部入力値は、適切な係数値が係数生成回路220により提供されたM×MのIDCT行列を用いて行列積を実行するためにベース回路215に通される。
【0068】
次に処理はステップ425に進行し、ステップ425において、加算器回路210は、ハンケル行列による乗算が行われる複数セットのM個の内部入力値を生成するために、格納器205内の選択されたグループからの対応するメンバーに対して加算演算および減算演算を実行するために用いられる。次にステップ430において、各セットの内部入力値は、複数反復の行列積をハンケル行列(LM線形相関行列とも呼称される)を用いて実行するために、連続的にベース回路215に通される。前述のように、係数生成回路220は通常、それぞれの反復に対して別個のセットの係数値を生成するであろう。
【0069】
次に処理はステップ435に進行し、ステップ435においてFDCTが実行されているかが判定される。FDCTが実行されていない場合、次に処理は直接にステップ450に進行する。逆にFDCTが実行されている場合には、
図6Aに示すようにステップ415および420はバイパスされ、それに代わってステップ425および430の実行に引き続きステップ440および445が次に実行されるであろう。特にステップ440において、加算器回路210が、M×MのFDCT行列を用いてFDCT行列積が実行されるM個の内部入力値を生成するために用いられる。その後、ステップ445において、これらのM個の内部入力値はベース回路215に通され、次にベース回路215は要求される行列積を、FDCT行列を用いて実行する。再び、係数生成回路220はM×MのFDCT行列のための適切な係数値を生成する。
【0070】
ステップ445に引き続き、またはIDCTが実行されている場合には直接的にステップ435の後に、処理はステップ450に進行し、ステップ450において、追加的加算器回路が、N個の中間出力値を作るために、ベース回路215により生成された複数セットのM個の内部出力値に対して加算演算および/または減算演算を実行するために用いられる。
図6Bでは、ステップ450はベース回路により実行されるベース演算の全部の反復が実行された後に実行されるものとして示されるが、代替的な実施形態では、追加的加算器回路は、各セットのM個の内部出力値に対して、それらの値がベース回路により生成される都度、動作し得ることが理解されるであろう。
【0071】
ステップ450が実行されたならば、格納器230はN個の中間出力値を含むであろう。ステップ455において、シフトおよび飽和回路235は、シフトおよび飽和された中間出力値を生成するためにシフトおよび飽和演算を中間出力値に適用する。次に、追加的並べ替え回路240はN個の出力値を生成するために、シフトおよび飽和回路235により提供された出力値を並べ替えるための追加的並べ替え演算を実行する。この時点で、N個の出力値はN個の入力値のビットイグザクトな変換を表すであろう。追加的並べ替え回路240により実行される実際の並べ替えは、FDCTが実行されているかまたはIDCTが実行されているかに依存するであろう。
【0072】
上述の実施形態の機構を用いることにより、現代のビデオ規格(例えばHEVC規格など)により要求されるビットイグザクトな結果を保持しつつ、それぞれの1次元変換に対して要求される乗算の個数の顕著な減少化が可能であることが見出された。この技術はエンコードおよびデコードのために用いられ得、Nの異なるサイズに拡張可能である。1つの実施形態において、それぞれの1次元変換に対してベース回路215により実行される乗算の合計数は3
n−1+3
n−2+…+9+Zである。ただしZは≦9であり、N=2
nである。Zの値は単一のM×M離散コサイン変換を実行するために要求される乗算の個数に依存し、32×32配列(すなわちN=32)上で動作するよう構成され且つM=4である1つの特定的な実装において、6つの乗算が単一の4×4離散コサイン変換に対して要求される(すなわちZ=6)ことが見出された。上記の式から、123個の乗算が要求されることとなる。これは、既知の部分的バタフライ手法により要求されるであろう乗算の個数の約1/3である。
【0073】
要求されるLM行列の反復回数は上述の式から直接的に導かれ得る。特に、Mが4に等しく、したがって複数反復のL4行列積がベース回路により実行される事例に対して、9個の乗算がそれぞれのL4行列積を実装するために要求される。Nが32である場合、上述のように123個の乗算が要求されるとき、これは単一の4×4の離散コサイン変換を実行するために要求される6つの乗算を含む。したがって、117個の乗算がL4行列積の乗算を実装するために要求され、特に、13反復のL4行列が存在し、それぞれが9個の乗算を要求するであろう。
【0074】
特定の実施形態に関する以下の追加情報が提供される。
【0075】
逆変換アルゴリズムの説明
このセクションでは、N点の逆離散コサイン変換演算に対して要求される演算をいかにして計算するかについて説明する。なお点の個数は2の累乗である。まず予測が以下の式
【数1】
【数2】
のように定義される。
【0076】
次に、N点の逆離散コサイン変換T
N(c
0,…,c
N−1)は、
【数3】
により与えられる行i、列jにおける要素を有する行列により定義され得る。実際には、係数c
iはc(k)=cos(kπ/2N)の概算された整数または小数の推定値であるが、特定の値を有する係数には依存せず、単に行列が上記の形を有するのみである。以下の行列
【数4】
は、小さいNに対するT
Nを示す。入力ベクトルxおよび出力ベクトルyは式y=T
Nxにより関連付けられる。
【0077】
次に、以下の式
q
N(k)=p
2N(3
k) これは1と2N−1との間の奇数である。 (式1)
t
N(k)=s
2N(3
k) (式2)
のように、さらに定義される。2つの並べ替え、P
NおよびQ
Nは次の式
【数5】
【数6】
のように定義される。
【0078】
並べ替えP
Nは線形ベクトルに対する符号付き並べ替えである(パターンをより明らかにするために、説明は複数の行にわたり分割される)。並べ替えQ
Nは符号を変化させることなく値の順序を変更することである。
【0079】
入力出力および係数値を並べ替えること、すなわち
【数7】
により、
【数8】
となるような新しい並べ替えられた変換
【数9】
が与えられる。ハンケル行列がさらに、次の式
【数10】
のように定義されるならば、第1の関係(R1)は、次の式
【数11】
のようになり、第2の関係(R2)は、次の式
【数12】
のようになる。関係(R1)は
【数13】
を
【数14】
およびL
N/2に減少させ、引き続きN個の加算および減算が行われる。
【0080】
関係(R2)はL
NをN/2個の加算に減少させ、引き続きL
N/2による3つの乗算の後、引き続きN個の加算が行われる。これは係数の減算を含まないが、係数は一定であると仮定され、減算された係数値は予め計算され得る。
【0081】
N=2
n≧8に対して、関係(R1)および(R2)を反復することは、再帰的に
【数15】
を加算に減少させ、引き続き
【数16】
による1つの乗算とL
4の形の行列による(3
n−3+…+1)個の乗算とが行われ、引き続き加算および減算が行われる。
【0082】
逆変換例
このセクションは、いかにして前のセクションの理論をN=16の実際的なケースに適用するかについて説明する。
【0083】
次の入力ベクトルから始めると、次の式
【数17】
は、次の式
【数18】
のように並べ替えられる。並べ替えられたベクトルは、次の式
【数19】
のように、それぞれ4つの要素の4つのグループまたはベクトルに分割される。同様に、これらの係数は次の式
【数20】
のように並べ替えおよびグループ化がなされる。出力ベクトルは次の4つの並べ替えられたグループ、すなわち
【数21】
に分割される。関係R1を適用することにより、次の式
【数22】
が与えられる。関係R1およびR2を適用することにより次の式
【数23】
が与えられる。これは、並べ替えを1つの
【数24】
および4つのL
4の演算に減少させる。
【0084】
フォワード変換アルゴリズムの説明
次に、N点の逆離散コサイン変換T
N(c
0,…,c
N−1)=NT
N−1は、次の式
【数25】
により与えられる行i、列jにおける要素を有する行列により定義され得る。
【数26】
と定義し、入力並べ替えおよび出力並べ替えを交換し、関係(R1)を反転させると、関係(R3)が次の式
【数27】
のように得られる。N=2
n≧8に対して、関係(R3)および(R2)を反復することは、再帰的に
【数28】
を加算および減算に減少させ、引き続き
【数29】
による1つの乗算とL
4の形の行列による(3
n−3+…+1)個の乗算とが行われ、引き続き加算が行われる。この関係は同様に逆変換の例にも適用され得る。
【0085】
実装例
以下のCコード例は、逆変換T
Nおよびフォワード変換F
Nを、それぞれ関数fact_idct_1d_i16()および関数fact_fdct_1d_i16()において実装する。
【0086】
/* 予測p()を計算する
*
* p(2×k×n+r)=r 0<=r<nである場合
* 2×n−r n<=r<2×nである場合
*/
static unsigned int p_n(unsigned int k, unsigned int n)
{
k=k%(2×n);
if (k>=n)
{
k=2×n−k;
}
return k;
}
/* 符号s()を計算する
*
* s(4×k×n+r)=+1 0≦r<nまたは3×n<r<4×nである場合
* 0 r==nまたはr==3×nである場合
* −1 n<r<2×nである場合
*/
static int s_n(unsigned int k, unsigned int n)
{
int s=+1;
k=k%(4×n);
if (k==n || k==3×n)
{
s=0;
}
else if (k>=n && k<3×n)
{
s=−1;
}
return s;
}
/* 線形相関
*
* y[i]=x[0]×c[i]+…+x[n−1]×c[i+n−1]
*
* n×nの相関は再帰により4×4の演算に細分化される。
*/
static void L_n(
int32_t *y, //出力(n個の要素)
const int32_t *x, //入力(n個の要素)
const int32_t *c, //係数(2×n−1個の要素)
unsigned int n //サイズ
)
{
assert(n>=4);
if (n==4)
{
/* L4を9個の乗算で実装する
* 係数は事前計算され得る
*/
int32_t v0=(x[0]+x[1])×(c[1]−c[3]);
int32_t v1=(x[2]+x[3])×(c[5]−c[3]);
int32_t v2=(x[0]+x[1]+x[2]+x[3])×c[3];
int32_t w0=v0+v2;
int32_t w1=v1+v2;
v0=x[0]×((c[0]−c[2])−(c[1]−c[3]));
v1=x[2]×((c[4]−c[2])−(c[5]−c[3]));
v2=(x[0]+x[2])×(c[2]−c[3]);
y[0]=w0+v0+v2;
y[2]=w1+v1+v2;
v0=x[1]×((c[2]−c[4])−(c[1]−c[3]));
v1=x[3]×((c[6]−c[4])−(c[5]−c[3]));
v2=(x[1]+x[3])×(c[4]−c[3]);
y[1]=w0+v0+v2;
y[3]=w1+v1+v2;
}
else /* n>4 */
{
int32_t x2[MAX_ITRANS_SIZE/4];
int32_t c0[MAX_ITRANS_SIZE/2];
int32_t c1[MAX_ITRANS_SIZE/2];
int32_t y2[MAX_ITRANS_SIZE/4];
unsigned int i;
unsigned int n2=n>>1;
/* 再帰の前に加算減算 */
for (i=0; i<n2; i++)
{
x2[i]=x[i]+x[n2+i];
}
/* 係数は事前計算され得る */
for (i=0; i<n−1; i++)
{
c0[i]=c[i]−c[n2+i];
c1[i]=c[n+i]−c[n2+i];
}
/* 再帰 */
L_n(y2,x2,c+n2,n2); // x[i]+x[(n/2)+i]に対してL4
L_n(y,x,c0,n2); // x[i]に対してL4
L_n(y+n2,x+n2,c1,n2);// x[(n/2)+i]に対してL4
/* 再帰後に追加的な加算/減算 */
for (i=0; i<n2; i++)
{
y[i]=y[i]+y2[i];
y[n2+i]=y[n2+i]+y2[i];
}
}
}
/* 行列T〜_n(c)を並べ替えられた入力および出力を用いて計算する */
static void TT_n(
int32_t *y, // 出力
const int32_t *x, // 入力
const int32_t *c, // 係数
unsigned int n //サイズ
)
{
/* 因数分解されたバージョン */
assert(n>=4);
if (n==4)
{
/* 6つの乗算における4点IDCT */
int32_t v0,v1,v2;
assert(c[0]==c[1]);
v0=x[2]×c[2];
v1=x[3]×c[3];
v2=(x[0]+x[1])×c[0];
y[0]=v2+v0+v1;
y[2]=v2−v0−v1;
v0=x[2]×c[3];
v1=x[3]×c[2];
v2=(x[0]−x[1])×c[0];
y[1]=v2+v0−v1;
y[3]=v2−v0+v1;
}
else /* n>4 */
{
int32_t c1[MAX_ITRANS_SIZE]; //拡張された相関
unsigned int i;
unsigned int n2 = n>>1;
/* 係数は事前計算され得る */
for (i=0; i<n2; i++)
{
c1[i]=c[n2+i];
c1[n2+i]=−c1[i];
}
/* 再帰 */
TT_n(y,x,c,n2);
L_n(y+n2,x+n2,c1,n2);
/* 再帰後に追加的な加算/減算 */
for (i=0; i<n2; i++)
{
int32_t y0=y[i];
int32_t y1=y[i+n2];
y[i]=y0+y1;
y[i+n2]=y0−y1;
}
}
}
/* 行列F〜_n(c)を並べ替えられた入力および出力を用いて計算する */
static void FF_n(
int32_t *y, //出力
int32_t *x, //入力(バタフライにより変更)
const int32_t *c, //係数
unsigned int n //サイズ
)
{
/* 因数分解されたバージョン */
assert(n>=4);
if (n==4)
{
/* 6つの乗算における4点FDCT */
int32_t v0,v1,v2;
assert(c[0]==c[1]);
v0=(x[0]−x[2])×c[2];
v1=(x[1]−x[3])×c[3];
v2=(x[0]+x[1]+x[2]+x[3])×c[0];
y[0]=v2;
y[2]=v0+v1;
v0=(x[0]−x[2])×c[3];
v1=(x[1]−x[3])×c[2];
v2=(x[0]−x[1]+x[2]−x[3])×c[0];
y[1]=v2;
y[3]=v0−v1;
}
else /* n>4 */
{
int32_t c1[MAX_ITRANS_SIZE]; //拡張された相関
unsigned int i;
unsigned int n2 = n>>1;
/* 係数は事前計算され得る */
for (i=0; i<n2; i++)
{
c1[i]=c[n2+i];
c1[n2+i]=−c1[i];
}
/* 再帰の前に加算減算 */
for (i=0; i<n2; i++)
{
int32_t x0=x[i];
int32_t x1=x[i+n2];
x[i]=x0+x1;
x[i+n2]=x0−x1;
}
/* 再帰 */
FF_n(y,x,c,n2);
L_n(y+n2,x+n2,c1,n2);
}
}
/* 因数分解された1次元線形整数IDCT */
void fact_idct_1d_i16
(
int16_t *y, //出力
const int16_t *x, //入力
const int16_t *c, //係数
unsigned int n //サイズ
unsigned int shift, //右シフト
int32_t R //丸め
)
{
int32_t Y[MAX_ITRANS_SIZE];
int32_t X[MAX_ITRANS_SIZE];
int32_t C[MAX_ITRANS_SIZE];
unsigned int i;
unsigned int k;
unsigned int m;
unsigned int q;
unsigned int p;
int s;
/* 入力に符号付き並べ替えを適用する */
X[0]=x[0];
C[0]=c[0];
m=n/2;
for (k=1;k<n;k=k<<1,m=m>>1)
{
q=1;
for (i=0;i<k;i++)
{
p=m×p_n(q,2×k);
s=s_n(q,2×k);
X[k+i]=(s>0)?x[p]:−x[p];
C[k+i]=(s>0)?c[p]:−c[p];
q=(q×3)%(8×n);
}
}
/* 並べ替えられた変換T〜_nを計算する */
TT_n(Y,X,C,n); // XおよびYが変更されたことに注意
/* 出力に(符号なし)並べ替えを適用する */
q=1;
for (i=0;i<n;i++)
{
p=p_n(q, 2×n)>>1;
y[p]=(Y[i]+R)>>shift;
q=(q×3)%(8×n);
}
}
/* 因数分解された1次元線形整数FDCT */
void fact_fdct_1d_i16
(
int16_t *y, //出力
const int16_t *x, //入力
const int16_t *c, //係数
unsigned int n //サイズ
unsigned int shift,//右シフト
int32_t R //丸め
)
{
int32_t Y[MAX_ITRANS_SIZE];
int32_t X[MAX_ITRANS_SIZE];
int32_t C[MAX_ITRANS_SIZE];
unsigned int i;
unsigned int k;
unsigned int m;
unsigned int q;
unsigned int p;
int s;
/* 入力に(符号なし)並べ替えを適用する */
q=1;
for (i=0;i<n;i++)
{
p=p_n(q, 2×n)>>1;
X[i]=x[p];
q=(q×3)%(8×n);
}
/* 係数に符号付き並べ替えを適用する */
C[0]=c[0];
m=n/2;
for (k=1;k<n;k=k<<1,m=m>>1)
{
q=1;
for (i=0;i<k;i++)
{
p=m×p_n(q,2×k);
s=s_n(q,2×k);
C[k+i]=(s>0)?c[p]:−c[p];
q=(q×3)%(8×n);
}
}
/* 並べ替えられた変換F〜_nを計算する */
FF_n(Y,X,C,n);
/* 出力に符号付き並べ替えを適用する */
y[0]=(Y[0]+R)>>shift;
m=n/2;
for (k=1;k<n;k=k<<1,m=m>>1)
{
q=1;
for (i=0;i<k;i++)
{
p=m×p_n(q,2×k);
s=s_n(q,2×k);
int32_t yy=(s>0)?Y[k+i]:−Y[k+i];
y[p]=(yy+R)>>shift;
q=(q×3)%(8×n);
}
}
}
【0087】
上述の実施形態から、係る実施形態は、異なるサイズのNに対してフォワード変換および逆変換の両方を実行するための拡大可能な機構を提供し、それにより変換を実行するために要求される乗算の個数に顕著な減少化がもたらされることと、係る実施形態はビットイグザクトな結果を作ることと、が理解されるであろう。
【0088】
本発明の特定の実施形態について本明細書で説明してきたが、本発明がそれらの特定の実施形態に限定されないこと、および多数の改変例が本発明の範囲から逸脱することなく可能であることは明白であろう。例えば、以下の従属請求項の特徴の様々な組み合わせは、本発明の範囲から逸脱することなく、独立請求項の特徴と組み合わせることが可能である。