2016-05-12 5 views
2

私はOpenCLでローパスフィルタを実装しようとしていますが、この背後にある理論は私にはちょっと混乱しています。シナリオを説明した後、私は自分のコードを最後に付けました。OpenCLのローパスフィルタ

まず、シナリオ全体をポイント形式で説明しましょう。

  • 入力には、サンプルサイズ、頻度(サンプルサイズに周波数を掛けた頻度サンプル)、およびステップサイズのcos信号があります。
  • 各ステップサイズの値は、周波数とステップサイズを関数に掛けた配列に格納されます。
  • この配列はカーネルに渡され、ローパスフィルタ関数が実行されます。
  • カーネルは、新しいフィルタリングされた値を持つ出力配列を返します。
  • cos関数は常に(-1,1)から値を返しますが、この値を変更する唯一のものは頻度です。したがって、周波数に応じてより速くまたは遅く繰り返すことができますが、常に(-1,1)の間です。

    これは私が混乱しているところです。これらの値にローパスフィルタを適用する方法がわかりません。フィルターのカットオフが100Hzであったとしましょう。

    if(array[i] > 100) { //delete or ignore this value. Else store in a array } 
    

    これはうまくいかない理由は、array [i]の値が(-1,1)からなるためです。だから私はどのようにこのフィルタを適用するだろうか?私はどのような値を比較するのですか?

    物理的な観点から、私はそれがどのように動作するのか、コンデンサと抵抗を使ってカットオフ周波数を計算し、回路を通して入力を送信することができます。しかし、プログラム的に、私はこれをどのように実装できるかわかりません。私はこのオンラインの多くの実装を見てきましたが、コードは何が起こっているのかをよく理解するのに十分書かれていませんでした。ここで

    は、私のホスト側のコードです:

    //Array to hold the information of signal 
    float *Array; 
    
    //Number of sampling points 
    int sampleSize = 100; 
    float h = 0; 
    
    //Signal Frequency in Hz 
    float signalFreq = 10; 
    
    //Number of points between 0 and max val (T_Sample) 
    float freqSample = sampleSize*signalFreq; 
    
    //Step = max value or T_Sample 
    float stepSize = 1.0/freqSample; 
    
    //Allocate enough memory for the array 
    Array = (float*)malloc(sampleSize*sizeof(float)); 
    
    //Populate the array with modified cosine 
    for (int i = 0; i < sampleSize; i++) { 
        Array[0] = cos(2*CL_M_PI*signalFreq*h); 
        h = h + stepSize; 
        printf("Value of current sample for cos is: %f \n", Array[0]); 
    } 
    

    私のカーネルは以下の唯一のとおりです。(もちろん、これは私が混乱していますこれはどこで、フィルタのコードではありません)。

    __kernel void lowpass(__global int *Array, __local float *cutOffValue, __global int *Output) { 
        int idx = get_global_id(0); 
        Output[idx] = Array[idx]; 
    }; 
    

    このPDFは、多くのフィルタを実装しています。このドキュメントの最後には、ローパスフィルタのフロート実装があります。そのPDFのフィルタの実装で

    http://scholar.uwindsor.ca/cgi/viewcontent.cgi?article=6242&context=etd

    、値をデータ[j]を比較します。また、numItemsやworkItemsが何であるかわかりません。

    誰かがこれについてのいくつかの洞察力を提供することができればそれはすばらしいでしょう。私は、ローパスフィルターに関する他の多くのサンプルを検索しましたが、私は実装の周りに私の頭を包むことはできません。私はこの質問を明確にしたいと思う。再び、私はどのようにローパス・フィルターが何をするかを知っています。私はフィルタリングを行うために比較する必要がある値を知りません。私は可能な解決策を持っている

    Low Pass filter in C

    +0

    「周波数とステップサイズを関数に乗じた」とはどういう意味ですか? –

    +0

    cos(2 * CL_M_PI * signalFreq * h);私は余弦関数に信号周波数を乗算するだけです。 h値は、配列をインクリメントするたびにステップサイズだけインクリメントされます。ステップサイズは1 /(Frequency Sample)なので、hはかなりh = h + 1 /(Frequency Sample)です。私はそれが所定の周波数で余弦波を修正する正しい方法であることを願っています。ああ、周波数サンプルはちょうどsamplesizeです* signalFrequency – VedhaR

    答えて

    1

    がaswellこの質問を見つけました。私が試みているのは、平均的な移動平均です(これは実装可能なローパスフィルタの最も簡単な形式です)。

    必要とされる何

    • FIFOバッファ
    • 係数値(Iが生成され、特定のカットオフ周波数は、MATLABから鉱山を得た)プログラムの
    • 入出力アレイ

    私はこのコードを賢明に実装していませんが、理論的なレベルで使用する方法を理解しています。私はプロセスを説明しようとするために以下のダイアグラムを作成しました。

    enter image description here

    本質的に、他の入力からの配列値は、一度にFIFOバッファ一つに渡されます。値が渡されるたびに、カーネルは「n」タップを持つFIFOバッファを渡って乗算を行います。各タップはそれに関連する係数値を有する。そのため、特定の要素の入力に係数値が乗算され、すべての値が累積されて出力バッファの1つの要素に格納されます。

    係数はMatlabで生成されたことに注意してください。私はこれらの値をつかむ他の方法を知らなかった。最初は1/nの係数を使用するつもりでしたが、信号の値を歪ませるだけです。

    これは私がコードでこれを実装するつもりですが、この理論に間違いがあれば修正してください。

    +0

    これはすべてが今のところあるので、私は自分の答えを受け入れるつもりです。 – VedhaR