2016-09-22 6 views
3

はこれが核心ザラザラ質問のビット...改善周波数時間正規化/ヒルベルト転送ランタイム

は私が白くする必要が不均一な応答スペクトルを持つ時系列信号を持っています。私は一定の狭い周波数帯域(〜1/4最も低い周波数のエンドメンバー)を使用して、2つの周波数エンドポイント間で信号を段階的にフィルタリングする周波数時間正規化方法を使用してこのホワイトニングを行います。私はこれらの狭いバンドのそれぞれを特徴付けるエンベロープを見つけ、その周波数成分を正規化します。 enter image description here

、ここでそのスペクトルである:私は、ここで

は生データである...(申し訳ありませんが、Pythonのソリューションである必要があります)すべてはPythonで行われ...これらの正規化された信号を使用して、私の信号を再構築します: enter image description here

問題は、私はこのような多分〜50万信号のためにこれをしなければならないということであり、それはしばらく時間がかかります(〜分: enter image description here

、ここでは白色化データのスペクトルがあります各)。ほとんどの時間が実際の(複数の)ヒルベルト変換を行うのに費やされています。

私はそれを小さなクラスター上で実行しています。私はヒルベルトがあるループを並列化したくありません。代替のエンベロープルーチン/関数(ヒルベルト以外)、またはループを行わずに狭帯域応答関数全体を計算する代わりの方法を探しています。

もう1つの選択肢は、周波数帯域をフィルタリングする中心周波数に適応させることです。そのため、ルーチンを進めていくにつれて周波数帯域が徐々に大きくなります。ループを通過しなければならない回数が減ります。

任意のすべての提案を歓迎!!!

例コード/データセット: https://github.com/ashtonflinders/FTN_Example

+0

ヒルバートはfftを使用していますので、信号の長さを2 ** nにすると少しスピードアップします。 – HYRY

+0

は最近のpow2から遠すぎますが、それを改善するために少なくとも偶数を保証します。 – AFF

答えて

1

ここでは、ローカルマックスによってenveloopを計算するための高速な方法である:ここ

def calc_envelope(x, ind): 
    x_abs = np.abs(x) 
    loc = np.where(np.diff(np.sign(np.diff(x_abs))) < 0)[0] + 1 
    peak = x_abs[loc] 
    envelope = np.interp(ind, loc, peak) 
    return envelope 

は出力例である:

enter image description here

これは、ヒルベルトより約6倍高速です。さらに高速化するために、次のローカル最大点を見つけるcython関数を書くことができます。ローカル最大点までの正規化を繰り返します。

+0

ありがとうHYRY! 同じエンベロープを返す約6倍のスピード増加と、最終的には同じ周波数の時間正規化信号につながります。 – AFF