/*
 * SPDX-License-Identifier: GPL-3.0-or-later
 *
 * Copyright (C) 2024  Thomas Kolb
 */

#include <stdio.h>
#include <time.h>

#include <liquid/liquid.h>

#include "layer1/freq_est.h"

#include "utils.h"

int main(void)
{
#define N 63
	float complex s1[N];
	float complex s2[N];
	float complex s3[N];

	nco_crcf nco;
	channel_cccf chan;

	// ** Initialize **

	srand(time(NULL));

	nco = nco_crcf_create(LIQUID_NCO);

	nco_crcf_set_frequency(nco, -0.08f);
	nco_crcf_set_phase(nco, -1.37f);

	chan = channel_cccf_create();

	channel_cccf_add_awgn(chan, -80, 5);

	// ** Generate signal **

	for(size_t i = 0; i < N; i++) {
		s1[i] = 1.0f;
	}

	// ** Mix up **

	nco_crcf_mix_block_up(nco, s1, s2, N);

	channel_cccf_execute_block(chan, s2, N, s3);

	dump_array_cf(s1, N, 1.0f, "/tmp/freq_est_source.cpx");
	dump_array_cf(s2, N, 1.0f, "/tmp/freq_est_mixed.cpx");
	dump_array_cf(s3, N, 1.0f, "/tmp/freq_est_channelized.cpx");


	// ** Estimate frequency **

	float final_phase;
	float est_freq = freq_est_data_free(s3, N, &final_phase);

	fprintf(stderr, "Estimated frequency: %.6f rad/sample\n", est_freq);
	fprintf(stderr, "Final phase: %.6f rad\n", final_phase);

	// ** Cleanup **

	nco_crcf_destroy(nco);

	fprintf(stderr, "Done.\n");
}