私はOpenCLでローパスフィルタを実装しようとしていますが、この背後にある理論は私にはちょっと混乱しています。シナリオを説明した後、私は自分のコードを最後に付けました。OpenCLのローパスフィルタ
まず、シナリオ全体をポイント形式で説明しましょう。
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が何であるかわかりません。
誰かがこれについてのいくつかの洞察力を提供することができればそれはすばらしいでしょう。私は、ローパスフィルターに関する他の多くのサンプルを検索しましたが、私は実装の周りに私の頭を包むことはできません。私はこの質問を明確にしたいと思う。再び、私はどのようにローパス・フィルターが何をするかを知っています。私はフィルタリングを行うために比較する必要がある値を知りません。私は可能な解決策を持っている
「周波数とステップサイズを関数に乗じた」とはどういう意味ですか? –
cos(2 * CL_M_PI * signalFreq * h);私は余弦関数に信号周波数を乗算するだけです。 h値は、配列をインクリメントするたびにステップサイズだけインクリメントされます。ステップサイズは1 /(Frequency Sample)なので、hはかなりh = h + 1 /(Frequency Sample)です。私はそれが所定の周波数で余弦波を修正する正しい方法であることを願っています。ああ、周波数サンプルはちょうどsamplesizeです* signalFrequency – VedhaR