Cプログラムにる画像処理について教えてください。逆高速フーリエ変換(IFFT)によって周波数領域から実空間領域に変換する際、周波数帯域を(低周波数領域に)制限してIFFTを実行できるという文献があるのですが可能でしょうか?通常の逆離散フーリエ変換(IDFT)では可能でした。
以下のコードの修正で可能でしょうか?
例) 512*512の空間周波数領域データを212*212(仮に)の低周波数領域に帯域制限してIFFTで画像に戻したいのです。
以下の以下の一次元FFTコードを用いてX方向とY方向にIFFTしたいと考えています。
void FFT(int ir, int nx, float *xr, float *xi, float *si, float *co, unsigned short *brv)
// 1次元フーリエ変換
// int ir; 順変換(1)と逆変換(-1)
// int nx; 1次元FFTのデータ数
// float *xr; 実部のデータ xr[nx]
// float *xi; 虚部のデータ xi[nx]
// float *si; FFT用のサインデータ si[nx/2]
// float *co; FFT用のコサインデータ co[nx/2]
// unsigned short *brv; FFT用の入れ替えデータ brv[nx]
{
int i, j, n1, n2=nx, j3, j4, k, l, ll, d=1, g;
float a, b, c, s;
for(l = 1; l <= nx/2; l *= 2, d += d) {
g = 0;
ll = n2;
n2 /= 2;
for(k = 1; k <= n2; k++) {
n1 = k-ll;
c = co[g];
s = -ir*si[g];
g += d;
for(j = ll; j <= nx; j += ll) {
j3 = j+n1-1;
j4 = j3+n2;
a = xr[j3]-xr[j4];
b = xi[j3]-xi[j4];
xr[j3] += xr[j4]; xi[j3] += xi[j4];
xr[j4] = c*a+s*b; xi[j4] = c*b-s*a;
}
}
}
通常のDFTでの帯域制限はこのように行い可能でした。
void fourier1d(int ir, float *fr, float *fi, int nx)
{
int i, j, n = 1;
float *gr, *gi;
double u, x;
gr = (float *)malloc((unsigned long)nx*sizeof(float));
gi = (float *)malloc((unsigned long)nx*sizeof(float));
for(i = 0 ; i < nx ; i++) {
u = i-nx/2;
gr[i] = gi[i] = 0;
for(j = 150 ; j < 362 ; j++) {
x = j-nx/2;
gr[i] += (float)( fr[j]*cos(2*PI*u*x/nx)+ir*fi[j]*sin(2*PI*u*x/nx));
gi[i] += (float)(-ir*fr[j]*sin(2*PI*u*x/nx)+fi[j]*cos(2*PI*u*x/nx));
}
}
if(ir == -1) n = 212; // 逆変換はデータ数で割る
for(i = 0 ; i < nx ; i++) {
fr[i] = gr[i]/n;
fi[i] = gi[i]/n;
}
free(gr);
free(gi);
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
文章は逆フーリエ変換だけどコードは (逆じゃない) フーリエ変換だ. どっちが正しいんだろう.
いずれにしても, 「FFT ないし IFFT の途中で帯域制限」はできないことはないだろうけどする必要があるかどうかが疑問. #1 でも言われてるけどおそらくかなり面倒なので, よほど狭い帯域に制限するのでなければ普通にやった方がお手軽かつ高速な可能性もあります.
# でもって, そこまで狭帯域に制限するなら DFT の方が速かったりする.
No.1
- 回答日時:
あんまりソース見ていないですけど、
(1)帯域制限をしてから(2)IFFTするということですか?
それなら簡単にできます。
FFTとDFTは演算量が違うだけで結果は同じですから。
圧縮では普通に使われる技術ですね(DCTだったりもしますが)。
それとも、
IFFTを実行しつつ帯域制限もして(制限した帯域の)無駄な演算も行わないということでしょうか?
やったこと無いですが、めんどうそうですね、
制限する帯域によっては効率よくできそうですが、普通のIFFT演算ではなくなりそうです。
IFFTを実行しつつ帯域制限もして(制限した帯域の)無駄な演算も行わないということです。帯域制限位相限定相関法(BLPOC)というものに使用します。IFFTを用いてやりたいのですがコード作成が難しくてできません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# キャスト演算について。 1 2023/07/15 15:28
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- 数学 関数項級数について一様収束するかどうか判定をお願いしたいです。 以下の式のΣ[n=1→∞]についてで 1 2023/01/26 16:32
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- 哲学 べき関数の微分での、べき乗数が定数になることは神が関与しているのでしょうか? 2 2023/03/03 09:43
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Android(アンドロイド) iPhoneには、なぜ僕が合計3台持ちしているGalaxy A22やXperiaXZ1、arrows 4 2022/07/12 18:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
intとlongは同じ?
-
画像の拡大・縮小
-
2の補数を計算するプログラム
-
分数の足し算をさせるプログラ...
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
ヌメロンのプログラム
-
| (or) を使った関数の引数の作...
-
迷路を脱出する経路探索プログ...
-
Cプログラムによる画像の高速フ...
-
16bitで乱数を生成する方法
-
当たり判定の処理がわかりません。
-
異なるn個の整数からr個の整数...
-
乱数で交互に偶数、奇数が、、、。
-
C言語でサイコロのプログラムを...
-
以下のプログラムはOpenCVで画...
-
3のつく数と3の倍数を表示 C言語
-
デバッグビルドとリリースビル...
-
コマンドプロンプトのウィンド...
-
argvのNULLチェック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報