void ModemFMStereo::disposeKit(ModemKit *kit) { ModemKitFMStereo *fmkit = (ModemKitFMStereo *)kit; msresamp_rrrf_destroy(fmkit->audioResampler); msresamp_rrrf_destroy(fmkit->stereoResampler); firfilt_rrrf_destroy(fmkit->firStereoLeft); firfilt_rrrf_destroy(fmkit->firStereoRight); firhilbf_destroy(fmkit->firStereoR2C); firhilbf_destroy(fmkit->firStereoC2R); nco_crcf_destroy(fmkit->stereoPilot); }
// // AUTOTEST : fir group delay, n=3 // void autotest_fir_groupdelay_n3() { // create coefficients array float h[3] = {0.1, 0.2, 0.4}; float tol = 1e-3f; unsigned int i; // create testing vectors float fc[4] = { 0.000, 0.125, 0.250, 0.375}; float g0[4] = { 1.42857142857143, 1.54756605839643, 2.15384615384615, 2.56861651421767}; // run tests float g; for (i=0; i<4; i++) { g = fir_group_delay(h, 3, fc[i]); CONTEND_DELTA( g, g0[i], tol ); } // create filter firfilt_rrrf filter = firfilt_rrrf_create(h,3); // run tests again for (i=0; i<4; i++) { g = firfilt_rrrf_groupdelay(filter, fc[i]); CONTEND_DELTA( g, g0[i], tol ); } // destroy filter firfilt_rrrf_destroy(filter); }
void gmskdem_destroy(gmskdem _q) { #if DEBUG_GMSKDEM // print to external file gmskdem_debug_print(_q, DEBUG_GMSKDEM_FILENAME); // destroy debugging objects windowf_destroy(_q->debug_mfout); #endif // destroy filter object #if GMSKDEM_USE_EQUALIZER eqlms_rrrf_destroy(_q->eq); #else firfilt_rrrf_destroy(_q->filter); #endif // free filter array free(_q->h); // free main object memory free(_q); }
int main() { // options unsigned int h_len=17; // filter length float fc=0.2f; // filter cutoff float As=30.0f; // stop-band attenuation [dB] float mu=0.0f; // timing offset unsigned int n=64; // number of random input samples // derived values unsigned int num_samples = n + h_len; // arrays float x[num_samples]; // filter input float y[num_samples]; // filter output unsigned int i; float h[h_len]; liquid_firdes_kaiser(h_len,fc,As,mu,h); firfilt_rrrf f = firfilt_rrrf_create(h,h_len); firfilt_rrrf_print(f); for (i=0; i<num_samples; i++) { // generate noise x[i] = (i<n) ? randnf()/sqrtf(n/2) : 0.0f; firfilt_rrrf_push(f, x[i]); firfilt_rrrf_execute(f, &y[i]); printf("x[%4u] = %12.8f, y[%4u] = %12.8f;\n", i, x[i], i, y[i]); } // destroy filter object firfilt_rrrf_destroy(f); // // export results // FILE*fid = fopen(OUTPUT_FILENAME,"w"); fprintf(fid,"%% firfilt_rrrf_example.m: auto-generated file\n\n"); fprintf(fid,"clear all;\nclose all;\n\n"); fprintf(fid,"h_len=%u;\nn=%u;\n", h_len, n); for (i=0; i<h_len; i++) fprintf(fid,"h(%4u) = %12.4e;\n", i+1, h[i]); for (i=0; i<num_samples; i++) fprintf(fid,"x(%4u) = %12.4e; y(%4u) = %12.4e;\n", i+1, x[i], i+1, y[i]); fprintf(fid,"nfft=512;\n"); fprintf(fid,"H=20*log10(abs(fftshift(fft(h,nfft))));\n"); fprintf(fid,"X=20*log10(abs(fftshift(fft(x,nfft))));\n"); fprintf(fid,"Y=20*log10(abs(fftshift(fft(y,nfft))));\n"); fprintf(fid,"f=[0:(nfft-1)]/nfft-0.5;\n"); fprintf(fid,"figure;\n"); fprintf(fid,"plot(f,X,'Color',[0.3 0.3 0.3],...\n"); fprintf(fid," f,Y,'LineWidth',2,...\n"); fprintf(fid," f,H,'-b','LineWidth',2);\n"); fprintf(fid,"axis([-0.5 0.5 -80 40]);\n"); fprintf(fid,"grid on;\nxlabel('normalized frequency');\nylabel('PSD [dB]');\n"); fprintf(fid,"legend('noise','filtered noise','filter prototype',1);"); fclose(fid); printf("results written to %s\n", OUTPUT_FILENAME); printf("done.\n"); return 0; }
int main(int argc, char*argv[]) { // options unsigned int h_len=19; // filter length unsigned int p=5; // polynomial order float fc=0.45f; // filter cutoff float As=60.0f; // stop-band attenuation [dB] float mu=0.1f; // fractional sample delay unsigned int num_samples=60; // number of samples to evaluate int verbose = 0; // verbose output? int dopt; while ((dopt = getopt(argc,argv,"hvt:")) != EOF) { switch (dopt) { case 'h': usage(); return 0; case 'v': verbose = 1; break; case 't': mu = atof(optarg); break; default: exit(1); } } // data arrays float x[num_samples]; // input data array float y[num_samples]; // output data array // create and initialize Farrow filter object firfarrow_rrrf f = firfarrow_rrrf_create(h_len, p, fc, As); firfarrow_rrrf_set_delay(f, mu); unsigned int i; // generate input (filtered noise) float hx[21]; liquid_firdes_kaiser(15, 0.1, 60, 0, hx); firfilt_rrrf fx = firfilt_rrrf_create(hx, 15); for (i=0; i<num_samples; i++) { firfilt_rrrf_push(fx, i < 40 ? randnf() : 0.0f); firfilt_rrrf_execute(fx, &x[i]); } firfilt_rrrf_destroy(fx); // push input through filter for (i=0; i<num_samples; i++) { firfarrow_rrrf_push(f, x[i]); firfarrow_rrrf_execute(f, &y[i]); } // destroy Farrow filter object firfarrow_rrrf_destroy(f); FILE*fid = fopen(OUTPUT_FILENAME,"w"); fprintf(fid,"%% %s : auto-generated file\n\n", OUTPUT_FILENAME); fprintf(fid,"clear all;\nclose all;\n\n"); fprintf(fid,"h_len = %u;\n", h_len); fprintf(fid,"mu = %f;\n", mu); fprintf(fid,"num_samples = %u;\n", num_samples); for (i=0; i<num_samples; i++) { fprintf(fid,"x(%4u) = %12.4e; y(%4u) = %12.4e;\n", i+1, x[i], i+1, y[i]); } // plot the results fprintf(fid,"\n\n"); fprintf(fid,"figure;\n"); fprintf(fid,"tx = 0:(num_samples-1); %% input time scale\n"); fprintf(fid,"ty = tx - (h_len-1)/2 + mu; %% output time scale\n"); fprintf(fid,"plot(tx, x,'-s','MarkerSize',3, ...\n"); fprintf(fid," ty, y,'-s','MarkerSize',3);\n"); fprintf(fid,"legend('input','output',0);\n"); fclose(fid); printf("results written to %s\n", OUTPUT_FILENAME); printf("done.\n"); return 0; }
int main() { // spectral periodogram options unsigned int nfft = 1024; // spectral periodogram FFT size unsigned int num_samples = 4000; // number of samples float beta = 10.0f; // Kaiser-Bessel window parameter float noise_floor = -60.0f; // noise floor [dB] float alpha = 0.1f; // PSD estimate bandwidth unsigned int i; // derived values float nstd = powf(10.0f, noise_floor/20.0f); // create spectral periodogram unsigned int window_size = nfft/2; // spgramf window size spgramf q = spgramf_create_kaiser(nfft, window_size, beta); // generate signal (filter with frequency offset) unsigned int h_len = 91; // filter length float fc = 0.07f; // filter cut-off frequency float f0 = 0.20f; // filter center frequency float As = 60.0f; // filter stop-band attenuation float h[h_len]; // filter coefficients liquid_firdes_kaiser(h_len, fc, As, 0, h); // add frequency offset for (i=0; i<h_len; i++) h[i] *= cosf(2*M_PI*f0*i); firfilt_rrrf filter = firfilt_rrrf_create(h, h_len); firfilt_rrrf_set_scale(filter, 2.0f*fc); for (i=0; i<num_samples; i++) { // generate random sample float x = randnf(); // filter float y = 0; firfilt_rrrf_push(filter, x); firfilt_rrrf_execute(filter, &y); // add noise y += nstd * randnf(); // push resulting sample through periodogram spgramf_accumulate_psd(q, &y, alpha, 1); } // compute power spectral density output float psd[nfft]; spgramf_write_accumulation(q, psd); // destroy objects firfilt_rrrf_destroy(filter); spgramf_destroy(q); // // export output file // FILE * fid = fopen(OUTPUT_FILENAME,"w"); fprintf(fid,"%% %s : auto-generated file\n", OUTPUT_FILENAME); fprintf(fid,"clear all;\n"); fprintf(fid,"close all;\n\n"); fprintf(fid,"nfft = %u;\n", nfft); fprintf(fid,"f = [0:(nfft-1)]/nfft - 0.5;\n"); fprintf(fid,"H = zeros(1,nfft);\n"); fprintf(fid,"noise_floor = %12.6f;\n", noise_floor); for (i=0; i<nfft; i++) fprintf(fid,"H(%6u) = %12.4e;\n", i+1, psd[i]); fprintf(fid,"figure;\n"); fprintf(fid,"plot(f, H, '-', 'LineWidth',1.5);\n"); fprintf(fid,"xlabel('Normalized Frequency [f/F_s]');\n"); fprintf(fid,"ylabel('Power Spectral Density [dB]');\n"); fprintf(fid,"grid on;\n"); fprintf(fid,"ymin = 10*floor([noise_floor-20]/10);\n"); fprintf(fid,"ymax = 10*floor([noise_floor+80]/10);\n"); fprintf(fid,"axis([-0.5 0.5 ymin ymax]);\n"); fclose(fid); printf("results written to %s.\n", OUTPUT_FILENAME); printf("done.\n"); return 0; }