2016-04-22 9 views
0

Я использую Cufft CUDA для обработки данных, которые я получаю от гидрофона (500 000 целых чисел в секунду на 250 Гц, высоких и низких каналах). Теперь в качестве основного примера того, как CUFFT работает здесь ...Cufft частота установки?

void runTest(int argc, char** argv) 

    { 

printf("[1DCUFFT] is starting...\n"); 


cufftComplex* h_signal = (cufftComplex*)malloc(sizeof(cufftComplex)* SIGNAL_SIZE); 
// Allocate host memory for the signal 
//Complex* h_signal = (Complex*)malloc(sizeof(Complex) * SIGNAL_SIZE); 
// Initalize the memory for the signal 
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i) { 
    h_signal[i].x = rand()/(float)RAND_MAX; 
    h_signal[i].y = 0; 
} 




int mem_size = sizeof(cufftComplex)* SIGNAL_SIZE; 

// Allocate device memory for signal 
cufftComplex* d_signal; 
cudaMalloc((void**)&d_signal, mem_size); 

// Copy host memory to device 
cudaMemcpy(d_signal, h_signal, mem_size, 
    cudaMemcpyHostToDevice); 



// CUFFT plan 
cufftHandle plan; 
cufftPlan1d(&plan, mem_size, CUFFT_C2C, 1); 

// Transform signal 
printf("Transforming signal cufftExecC2C\n"); 
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_FORWARD); 


// Transform signal back 
printf("Transforming signal back cufftExecC2C\n"); 
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_INVERSE); 

// Copy device memory to host 
cufftComplex* h_inverse_signal = (cufftComplex*)malloc(sizeof(cufftComplex)* SIGNAL_SIZE);; 
cudaMemcpy(h_inverse_signal, d_signal, mem_size, 
    cudaMemcpyDeviceToHost); 

for (int i = 0; i < SIGNAL_SIZE; i++){ 
    h_inverse_signal[i].x = h_inverse_signal[i].x/(float)SIGNAL_SIZE; 
    h_inverse_signal[i].y = h_inverse_signal[i].y/(float)SIGNAL_SIZE; 

    printf("first : %f %f after %f %f \n", h_signal[i].x, h_signal[i].y, h_inverse_signal[i].x, h_inverse_signal[i].y); 
} 
//Destroy CUFFT context 
cufftDestroy(plan); 

// cleanup memory 
free(h_signal); 

free(h_inverse_signal); 
cudaFree(d_signal); 
cudaDeviceReset(); 
} 

Теперь все, что я хочу знать, как установить частоту FFT (CUFFT) быть 250hertz?

Благодаря

Джеймс

+0

Я не вижу, как это вопрос программирования .... – talonmies

+2

У fft нет ни одной частоты. Это векторная основа охватывает весь диапазон от DC (0 Гц) до Fs/2 (250 кГц?). – hotpaw2

+0

Ваш вопрос действительно вводит в заблуждение, что отражено в комментариях. Если я правильно понимаю, вы выбираете дискретность при 500 кСА/сек, и вас интересует сила сигнала на частотах около 250 Гц. – roadrunner66

ответ

2

Вы не делаете. БПФ из N точек одинаковы, независимо от частоты, с которой были выбраны эти N точек.

Кроме того, 500 000 целых чисел в секунду составляют частоту дискретизации 500 000 Гц, ака 500 кГц. Это дает вам предел Найквиста в 250 кГц.

+0

Ох ... Ну, мне нужно знать, как тогда преобразовать 500 000 целых чисел (аудиоданные) в БПФ на частоте 250 Гц? – tim

+5

@tim: Я подозреваю, что кто-то попросил вас сделать это. Иди спроси этого человека, чего они действительно хотят.Вы неправильно поняли, возможно, – MSalters

+0

Я думаю, что второе предложение можно было бы неправильно понять. Я думаю, что ОП хочет знать, какие физические частоты представляют его данные, учитывая параметры его вектора времени. – roadrunner66

1

Если я правильно понимаю вас, вам просто нужно знать, какой элемент в выходном векторе равен 250 Гц.

FFT дает вам все частоты, которые могут быть рассчитаны на основе длины и времени вашего вектора времени. Простым правилом для расчета является: - диапазон частот = 1/временное разрешение. - частотное разрешение = 1/длина времени.

Кроме того, необходимо знать, что БПФ реальной функции (без данных мнимой части вектора времени) дает симметричный спектр с избыточностью. Спектр достигает от (- 1/2 диапазона частот до +1/2 частотного диапазона). Отрицательные частотные данные могут быть отброшены в случае вектора реального времени. Это немного сложнее. Стандартная реализация FFT (которая является операцией inplace) дает сначала положительные частоты, а затем отрицательные частоты. Поскольку вас интересуют только положительные частоты, вторая половина вектора FFT может быть отброшена. В вашем случае просто игнорируйте данные выше индекса 250k.

В вашем случае частоты распространяются от -250 кГц до 250 кГц с разрешением 1 Гц, но из-за вышеизложенного первые 250 тыс. Точек фактически являются положительными частотами при раздельном 1 Гц.

Итак, возьмите 250-ю точку в (без сдвига, то есть необработанном) FFT, и вы получите сигнал на частоте 250 Гц. Я бы построил данные от 0 до 500, чтобы увидеть, насколько широкий этот пик составляет около 250 Гц. Сила сигнала является интегралом от тех ненулевых частот (здесь ненулевое значение применяется здесь для обозначения всего выше шума). Ширина сигнала указывает на модуляцию, которая применяется к сигналу (который может включать в себя другие артефакты измерений). Если сигнал сдвинут с 250 Гц, у вас может быть доплеровский сдвиг (либо ваш источник, либо вы двигаетесь).

Если вас интересует только конечный частотный диапазон, возможно, быстрее вычислить интеграл Фурье (O (n^2)) только для тех нескольких частотных точек. Обычно люди используют БПФ, потому что это O (n * log (n)), но если вам нужно только сказать 10 частотных точек, то O (10 * n) не сильно отличается.

 Смежные вопросы

  • Нет связанных вопросов^_^