Суть вопроса такова. Есть такой код:
#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
Ответ
Я проверил на 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
Надеюсь помог.
Комментариев нет:
Отправить комментарий