/examples/firpfbch_crcf_msource_example.c

https://github.com/jgaeddert/liquid-dsp · C · 112 lines · 82 code · 15 blank · 15 comment · 7 complexity · be36fc910952bb2de98dee7e4d2fa171 MD5 · raw file

  1. // Generate continuous signals, decompose with analysis channelizer, show spectra
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <complex.h>
  5. #include "liquid.h"
  6. #define OUTPUT_FILENAME "firpfbch_crcf_msource_example.m"
  7. int main() {
  8. // options
  9. unsigned int M = 5; // number of channels
  10. unsigned int m = 12; // filter delay
  11. unsigned int num_samples= 512000; // number of samples to generate
  12. unsigned int nfft = 1200; // FFT size for analysis
  13. // data arrays
  14. unsigned int i;
  15. float complex buf_0[M]; // time-domain input
  16. float complex buf_1[M]; // channelized output
  17. // create filterbank channelizer object using external filter coefficients
  18. firpfbch_crcf q = firpfbch_crcf_create_rnyquist(LIQUID_ANALYZER, M, m, 0.5f,
  19. LIQUID_FIRFILT_ARKAISER);
  20. // create multi-signal source generator
  21. msourcecf gen = msourcecf_create_default();
  22. // add signals (gen, fc, bw, gain, {options})
  23. msourcecf_add_noise(gen, 0.00f,1.00f, -40); // noise floor
  24. msourcecf_add_noise(gen, 0.02f,0.05f, 0); // narrow-band noise
  25. msourcecf_add_tone (gen, -0.40f,0.00f, 20); // tone
  26. msourcecf_add_modem(gen, 0.20f,0.10f, 0, LIQUID_MODEM_QPSK, 12, 0.2f); // modulated data (linear)
  27. msourcecf_add_gmsk (gen, -0.20f,0.05f, 0, 4, 0.3f); // modulated data (GMSK)
  28. // create objects for computing spectra
  29. spgramcf psd_0 = spgramcf_create_default(nfft);
  30. spgramcf psd_1[M];
  31. for (i=0; i<M; i++)
  32. psd_1[i] = spgramcf_create_default(nfft);
  33. // generate signals
  34. while (msourcecf_get_num_samples(gen) < num_samples) {
  35. // write samples to buffer
  36. msourcecf_write_samples(gen, buf_0, M);
  37. // run through channelizer
  38. firpfbch_crcf_analyzer_execute(q, buf_0, buf_1);
  39. // push resulting sample through periodogram objects
  40. spgramcf_write(psd_0, buf_0, M);
  41. for (i=0; i<M; i++)
  42. spgramcf_push(psd_1[i], buf_1[i]);
  43. }
  44. // export results to file
  45. FILE * fid = fopen(OUTPUT_FILENAME,"w");
  46. fprintf(fid,"%% %s: auto-generated file\n\n", OUTPUT_FILENAME);
  47. fprintf(fid,"clear all;\n");
  48. fprintf(fid,"close all;\n");
  49. fprintf(fid,"M = %u;\n", M);
  50. fprintf(fid,"nfft = %u;\n", nfft);
  51. fprintf(fid,"%% input signal spectrum\n");
  52. fprintf(fid,"X = zeros(1,nfft);\n");
  53. float psd[nfft];
  54. spgramcf_get_psd(psd_0, psd);
  55. for (i=0; i<nfft; i++)
  56. fprintf(fid," X(%6u) = %12.4e;\n", i+1, psd[i]);
  57. fprintf(fid,"%% channelized output signal spectra\n");
  58. fprintf(fid,"Y = zeros(M, nfft);\n");
  59. // save channelized output signals
  60. for (i=0; i<M; i++) {
  61. spgramcf_get_psd(psd_1[i], psd);
  62. fprintf(fid,"Y(%u,:) = [", i+1);
  63. unsigned int k;
  64. for (k=0; k<nfft; k++) {
  65. fprintf(fid,"%6g,", psd[k]);
  66. }
  67. fprintf(fid,"];\n");
  68. }
  69. // plot results
  70. fprintf(fid,"\n");
  71. fprintf(fid,"f = [0:(nfft-1)]/nfft - 0.5;\n");
  72. fprintf(fid,"figure('color','white','position',[100 100 1200 600]);\n");
  73. fprintf(fid,"subplot(2,M,1:M);\n");
  74. fprintf(fid," plot(f, X, 'Color', [0 0.5 0.25], 'LineWidth', 2);\n");
  75. fprintf(fid," axis([-0.5 0.5 -50 30]);\n");
  76. fprintf(fid," grid on;\n");
  77. fprintf(fid," xlabel('Normalized Frequency [f/F_s]');\n");
  78. fprintf(fid," ylabel('Input PSD [dB]');\n");
  79. fprintf(fid,"for i=1:M\n");
  80. fprintf(fid," k = mod((i-1) + ceil(M/2),M) + 1;\n");
  81. fprintf(fid," subplot(2,M,M+i);\n");
  82. fprintf(fid," plot(f, Y(k,:)-10*log10(M),'Color',[0.25 0 0.25],'LineWidth', 1.5);\n");
  83. fprintf(fid," axis([-0.5 0.5 -50 30]);\n");
  84. fprintf(fid," grid on;\n");
  85. fprintf(fid," title(['Channel ' num2str(k-1)]);\n");
  86. fprintf(fid,"end;\n");
  87. fclose(fid);
  88. printf("results written to %s\n", OUTPUT_FILENAME);
  89. // destroy objects
  90. msourcecf_destroy(gen);
  91. firpfbch_crcf_destroy(q);
  92. spgramcf_destroy(psd_0);
  93. for (i=0; i<M; i++)
  94. spgramcf_destroy(psd_1[i]);
  95. printf("done.\n");
  96. return 0;
  97. }