// Help function to keep code base small // _kf : modulation factor // _type : demodulation type {LIQUID_FREQDEM_DELAYCONJ, LIQUID_FREQDEM_PLL} void freqmodem_test(float _kf, liquid_freqdem_type _type) { // options unsigned int num_samples = 1024; //float tol = 1e-2f; unsigned int i; // create mod/demod objects freqmod mod = freqmod_create(_kf); // modulator freqdem dem = freqdem_create(_kf,_type); // demodulator // allocate arrays float m[num_samples]; // message signal float complex r[num_samples]; // received signal (complex baseband) float y[num_samples]; // demodulator output // generate message signal (single-frequency sine) for (i=0; i<num_samples; i++) m[i] = 0.7f*cosf(2*M_PI*0.013f*i + 0.0f); // modulate/demodulate signal for (i=0; i<num_samples; i++) { // modulate freqmod_modulate(mod, m[i], &r[i]); // demodulate freqdem_demodulate(dem, r[i], &y[i]); } // delete modem objects freqmod_destroy(mod); freqdem_destroy(dem); #if 0 // compute power spectral densities and compare float complex mcf[num_samples]; float complex ycf[num_samples]; float complex M[num_samples]; float complex Y[num_samples]; for (i=0; i<num_samples; i++) { mcf[i] = m[i] * hamming(i,num_samples); ycf[i] = y[i] * hamming(i,num_samples); } fft_run(num_samples, mcf, M, LIQUID_FFT_FORWARD, 0); fft_run(num_samples, ycf, Y, LIQUID_FFT_FORWARD, 0); // run test: compare spectral magnitude for (i=0; i<num_samples; i++) CONTEND_DELTA( cabsf(Y[i]), cabsf(M[i]), tol ); #endif }
FmFunction::FmFunction(RealStreamFunction * func, double modIndex) : _func(func), _mod(freqmod_create((float)modIndex)) { }