【发布时间】:2018-10-19 18:26:56
【问题描述】:
我的信号由函数2*cos(5 * i) + 0.7*sin(3 * i)
i 等待复数数组包含幅度和频率:
...
“3 || cos: 0.0000 || sin:0.7000”
...
“5 || cos: 2.0000 || sin:0.0000”
...
还是一样。但我绝对得到另一个结果。请告知原因,我错在哪里?
这是我的代码:
#include <cuda_runtime.h>
#include <cufft.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
typedef float2 Complex;
void excufft()
{
#define NX 256
#define BATCH 1
}
int main()
{
cufftHandle plan;
cufftComplex *data;
cudaMalloc((void**)&data, sizeof(cufftComplex)*NX*BATCH);
if (cudaGetLastError() != cudaSuccess) {
fprintf(stderr, "Cuda error: Failed to allocate\n");
return 1;
}
Complex* h_signal = (Complex*)malloc(sizeof(Complex) * NX);
for (unsigned int i = 0; i < NX; ++i) {
h_signal[i].x = 0.3*cos(5 * i)+0.7*sin(2*i);
h_signal[i].y = 0;
}
if (cudaMemcpy(data, h_signal, NX, cudaMemcpyHostToDevice) != CUFFT_SUCCESS) {
fprintf(stderr, "CUFFT error: cudaMemcpy host to device failed");
return 1;
}
if (cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH) != CUFFT_SUCCESS) {
fprintf(stderr, "CUFFT error: Plan creation failed");
return 1;
}
if (cufftExecC2C(plan, data, data, CUFFT_FORWARD) != CUFFT_SUCCESS) {
fprintf(stderr, "CUFFT error: ExecC2C Forward failed");
return 1;
}
if (cudaDeviceSynchronize() != cudaSuccess) {
fprintf(stderr, "Cuda error: Failed to synchronize\n");
return 1;
}
Complex* h_convolved_signal = h_signal;
for (unsigned int i = 0; i < NX; ++i) {
h_convolved_signal[i].x = 0;
h_convolved_signal[i].y = 0;
}
cudaMemcpy(h_convolved_signal, data, NX, cudaMemcpyDeviceToHost);
for (int i = 0; i<NX / 2 + 1; i++)
printf("%d || cos: %2.4f || sin: %2.4f\n", i, h_convolved_signal[i].x, h_convolved_signal[i].y);
cufftDestroy(plan);
cudaFree(data);
return 0;
}
还有一个结果输出:
0 || cos: 0.0669 || sin: 0.0000
1 || cos: 0.1567 || sin: 0.2224
2 || cos: 0.3738 || sin: 0.3182
3 || cos: 0.5919 || sin: 0.2345
4 || cos: 0.6839 || sin: 0.0229
5 || cos: 0.5961 || sin: -0.1905
6 || cos: 0.3796 || sin: -0.2779
7 || cos: 0.1607 || sin: -0.1850
8 || cos: 0.0676 || sin: 0.0380
9 || cos: 0.1558 || sin: 0.2642
10 || cos: 0.3750 || sin: 0.3647
11 || cos: 0.5981 || sin: 0.2832
12 || cos: 0.6951 || sin: 0.0697
13 || cos: 0.6089 || sin: -0.1481
14 || cos: 0.3894 || sin: -0.2387
15 || cos: 0.1653 || sin: -0.1442
16 || cos: 0.0695 || sin: 0.0852
17 || cos: 0.1605 || sin: 0.3194
18 || cos: 0.3877 || sin: 0.4244
19 || cos: 0.6194 || sin: 0.3407
20 || cos: 0.7197 || sin: 0.1198
21 || cos: 0.6285 || sin: -0.1045
22 || cos: 0.3987 || sin: -0.1942
23 || cos: 0.1664 || sin: -0.0889
24 || cos: 0.0719 || sin: 0.1572
25 || cos: 0.1758 || sin: 0.4046
26 || cos: 0.4215 || sin: 0.5107
27 || cos: 0.6657 || sin: 0.4147
28 || cos: 0.7627 || sin: 0.1765
29 || cos: 0.6517 || sin: -0.0556
30 || cos: 0.3970 || sin: -0.1322
31 || cos: 0.1526 || sin: 0.0068
32 || cos: 0.0000 || sin: 0.0000
33 || cos: 0.0000 || sin: 0.0000
34 || cos: 0.0000 || sin: 0.0000
...
这看起来我应该做额外的信号准备,或一些后处理..
【问题讨论】:
-
std::cos和std::sin的参数应该用弧度表示。代码创建了一些看起来很奇怪的弧度。 -
cudaMemcpy复制 字节。大小以 字节 为单位,就像memcpy。您应该为每种情况使用NX*sizeof(Complex),而不仅仅是NX。 -
你说得对。我在 cudaMemcpy 中更改了大小并获得了完整的数据数组。但是仍然看不到有关频谱中幅度和频率的具体信息..
-
您能否提供您期望的确切输出?例如,提供一个参考实现,可能使用 FFTW 或 matlab 或任何您喜欢的,显示您期望的确切输出。
-
您为什么希望它提供相同的输出?输入的数据不一样。而且操作顺序也不一样。