OpenCL中的低通滤波器

VedhaR

我正在尝试在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实现了很多过滤器。在文档末尾,您可以找到低通滤波器的浮动实现。

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

在该pdf中的过滤器实现中,将data [j]与值进行比较。另外我也不知道numItems或workItems是什么。

如果有人可以对此提供一些见识,那将是很好的。我在低通滤波器上搜索了很多其他示例,但是我只是无法将实现的内容包起来。我希望我把这个问题弄清楚了。同样,我知道低通滤波器的功能/作用。我只是不知道我需要比较哪些值才能进行过滤。

还发现了这个问题:

C中的低通滤波器

VedhaR

我有一个可能的解决方案。我正在尝试的是移动平均冷杉(我被告知这是一种可以实现的最简单形式的低通滤波器)。

需要什么:

  • FIFO缓冲器
  • 系数值(我针对特定的截止频率从Matlab生成并获得了地雷)
  • 程序的输入和输出数组

我没有明智地实现此代码,但确实了解了如何在理论上使用它。我在下面创建了一个图表来尝试解释该过程。

在此处输入图片说明

本质上,来自另一个输入数组的值将一次被传递到FIFO缓冲区中。每次传入值时,内核都会在具有“ n”个抽头的FIFO缓冲区中进行乘法运算。每个抽头具有与之关联的系数值。因此,将特定元素的输入乘以系数值,然后将所有值累加并存储在输出缓冲区的一个元素中。

请注意,系数是在Matlab中生成的。我不知道还有其他方法来获取这些价值。起初,我只使用1 / n的系数,但是我很确定那只会使信号的值失真。

这应该可以解决问题,我现在将在代码中实现这一点,但是如果该理论有任何问题,请随时进行纠正。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python中的低通滤波器

来自分类Dev

C中的低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

FPGA的低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

MATLAB中的低通滤波器返回NaN值

来自分类Dev

IIR低通滤波器在C ++中的实现

来自分类Dev

在Matlab中设计一个低通滤波器

来自分类Dev

在音频上使用低通滤波器

来自分类Dev

使用fft的Matlab低通滤波器

来自分类Dev

低通滤波器和采样频率

来自分类Dev

低通滤波器不起作用

来自分类Dev

固定点的简单低通滤波器

来自分类Dev

在SciPy中创建低通滤波器-了解方法和单位

来自分类Dev

低通滤波器从熊猫数据框中获取数据的二阶导数

来自分类Dev

如何在scipy.signal中制作一个低通滤波器?

来自分类Dev

如何实现低通滤波器以减少陀螺仪值中的噪声?

来自分类Dev

识别过滤器的方法。(低通滤波器/高通滤波器?)

来自分类Dev

识别过滤器的方法。(低通滤波器/高通滤波器?)

来自分类Dev

优化低通滤波器平滑代码以进行活动识别

来自分类Dev

Matlab-在系统上使用低通滤波器

来自分类Dev

在Python中表示低通滤波器时的直线

来自分类Dev

将SOX低通滤波器与插孔配合使用

来自分类Dev

使用Pulseaudio在LFE上进行低通滤波器

来自分类Dev

在尺寸为NxM的图像上应用低通滤波器(AxB)的过程中没有计算量

来自分类Dev

具有低通滤波器的脱机渲染会导致混叠和剪切

来自分类Dev

关于在Matlab中使用'butter'功能的低通滤波器的问题