#include #include #include #define PI 3.14159265358979323846 int goertzel(double* vzorky, int vzfrekv, int pocet, double hledana) { double meritko = 2.0 / pocet; double omega = 2.0 * PI * hledana / vzfrekv; double cosTerm = cos(omega); double koef = 2.0 * cosTerm; double Q0 = 0, Q1 = 0, Q2 = 0; for (int n = 0; n < pocet; ++n) { double vzorek = vzorky[n]; Q0 = koef * Q1 - Q2 + vzorek; Q2 = Q1; Q1 = Q0; } double real = (Q1 - Q2 * cosTerm) * meritko; double imag = (Q2 * sin(omega)) * meritko; double velikost = sqrt(real * real + imag * imag); // prah dle potreby double prah = 10.0; if (velikost > prah) { return 1; // Sinusovka nalezena } else { return 0; // Sinusovka nenalezena } } int main(int argc, char *argv[]) { if (argc != 4) { printf("Pouziti: %s \n", argv[0]); return 1; // Ochrana, nutne napsat promenne } int vzfrekv = atoi(argv[1]); int pocet = atoi(argv[2]); double hledana = atof(argv[3]); double* vzorky = (double*)malloc(pocet * sizeof(double)); // nacitani vstupu, pro priklad pouzijeme nahodne hodnoty for (int i = 0; i < pocet; ++i) { vzorky[i] = (rand() % 2001 - 1000) / 1000.0; // Nahodna hodnoty v rozsahu <-1, 1) } for (int i = 0; i < pocet; ++i) { int result = goertzel(vzorky + i, vzfrekv, 1, hledana); if (result == 1) { printf("+"); } else { printf("-"); } } printf("\n"); free(vzorky); return 0; }