Image-Pro |
サポート>Image-Pro plus 操作手順書>ファイルフォーマット仕様> | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
高速フーリエ変換ファイル
FFTファイルの内容は、Image-Pro Plus ver. 3.0 以降、若干変更されました。お使いのバージョンが Image-Pro Plus ver.
3.0以降の場合は、下記の「Image-Pro Plus ver. 3.0 以降の拡張」 の項を併せてご覧下さい。 |
16ビット長の 実数部分 |
16ビット長の 虚数部分 |
||
011000010 (194) |
0100111 (39) |
000111100 (60) |
1101010 (106) |
9ビット仮数 | 7ビット小数 | 9ビット仮数 | 7ビット小数 |
注記:浮動小数点形式の画像から作成した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 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
行 (v) |
3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
N=8 | 7 |
旧フォーマットのファイルはバージョン番号を記録していないため、新旧のファイルを区別するには、先頭の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バイト
注1:FFTの順変換のオプション設定で、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
Copyright © Hakuto Co., Ltd. All rights reserved.