@Cufft的实例:SimpleCufftTOC
Cufft Samples中的SimpleCufft的一些小问题
通信专业,c++和cuda小白,学习ing
1.动态数组在vs调试器里无法完全显示所有元素的问题
比如这条语句
Complex *h_signal = (Complex *)malloc(sizeof(Complex) * SIGNAL_SIZE);
创建出来的指针数组h_signal,在调试过程中的变量窗口里,是只会显示首个元素的。找了下解决办法,一个比较简单的就是添加快速监视(启动调试之后),可见VS调试时查看动态数组的全部元素
上述问题出现的本质原因,就是该语句只是告诉你分配了sizeof(Complex) * SIGNAL_SIZE的空间,并返回了指向了这块内存的地址的指针。
2.rand()的伪随机
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i)
{
h_signal[i].x = rand() / (float)RAND_MAX;
h_signal[i].y = 0;
}
几次测试下来,因为比较注意前几个数,发现在每次生成的随机数是一样的。这些问题容易查到。实际上,通过计算机产生一个完全随机的序列是一个比较复杂的问题,有些算法声称可以完全随机,有待进一步了解(比如量子计算)。
要计算机产生一个随机数不像扔色子一样,计算机的每一步操作,就是执行一堆代码,这些代码是事先安排好的,所以计算机的产生行为是不具有随机性和预测性的(当然这里说的是现阶段的计算机体系,到未来的计算机的体系,未知),所以计算机产生的随机数都不是真正意义上的随机数,只是伪随机数,他以一个真值(也称为种子)作为初始条件,然后用一定的算法不停迭代产生随机数。
详细可见有关rand(),srand()产生随机数学习总结 - guihailiuli
3.PadData
int PadData(const Complex *signal, Complex **padded_signal, int signal_size,
const Complex *filter_kernel, Complex **padded_filter_kernel, int filter_kernel_size)
{
int minRadius = filter_kernel_size / 2;
int maxRadius = filter_kernel_size - minRadius;
int new_size = signal_size + maxRadius;
// Pad signal
Complex *new_data = (Complex *)malloc(sizeof(Complex) * new_size);
memcpy(new_data + 0, signal, signal_size * sizeof(Complex));
memset(new_data + signal_size, 0, (new_size - signal_size) * sizeof(Complex));
*padded_signal = new_data;
// Pad filter
new_data = (Complex *)malloc(sizeof(Complex) * new_size);
memcpy(new_data + 0, filter_kernel + minRadius, maxRadius * sizeof(Complex));
memset(new_data + maxRadius, 0, (new_size - filter_kernel_size) * sizeof(Complex));
memcpy(new_data + new_size - minRadius, filter_kernel, minRadius * sizeof(Complex));
*padded_filter_kernel = new_data;
return new_size;
}
圆周卷积的方式,先MARK一下。