問題タブ [kissfft]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - FFTW の fftw_plan_dft_r2c_1d() に対する KissFFT の同等の関数は何ですか?
fftw_plan_dft_r2c_1d
およびfftw_plan_dft_c2r_1d
FFTWを使用するプロジェクトと、 fftw_execute
. KissFFT の同等の機能は何ですか?
signal-processing - kissfftスケーリング
FFTとkissfftライブラリを使用して高速相関を計算しようとしていますが、スケーリングは正確である必要があります。どのようなスケーリングが必要ですか(順方向と逆方向)、データをスケーリングするためにどのような値を使用しますか?
android - Androidでfftを計算するためにネイティブC Kiss_fft.cを使用する
私の目標は、kiss_fft ライブラリをコンパイルして、Android 開発用の JNI で使用することです。ただし、最初は、C の Linux マシンで Kiss_fft ライブラリを使用しようとしています。
Kiss_fft ( Kissfft ) のKiss_fft.c または Kiss_fftr.c を使用し て DFT を計算する場合。ライブラリを自分のファイルにどのくらい正確にコンパイルしますか。ソース C ファイルの先頭に #include kiss_fft.h と #include kiss_fftr.h を追加し、kiss_fft ソース コードをプロジェクトのルート ディレクトリまたは Linux の /usr/include/ に配置してから、これに似たメイクファイル:
すべてのkiss_fftソースファイルを調べて、すべての依存関係を構築するためにこのmakeファイルを書きました。しかし、私はまだ得る
undefined reference to kiss_fft
undefined reference to kiss_fft_alloc
これは、kiss_fft ライブラリの内部関数です。
どんな助けでも大歓迎です。ありがとう
fft - キスFFTビン振幅
私はFFTの研究にかなりの時間を費やしてきました。KISSFFT は非常に移植性の高い C 実装であるため、特に KISSFFT の使用に興味があります。
i[x] と r[x] を周波数ビンの振幅に変換する方法はまだよくわかりません。そのため、signed int 16 バージョンの sin を作成しました。私の正弦波のサンプルは 512 個あります。1 つの Bin にはデータがあり、残りは 0 であると予想していました。そうじゃない...
これが私のコードです...
}
私はこのような結果を得ています....
image-processing - FFTコンボリューション-カーネルの適用方法
私は画像処理にかなり慣れていませんが、FFT畳み込みにより、カーネルサイズが大きい場合に畳み込みが大幅に高速化されることがわかりました。
私の質問は、kissFFTを使用しているときに、周波数空間の画像にカーネルを適用するにはどうすればよいですか?
私はすでに次のことをしました:
画像にRGB値を再度設定すると、元の画像が元に戻ります。したがって、変換は機能します。9x9ボックスブラー(1 / 9、1 / 9、... 1/9)などのカーネルを適用する場合は、今何をすべきですか。
高速畳み込みについていくつか読んだことがありますが、FFTの実装によって、それらはすべて異なります。フィルタを適用する前に注意しなければならないことの一種の「リスト」はありますか?
私の考え方:
imagesizeは2の累乗でなければなりません。画像と同じサイズのカーネルを作成する必要があります。9つの中間値を1/9に、残りを0に設定してから、このカーネルを周波数領域に変換し、ソースイメージにそれを乗算してから、ソースイメージを元に戻します。しかし、それは実際には機能しません:DD
c++ - FFTの質問を含むガウスぼかし
通常の畳み込みを使用したガウスぼかしの現在の実装があります。小さなカーネルには十分効率的ですが、カーネルのサイズが少し大きくなると、パフォーマンスが低下します。そこで、FFTを使って畳み込みを実装することを考えています。FFT関連の画像処理の経験がないので、いくつか質問があります。
2D FFTベースの畳み込みも2つの1D畳み込みに分離できますか?
- trueの場合、次のようになりますか?すべての行で1D FFT、次にすべての列で1D FFT、次に2Dカーネルで乗算し、次にすべての列の逆変換とすべての行の逆変換を行いますか?または、各1D FFT変換の後に1Dカーネルで乗算する必要がありますか?
これで、カーネルサイズは画像と同じサイズ(1Dの場合は行)である必要があることがわかりました。しかし、それはエッジにどのように影響しますか?画像の端をゼロで埋める必要がありますか?もしそうなら、カーネルサイズはパディングの前後の画像サイズと等しくなければなりませんか?
また、これはC ++プロジェクトであり、商用プロジェクトであるため、kissFFTを使用する予定です。より良い代替案を提案することを歓迎します。ありがとうございました。
編集:回答ありがとうございますが、もう少し質問があります。
入力画像の虚数部がすべてゼロになることがわかります。しかし、出力の虚数部もゼロになりますか?ガウスカーネルを実数部と虚数部の両方に乗算する必要がありますか?
同じ画像のインスタンスが異なるスケールでぼやけています。つまり、同じ画像が異なるサイズにスケーリングされ、異なるカーネルサイズでぼやけています。画像を拡大縮小するたびにFFTを実行する必要がありますか、それとも同じFFTを使用できますか?
最後に、FFTを視覚化する場合は、ログフィルターをFFTに適用する必要があることを理解しています。しかし、FFTを視覚化するためにどの部分を使用すべきか本当に迷っていますか?実数部または虚数部。
また、512x512のサイズの画像の場合、実数部と虚数部のサイズはどうなりますか。それらは同じ長さになりますか?
詳細な返信ありがとうございます。
image-processing - FFT 畳み込み - 非常に低い PSNR
画像 (512*512) を FFT フィルター (kernelsize=10) で畳み込みます。見栄えがします。
しかし、それを通常の方法で畳み込んだ画像と比較すると、結果は恐ろしいものでした.
PSNR は約 35 です。
67,187/262,144 ピクセル値に 1 以上の差があります (ピーク ~8) (最大ピクセル値は 255)。
私の質問は、周波数空間で畳み込むときは正常ですか、それとも畳み込み/変換機能に問題があるのでしょうか? . 奇妙なことに、データ型として double を使用すると、より良い結果が得られるはずです。しかし、それは完全に同じままです。
画像を周波数空間に変換するときは、たたみ込みを行わずに元に戻してください。float を使用すると、PSNR は約 140 になります。
また、ピクセルの違いはわずか 1 ~ 10 であるため、スケーリング エラーを除外できると思います。
編集:退屈な興味のある人のための詳細
私はオープンソースのkissFFTライブラリを使用しています。実際の 2 次元入力あり (kiss_fftndr.h)
私の画像データ型は PixelMatrix です。0.0 から 1.0 float までのアルファ、赤、緑、青の値を持つ単純なマトリックス
私のカーネルも PixelMatrix です。
Convolution 関数の抜粋
使用されるデータ型:
FFT の構成:
カーネルのパディングと変換:
色を配列に取得する:
畳み込み:
今あるもの:
- タイプ Kiss_fft_cpx* からの 3 つの変換されたカラー配列
- タイプ Kiss_fft_cpx から変換された 1 つのカーネル配列*
どちらも複雑な配列です
畳み込みが来ます:
今、私はそれらを元に戻します:
ノート:
- 画像のサイズが 2 のべき乗 (256*256)、(512*512) などであることは事前に確認しています。
例:
カーネルサイズ: 10
入力:
出力:
通常の畳み込みからの出力:
私のコンソールは言う:
私の目には同じように見えますが°.°
1 人は退屈してコードを調べているかもしれません。緊急ではありませんが、私が一体何を間違えたのか知りたいだけです^^
最後になりましたが、私の PSNR 機能ですが、それが問題だとは思いません :D
fft - KissFFT の kiss_fftr (実信号の FFT) 関数の結果を解釈する方法
KissFFT の real 関数を使用して、実際のオーディオ信号を変換しています。nfft サンプルの実際の信号を入力したため、混乱していますが、結果は nfft/2+1複素周波数ビンになります。
KissFFT の README から:
実際の (つまり、複雑ではない) 最適化コードは、偶数の長さの fft に対してのみ機能します。2 つの半分の長さの FFT を並列に実行し (real&imag にパック)、いじりながらそれらを結合します。結果は、DC からナイキストまでの nfft/2+1 複素周波数ビンです。
したがって、結果をどのように解釈するかについての具体的な知識はありません。私の仮定では、データは次のようにパックされていますr[0]i[0]r[1]i[1]...r[nfft/2]i[nfft/2]
。ここで、r[0] は DC、i[0] は最初の周波数ビン、r[1] は 2 番目などです。これは事実ですか?
c++ - FFT2D(高速フーリエ変換2D)の実行方法R、G、Bカラーコンポーネント
私は高速フーリエ変換(FFT)の初心者であり、C++などのプログラミング言語でどのように計算するかについてはあまり理解していません。これがFFT2Dの方法です
ヒント:画像ピクセルは、3つの別々の画像カラー(R、G、B)平面として保存され、それぞれが複素数の1D配列で表されます。画像のサイズが幅W、高さがHであるとすると、画像位置(m、n)のピクセルの色成分値(R、G、B)はR [m + n * W]、G( m + n * W)およびB [m + n * W]。ここで、R、G、Bは複素数の3つの配列です。変換された係数の1D配列も、同じ方法で表されます。
1つのカラーコンポーネントのみの処理を実装する必要があり、プログラミングテンプレートは、実装された関数に基づいてR、G、Bを個別に処理します。テンプレートはまた、各入力画像のサイズが2m * 2nになるように、画像にゼロを埋め込みます。
FFT1Dは、FFT2Dの関数の内部から呼び出しています。FFT2DのC、C ++、JavaおよびC#でいくつかの異なるタイプのコードを見つけました。それらのほとんどは、2D配列構造を使用して実装されています。行と列のループ内の2D配列構造に実数部と虚数部を割り当てます。しかし、私の場合は色成分の1D配列構造です。
いくつかのコードを実行してみましょう。これはFFT2D関数内にあります。
以前は、FFTIDを呼び出す前に、本のようにtwoKの値を計算する必要がありました。M=2K
何かアイデアや参考資料があれば教えてください。
ありがとうございました
よろしくイチロー
plot - KISS FFTプロットに、y軸にミラーリングされた重複ピークが表示されるのはなぜですか?
私はFFTの概念の初心者なので、1024の信号を入力すると、0hzから22050Hz(44100Hzのサンプリングレートの場合)の範囲の513のビンが返されることを理解しています。CinderでKISSFFTを使用すると、getBinSize関数は1024信号の入力に対して予想される513値を返します。私が理解していないのは、なぜ重複したピークが現れるのかということです。20Hzから22000Hzの周波数を(順番に)通過するテストオーディオサンプルを実行すると、常に2つのピークが見られます。次のようになります。
__ _ __ |__ _ __ _ __ |__ _ __
オーディオが再生されると、ピークは互いに向かって移動しているように見えるため、2番目のピークは実際には最初のピークのミラーリングされた複製であるように見えます。私が経験したすべての例は、先に進んで513の値すべてをプロットしているようであり、このミラーリングの問題はないようです。何が欠けているのかわかりません。