我正在尝试在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实现了很多过滤器。在文档末尾,您可以找到低通滤波器的浮动实现。
http://scholar.uwindsor.ca/cgi/viewcontent.cgi?article=6242&context=etd
在该pdf中的过滤器实现中,将data [j]与值进行比较。另外我也不知道numItems或workItems是什么。
如果有人可以对此提供一些见识,那将是很好的。我在低通滤波器上搜索了很多其他示例,但是我只是无法将实现的内容包起来。我希望我把这个问题弄清楚了。同样,我知道低通滤波器的功能/作用。我只是不知道我需要比较哪些值才能进行过滤。
还发现了这个问题:
我有一个可能的解决方案。我正在尝试的是移动平均冷杉(我被告知这是一种可以实现的最简单形式的低通滤波器)。
需要什么:
我没有明智地实现此代码,但确实了解了如何在理论上使用它。我在下面创建了一个图表来尝试解释该过程。
本质上,来自另一个输入数组的值将一次被传递到FIFO缓冲区中。每次传入值时,内核都会在具有“ n”个抽头的FIFO缓冲区中进行乘法运算。每个抽头具有与之关联的系数值。因此,将特定元素的输入乘以系数值,然后将所有值累加并存储在输出缓冲区的一个元素中。
请注意,系数是在Matlab中生成的。我不知道还有其他方法来获取这些价值。起初,我只使用1 / n的系数,但是我很确定那只会使信号的值失真。
这应该可以解决问题,我现在将在代码中实现这一点,但是如果该理论有任何问题,请随时进行纠正。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句