Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Функция вызывается с неправильными значениями переменных

#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 Надеюсь помог.

Комментариев нет:

Отправить комментарий