2016-05-12 168 views
2

我想在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。

如果有人可以提供一些有關這將是偉大的見解。我已經在低通濾波器上搜索了很多其他的例子,但是我無法將我的頭包裹在實現中。我希望我明確提出這個問題。再次,我知道低通濾波器的功能。我只是不知道我需要比較哪些值才能進行過濾。

發現這個問題藏漢:

Low Pass filter in C

+0

你是什麼意思與「與頻率和步長乘以功能」? –

+0

cos(2 * CL_M_PI * signalFreq * h);我只是將信號頻率乘以餘弦函數。每增加一個數組,h值就會增加步長。由於步長爲1 /(頻率採樣),h幾乎是h = h + 1 /(頻率採樣)。我希望這是用給定頻率修改餘弦波的正確方法。哦,頻率樣本只是樣本* signalFrequency – VedhaR

回答

1

我有一個可能的解決方案。我所嘗試的將是一個移動平均杉木(我被告知是可以實現的低通濾波器的最簡單形式)。

什麼是必需的:

  • FIFO緩衝器
  • 係數的值(I產生並從MATLAB特定截止頻率獲得的礦)
  • 用於程序
  • 輸入和輸出陣列

我還沒有實現這個代碼明智的,但我明白如何在理論上使用它。我在下面創建了一個圖表來嘗試解釋這個過程。

enter image description here

本質上,從另一個輸入數組值將被傳遞到FIFO緩衝器一次一個。每次傳入一個值時,內核都會在具有'n'分支的FIFO緩衝區中進行乘法運算。每個抽頭都有一個與之相關的係數值。因此,特定元素的輸入與係數值相乘,然後所有值累加並存儲在輸出緩衝區的一個元素中。

請注意,係數是在Matlab中生成的。我不知道如何抓住這些價值。起初我只是使用1/n的係數,但我確信這隻會扭曲信號的值。

而且應該做的伎倆,我現在要在代碼中實現這一點,但如果這個理論有什麼問題,請隨時糾正它。

+0

我要接受我自己的答案,因爲這是現在所有的。 – VedhaR