Как работать с комплексными числами в C без библиотеки complex.h в программе, не совместимой с C99? - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь создать дискретное преобразование Фурье в C для университетского проекта, который является гитарным тюнером.Университет в основном заставляет нас использовать CodeVisionAVR, потому что он хорошо работает с ATmega168p, который они нам дали.CVAVR работает только в C и не совместим с C99, что означает <complex.h>, не будет работать.Если я хочу создать вектор, скажем, 800 сэмплов для гитарного тюнера, DFT требует работы с комплексными числами, соответственно с действительной и мнимой частями ввода.

Это код, который япытаясь изменить для задачи.

float read_voltage(unsigned char channel) 
{
    channel &= 0b00000111;
    ADMUX = ADMUX_NOCHANNEL | channel;
    ADCSRA |= 0b01000000; 
    while (ADCSRA & 0b01000000); 
    ADCSRA |= 0b00010000; 
    return (float)(ADCH) * 0.0275;
}

#define M_PI 3.14159265358979323486
#define N 800

float computeDft()
{
    // time and frequency domain data arrays 
    float x[N];    
    float X[N];
    float Xre[N] = {0};
    float Xim[N] = {0}; 
    size_t n = sizeof(x);
    int k;            
    int t;
    int i = 0;   
    while(i<N)
    {
        x[i] = read_voltage(0b00000000);         
        i++;
    }

    for (k = 0; k < n; k++) 
    {  // For each output element
        for (t = 0; t < n; t++) 
        {  // For each input element
            double angle = 2 * M_PI * t * k / n;
            Xre[t] +=  Xre[t] * cos(angle) + Xim[t] * sin(angle);
            Xim[t] += -Xre[t] * sin(angle) + Xim[t] * cos(angle);
        }    
        X[k] = Xre[k] + Xim[k]; 
    }   
    return X[k];
}

Проблема в том, что X [k] фактически равен комплексу Xre [k] + jXim [k], а не просто складывает 2 числа вместе.

...