4

まず、この分野での無知をお許しください。私は本業のプログラマーですが、私の専門知識 (数学と信号処理) を少し超えた状況に陥っています。

C++ プログラムに移植する必要がある Matlab スクリプトがあります (matlab コードを DLL にコンパイルする必要はありません)。hilbert()引数が 1 つの関数を使用します。私は C++ で同じことを実装する方法を見つけようとしています (つまり、引数を 1 つだけ取り、同じ値を返す関数があります)。

FFT と IFFT を使用してビルドする方法を調べましたが、Matlab バージョンほど単純なものは得られないようです。主なことは、128 * 2000 のマトリックスで動作する必要があることです。検索で見つかったものは、その方法を示していません。

複雑な値が返されても、絶対値だけでも問題ありません。コードへの統合が簡単であるほど、優れています。

ありがとうございました。

4

4 に答える 4

9

MatLab 関数 hilbert() は、実際にはヒルベルト変換を直接計算するのではなく、分析信号を計算します。これは、ほとんどの場合に必要なものです。これは、FFT を取得し、負の周波数を削除 (配列の上半分をゼロに設定) し、逆 FFT を適用することによって行われます。適切な FFT 実装があれば、C/C++ (3 行のコード) で簡単に実行できます。

于 2012-08-14T19:53:00.067 に答える
2

GPL ライセンスに対処できる限り、これはかなり良さそうです。はるかに大きな数値計算リソースの一部。

于 2012-08-13T21:57:54.463 に答える
0

あなたの質問に対する真の答えではありませんが、睡眠を改善する方法かもしれません. 基本的に行列上のfftである特定のケースでは、Matlabよりもはるかに高速になることはできないと思います。それがMatlabの優れたところです!

Matlab FFT は、C で記述された事実上最速の FFT アルゴリズムである FFTW を使用して計算され、Matlab によっても並列化されているようです。さらに、 http://www.mathworks.com/help/matlab/ref/fftw.htmlから引用します。

214 から 222 の間の 2 の累乗である FFT 次元の場合、MATLAB ソフトウェアは内部データベースに事前に読み込まれた特別な情報を使用して、FFT 計算を最適化します。

したがって、コードが少し遅くなっても気にしないでください...

于 2016-07-04T20:59:20.127 に答える
0

以下の簡単なコード。(注: これはより大きなプロジェクトの一部でした)。L の値は、注文 N の決定に基づいています。N = 2L-1 の場合。N を奇数に丸めます。以下の xbar は、設計したシステムへの入力として定義した信号に基づいています。これは MATLAB で実装されました。

L = 40;
n = -L:L; % index n from [-40,-39,....,-1,0,1,...,39,40];
h = (1 - (-1).^n)./(pi*n); %impulse response of Hilbert Transform
h(41) = 0; %Corresponds to the 0/0 term (for 41st term, 0, in n vector above)

xhat = conv(h,xbar); %resultant from Hilbert Transform H(w);

plot(abs(xhat))
于 2013-12-10T06:37:12.767 に答える