サポート

Image-Pro
  操作手順書

サポートImage-Pro plus 操作手順書ファイルフォーマット仕様

高速フーリエ変換ファイル
(拡張子が"*.FFT"のファイル)

FFTファイルの内容は、Image-Pro Plus ver. 3.0 以降、若干変更されました。お使いのバージョンが Image-Pro Plus ver. 3.0以降の場合は、下記の「Image-Pro Plus ver. 3.0 以降の拡張」 の項を併せてご覧下さい。

高速フーリエ変換ファイル(FFTファイル)とは、"FFT"(高速フーリエ変換) ウィンドウの"Save"ボタンでFFTデータを保存した場合に作成されるファイルです。FFTファイルはバイナリ・ファイルで、中にはFFT配列の係数が入っています。"Forward FFT Options"(順方向FFTオプション) ダイアログボックスの"Full FFT"(フルセットFFT)オプションを選択した場合は、FFTデータ・セットの全体が記録されます。"Half FFT"(ハーフセットFFT)オプションを選択した場合は、FFTによって作成された配列の半分(配列の左側半分)と、それに加えて若干量のデータのみがFFTファイルに記録されます。但し、FFTデータ・セットは対称形のため、ここに記録されていない要素も簡単に復元できます。

FFTファイルに記録されたデータは、全て2バイトの整数から成っています。ファイルの先頭にある2バイトの整数は、FFT配列の幅(これを"M"と呼びます)を定義し、それに続く2番目の2バイト整数はFFT配列の高さ("N"と呼びます)を定義します。MおよびNの値のレンジは16から512までで、2のべき乗です。

上記4バイトのヘッダーに続くのはフーリエ係数です。ハーフセットのFFTデータのみを記録するFFTファイルの場合、この4バイトのヘッダーに続くフーリエ係数も、FFT配列の左半分から成っています(下記をご参照下さい)。

各係数(配列要素)は、2バイトの固定小数点実数部分と、それに続く2バイトの固定小数点虚数部分から成っています。4バイトの各係数は、ファイル内では次の例に示すようなフォーマットになっています。

16ビット長の

実数部分
16ビット長の

虚数部分
011000010

(194)
0100111

(39)
000111100

(60)
1101010

(106)
9ビット仮数 7ビット小数 9ビット仮数 7ビット小数

16ビットの各部分の中では、仮数が最上位の9ビットを占めています。仮数の値のレンジは-256から+256までです。小数部分は最下位の7ビットを占め、0から127/128までの値をとります。

注記:浮動小数点形式の画像から作成したFFT係数は8バイト長で、4バイトの浮動小数点実数部分と、それに続く4バイトの浮動小数点虚数部分から成ります。

フルセット・データのFFT配列の場合、FFTデータは「ゼロ周波数成分」を中心として対称形に並んでいます。2つの要素を例外として、どのFFT要素にも対称形の「対になる要素」があり、この要素は実数値は同じですが、虚数値が逆になっています。例外となる2つの要素とは、(0,0の位置の)先頭の配列要素と、ゼロ周波数成分です。これら2つの配列要素は固有要素です。

また、配列内の第1行目と第1列目は、ゼロ周波数成分中心ではなく、それ自体の中心点に対して対称形に配置されています。
記録されたFFTデータがハーフセットの場合、ファイルには(M/2+1)×N個の係数が入ります(但し、MとNはそれぞれFFT配列の幅と高さを表す)。上述のように、実際にファイルに記録されるのはFFT配列の左半分のみなので、配列幅の要素の数は(M/2+1)だけになります。
下の図は、完全な(フルセットの)FFT配列の配置を示しています(図では便宜上8×8の配列を示しますが、実際にImage-Proが作成する最小の配列は16×16サイズです)。この図には、ハーフセットのデータのみを作成した場合にFFTファイルに記録される部分[左半分。「ゼロ周波数成分」(ZFC)まで(ZFC自体を含む)]も示してあります。図の右側の要素(点線の部分)が再生される部分です。
配列内のラベルは、各要素の対称関係を示しています。他のデータとは異なり、第1列と第1行はZFC中心でなく、それ自体の中心点を軸として「鏡像」の対称関係にある点に注意して下さい

列(u)     M=8
      0 1 2 3 4 5 6 7  
    0
1x 2x 3x 4x 5x 4x 3x 2x
2y A B C D X W V
3y E F G H U T S
4y I J K L R Q P
5y M N O ZFC O N M
4y P Q R L K J I
3y S T U H G F E
2y V W X D C B A
    1
    2

(v)
  3
    4
    5
    6
N=8   7

FFT配列内のゼロ周波数成分は、N/2番目の行のM/2番目の列に位置します(但し、配列の最初の位置を0,0とする)。
FFTファイル内では、ZFC要素の先頭バイトは次の式で示される位置にあります。
4*(((M/2+1)*N/2)+M/2)+4
(但し、ファイルの先頭バイトをバイト0とする)
F(u,v)は、uの列、vの行にあるフーリエ係数を意味します。 F(u,v)は複素数で、次のように表現されます。
F(u,v)={R(u,v),I(u,v)}
(但し、上式でRは実数部分、Iは虚数部分とする)
0≦u≦M/2、0≦v≦N-1のとき、ファイル内でのF(u,v)の先頭バイトは次の式で表される位置にあります。
4*(((v*(M/2+1))+u)+4
F(0,0)の最初の部分は、バイト4の位置にあります。
FFT配列のハーフセットのみを記録した場合、図の右側半分のフーリエ係数を生成するには次の式を使用します。
0の列の右側には、次の式を適用します。
F(u,0)={R(M-u,0),-I(M-u,0)}
それ以外の列の右側には、次の式を適用します。
F(u,v)={R(M-u,N-v),-I(M-u,N-v)}
(但し、M/2<u<Mとする)

Image-Pro Plus ver. 3.0 以降の拡張:

Image-Pro Plus ver. 3.0 以降のFFT(高速フーリエ変換)機能は、2のべき乗以外の画像サイズに対応したことに伴い、FFTファイルフォーマットの拡張が必要となりました。新ファイルフォーマットにはバージョン番号が記録されており、これにより、今後フォーマットが拡張されても下位互換性が保たれます。

旧フォーマットのファイルはバージョン番号を記録していないため、新旧のファイルを区別するには、先頭の2バイト整数 (short型) に 0 がセットされているかどうかで判断します。この2つの数値に適正な幅と高さがセットされたファイルを読み込んだときは旧フォーマットのFFTファイル、2つの数値が (0, 0) ならば新フォーマットのFFTファイルと判断されます。

ver.3.0およびそれ以降の形式は次のようになっています。
バイト0 short型 0 (ver.3.0以前の旧バージョンではFFTデータの幅)
バイト2 short型 0 (ver.3.0以前の旧バージョンではFFTデータの高さ)
バイト4 short型 バージョン番号
バイト6 short型 画像形式: 5 = 32ビット浮動小数点形式、6 = 16ビット固定小数点形式
バイト8 double型 スペクトラム表示レンジの開始位置 (注1)
バイト16 double型 スペクトラム表示レンジの終了位置(注1)
バイト24 double型 位相表示レンジの開始位置 (注1)
バイト32 double型 位相表示レンジの終了位置 (注1)
バイト40 short型 0 = 実数/虚数、 1 = スペクトラム/位相
バイト42 short型 0 = フルセットデータ、0以外 = ハーフセットデータ
バイト44 short型 画像の幅
バイト46 short型 画像の高さ
バイト48 short型 元画像のデータ形式 (注2)
バイト50 4*short型 パディングされた画像中の、パディングされていない元画像の位置 (注3)
バイト58 スペクトラムまたは実数部
.........  位相または虚数部
 short型 = Cにおけるshort型整数 = Basicにおける整数 = 2バイト
 double型 = Cにおける倍精度浮動小数点数型 = Basicにおけるdouble型 = 8バイト

注1FFTの順変換のオプション設定で、8ビット整数のスペクトラム画像または8ビット整数の位相画像を生成した場合、FFTファイルに保存されるのは実数部分と虚数部分になります。これらは画像に直接表示されるものではなく、浮動小数点表示レンジを必要としません。
FFTの順変換のオプション設定で、実数 (浮動小数点) のスペクトラム画像と位相画像(またはそのいずれか)を生成した場合、実数データと虚数データは保持されず、スペクトラムと位相のデータがFFTファイルに保存されます。この場合、FFTデータは浮動小数点画像として表示されるので、データの表示には浮動小数点画像の表示レンジが必要となります。浮動小数点画像の表示レンジは、"Edit" (編集) メニューの "Info" (画像情報) コマンド で表示されます。
注2: 1 = 8 ビット/ピクセル、4 = 12 ビット/ピクセル、5 = 32 ビット/ピクセル、 6 = 16 ビット/ピクセル
注3: 画像サイズが2のべき乗ではない場合は、画像サイズより大きい、直近の2のべき乗の画像サイズにパディングされます。元の(小さな方の)画像の位置は、FFTデータが読み戻されたときに逆変換できるよう、FFTファイルに保存されます。元の画像の左、上、右、下の位置が格納されます。


FFTデータファイルの利用

以下のソース・コードは、Image-Proの FFTファイルを読み込むプログラムを開発する場合に、整数ベースのFFTファイル(FFTデータの半分だけが保存されたFFTファイル)を使ってどのように作業するかを示しています。

下の例のプログラムは、Image-ProのFFTファイルを読み、そのデータを[FFT]によって指された[width]×[height]バッファに保存します。次に、保存されていない半分のデータを復元します。

浮動小数点FFTデータも同様の方法で処理されますが、2バイトの固定小数点フォーマット・データの代わりに4バイトの浮動小数点データを使用して下さい。

#include "fft.h"

/*
Usage:
complex *fft;
char *filespec;
int width;
int height;
.
.
fft = C_ReadFFTData(filespec, &width, &height);
fft: pointer to a struct complex. Memory is allocated by
routine.
filespec: name of the file containing the FFT data.
width: width of the fft array (power of 2). Initialized by
routine.
height: height of the fft array (power of 2). Initialized by
routine.
*/

complex *
C_ReadFFTData(filespec,width,height)
char *filespec;
int *width, *height;
{
complex *fft;
FILE * DataFP;
int row, col;
complex *RowData = NULL;
FFTHEADER ffthead;
int temp = 0;
int retcod;
DataFP = fopen(filespec, "rb");
if (fread((char *)&ffthead, sizeof(FFTHEADER), 1, DataFP)< 1)
{
printf("File I/O Error\n");
return ((complex *)NULL);
}
*width = ffthead.Size;
*height = ffthead.Height;
RowData = (complex*)malloc((*width/2 + 1)*sizeof(complex));
fft = (complex*)malloc((*width)*(*height)*sizeof(complex));
for(row=0;row<*height;row++)
{
if(fread((char*)RowData, sizeof(complex),
*width/2 + 1, DataFP) == *width/2 + 1)
{
C_PutRowData(RowData,fft,row,*width,*height);
}
else
{
pritf("File I/O Error\n");
break;
}
}
free((unsigned char *)RowData);
fclose(DataFP);
return(fft);
}
C_PutRowData(dataline,fft,row,width,height)
complex dataline[];
complex *fft;
int row, width, height;
{
int col;
unsigned int offset1, offset2;
offset1 =row * width;
if (row!=0)
offset2 = (height - row) * width;
else
offset2 = 0;
fft[offset1].x = dataline [0].x;
fft[offset1].y = dataline [0].y;
for (col = 1; col<width/2; col++)
{
fft{offset1 + col].x = dataline [col].x;
fft{offset1 + col].y = dataline [col].y;
fft{offset2 + width - col}.x = dataline[col].x;
fft{offset2 + width - col}.y = dataline[col].y;
}
fft[offset1 + width/2].x = dataline[width/2].x;
fft[offset1 + width/2].y = dataline[width/2].y;
return(0);
}
構造体 "complex" は、それぞれ実数部と虚数部を表す 2 つの符号付き整数(各々2バイト)で構成されています。各整数は、実際には小数部分が下位7ビットに含まれる固定小数点数になっています。以下の例は、固定小数点"complex"を浮動小数点"complex"に変換しています。

typedef struct COMPLEX {int x; int y;} complex;
typedef struct FCOMPLEX {float x; float y;} fcomplex;

fcomplex
FixedToFloatingPoint(number)
complex number;
{
fcomplex fnumber;
fnumber.x = (float)number.x / 128.0;
fnumber.y = (float)number.y / 128.0;
return(fnumber);

}
FFT.Hは次のとおりです:
#define N 512L
#define DIRECT 1
#define INVERSE 2
#define FFT_MAX_SIZE N
#define MAXINDEX 255
#define SCALE 30
#define FIXEDPOINT
#ifdef FIXEDPOINT
#define FFTCLASS int
#define FFTLCLASS long
#else
#define FFTCLASS float
#define FFTLCLASS float
#endif
typedef struct COMPLEX { FFTCLASS x; FFTCLASS y;} complex;
typedef struct LCOMPLEX { FFTLCLASS x; FFTLCLASS y;} lcomplex;
typedef struct fftheader {
unsigned int Size; /* in pixels per line */
unsigned int Height; /* number of lines */
} FFTHEADER;
struct FFT {
FFTCLASS huge *Rp;
FFTCLASS huge *Ip;
unsigned int Length;
unsigned int Height;
unsigned int *Bit;
complex *W;
int LogN;
RECT sourcearea;
RECT spectrumarea;
RECT inversearea;
int NoDisplay;
};
#define SPECTRUM 1
#define PHASE 2
#define REAL 3
#define IMAGINARY 4
#define AOI_FFT (AOI_USER<<4)
int C_StoreDataInFile(MENU menu, char *filespec, struct FFT *fft);
int C_GetDataFromFile(MENU menu, char *filespec, struct FFT *fft);
int C_FreeData(struct FFT *fft);
int C_AllocateData(struct FFT *fft);
int C_TwoDimFFTd(struct FFT *fft);
int C_XorScanLine(int row, RECT *bounds, int horiz, int paneid);
int C_DisplayFTTline(lcomplex *Cout, RECT *lineaoi, int height, int flag);
int C_TwoDimFFTi(struct FFT *fft);
int C_DisplaySpectrum(struct FFT *fft);
int C_SetCoefTable(struct FFT *fft, int length);
int C_SetBitOrderTable(struct FFT :fft);
int _C_SetDataEnviron(struct FFT *ptr1, int *ptr2, int *ptr3, char *ptr4);
int C_FreeData(struct FFT *fft);
int Menu_Pop();
int _C_SetFFTenviron(struct FFT *data);
#define SCAN_HORIZ 1
#define SCAN_VERT 2
#define MAX_SPECTRUM_SIZE 256
#define LOGTABLELEN 512