#cpp #c #fft #обработка_сигналов
Суть вопроса такова. Есть такой код: #include "stdafx.h" #define PI 3.1415926535897932384626433832795 #define FR 3 #define SAMPLES 1024 int _tmain(int argc, _TCHAR* argv[]) { base signal[SAMPLES]; for (int i = 0; i < SAMPLES; ++i) { signal[i] = (sin(2*PI*i*FR), 0); } FFTCalculate(signal, SAMPLES, false); FILE* f_pointer = fopen("fft_result.txt", "w"); for (int i = 0; i < SAMPLES; ++i) { char num = (char)signal[i].real(); int out = fprintf(f_pointer, &num); } int out = fclose(f_pointer); return 0; } в нем вызывается функция FFTCalculate(signal, SAMPLES, false). Ниже приведен код функции: void FFTCalculate(base signal[], int n, bool invert) { int log_N; double x = frexp((double)n, &log_N); calc_rev(n, log_N); for(int i = 0; i < n; ++i) if (i < rev[i]) swap(signal[i], signal[rev[i]]); for(int len = 2; len <= n; len<<=1) { double ang = 2*PI/len * (invert?-1:1); int len2 = len>>1; base wlen (cos(ang), sin(ang)); wlen_pw[0] = base(1, 0); for (int i=0; iОтветы
Ответ 1
Я проверил на GCC 4.8.2 под linux. Параметры FFTCalculate передаются корректно. Думаю что, то поведение которое ты видишь в Visual Studio является unexpected behavior. Твоя программа под линуском сразу упала с seg fault. Ниже пример кода с ошибкой. Ты не проверяешь значения rev[i], что оно может быть больше n (1024). calc_rev(n, log_N); for(int i = 0; i < n; ++i) if (i < rev[i]) swap(signal[i], signal[rev[i]]); Вот что у меня вывелось для первых десяти итераций из массива rev: 0 1024 1536 1280 1792 1152 1664 1408 1920 Надеюсь помог.
Комментариев нет:
Отправить комментарий