我想在OpenCL中實現一個低通濾波器,所有這些背後的理論讓我困惑了一下。在我解釋場景後,我在底部附上我的代碼。OpenCL中的低通濾波器
首先,讓我嘗試以點形式解釋整個場景。
- 對於輸入,我們有一個帶有樣本大小,頻率(通過樣本大小乘以頻率獲得的頻率樣本)和步長的餘弦信號。
- 將每個步長的值存儲在一個數組中,頻率和步長乘以函數
- 然後將該數組傳遞給內核,然後執行低通濾波器函數。
- 內核返回一個輸出數組與新的過濾值。
cos函數總是從(-1,1)返回一個值,唯一修改該值的是頻率。所以它可能重複更快或更慢取決於頻率但它總是在(-1,1)之間。
這是我困惑的地方,我不知道如何將低通濾波器應用到這些值。假設濾波器的截止頻率爲100Hz。我不能說:
if(array[i] > 100) { //delete or ignore this value. Else store in a 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實現了很多過濾器。在文檔的結尾處,您可以找到低通濾波器的浮點實現。
http://scholar.uwindsor.ca/cgi/viewcontent.cgi?article=6242&context=etd
在該PDF格式的過濾器實施方式中,比較數據[j]的值來。此外,我不知道什麼numItems或workItems。
如果有人可以提供一些有關這將是偉大的見解。我已經在低通濾波器上搜索了很多其他的例子,但是我無法將我的頭包裹在實現中。我希望我明確提出這個問題。再次,我知道低通濾波器的功能。我只是不知道我需要比較哪些值才能進行過濾。
發現這個問題藏漢:
你是什麼意思與「與頻率和步長乘以功能」? –
cos(2 * CL_M_PI * signalFreq * h);我只是將信號頻率乘以餘弦函數。每增加一個數組,h值就會增加步長。由於步長爲1 /(頻率採樣),h幾乎是h = h + 1 /(頻率採樣)。我希望這是用給定頻率修改餘弦波的正確方法。哦,頻率樣本只是樣本* signalFrequency – VedhaR