) 안녕하세요. CUFFT를 사용하여 [pulseMatrixRow [i]와 pulse [i] 두 신호를 컨벌루션해야합니다. 내 코드는 INT 주요임을위한 (INT의는 argc, 문자 ** argv를)CUDA에서 제로 패딩을하는 방법 (
{
FILE *fileWritePtr;
cufftComplex h_signal[NX*BATCH];
cufftComplex h_filter_signal[NX*BATCH];
cufftComplex hf_signal[NX*BATCH];
// Initalize the memory for the signal
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i)
{
h_signal[i].x = pulseMatrixRow[i];
h_signal[i].y = pulseMatrixRow[i];
}
// device memory allocation
cudaMalloc((void**)&d_signal, sizeof(cufftComplex)*NX*BATCH);
// transfer to device memory
cudaMemcpy(d_signal, h_signal, sizeof(cufftComplex)*NX*BATCH, cudaMemcpyHostToDevice);
// Initalize the memory for the filter
for (unsigned int i = 0; i < FILTER_signal_SIZE; ++i)
{
h_filter_signal[i].x = pulse[i];
h_filter_signal[i].y = pulse[i];
}
// device memory allocation
cudaMalloc((void**)&d_filter_signal, sizeof(cufftComplex)*NX*BATCH);
// transfer to device memory
cudaMemcpy(d_filter_signal, h_filter_signal, sizeof(cufftComplex)*NX*BATCH, cudaMemcpyHostToDevice);
// CUFFT plan
cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);
// Transform signal and fsignal
printf("Transforming signal cufftExecC2C\n");
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_FORWARD);
printf("Transforming filter_signal cufftExecC2C\n");
cufftExecC2C(plan, (cufftComplex *)d_filter_signal, (cufftComplex *)d_filter_signal, CUFFT_FORWARD);
// Multiply the coefficients together
ComplexPointwiseMulAndScale<<<blocksPerGrid, threadsPerBlock>>>(d_signal, d_filter_signal, NX, 1.0f/NX*BATCH);
// Transform signal back
printf("Transforming signal back cufftExecC2C\n");
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_INVERSE);
// transfer results from GPU memory
cudaMemcpy(hf_signal, d_signal, sizeof(cufftComplex)*NX*BATCH,cudaMemcpyDeviceToHost);
fileWritePtr = fopen("OutputData1.txt","w+");
for(i = 0; i < NX ; i++){
//printf("%f %f\n", i, hf_signal[i].x, hf_signal[i].y);
fprintf(fileWritePtr,"%d %f %f\n", i, hf_signal[i].x, hf_signal[i].y);
}
fclose(fileWritePtr);
//Destroy CUFFT context
cufftDestroy(plan);
// cleanup memory
cudaFree(d_signal);
cudaFree(d_filter_signal);
// free(h_signal);
// free(h_filter_signal);
return 0;
}
MATLAB에 의해 생성
내 pulseMatrix 코드는 다음과 같이 주어진다 :
pulse = [ones(1,50) zeros(1,500-50)];
pulseMatrix = repmat(pulse,10,1);
pulseMatrix = pulseMatrix.';
pulseMatrixRow = pulseMatrix(:);
하지만 난의 1000 샘플을 처리 할 필요가 pulseMatrixRow를 한 번에 1000 개씩 하나씩 설정합니다. 내 fft가 1024이므로 제 입력 신호의 끝에 0을 채우고 내 필터 신호를 단순히 0으로 채우는 방법과 단계를 알려주십시오. pulse = [ones (1,50) 0 1,500-50)];
프로그래밍/CUDA 라이브러리의 문제보다는 신호 처리/FFT/DFT 이론의 문제로 보입니다. 나는 fft를하기 전에'd_signal'의 후행 24 개 요소와'd_filter_signal'의 후행 524 개 요소를 0으로 설정할 수 있다고 생각합니다. – kangshiyin
네,하지만 프로그래밍에 익숙하지 않은 요소를 0 단계로 설정하는 방법을 알려주십시오. – Ani