Я пытаюсь создать дискретное преобразование Фурье в 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 числа вместе.