afsk_demodulator.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * afsk_demodulator.c
  3. *
  4. * Created on: Sep 10, 2019
  5. * Author: curiousmuch
  6. */
  7. #include "stdio.h"
  8. #include "stdint.h"
  9. #include "math.h"
  10. #include "afsk_demodulator.h"
  11. int8_t window[WINDOW_SIZE];
  12. //int32_t lpf_window[WINDOW_SIZE];
  13. double goertzelFilter(int8_t samples[], double freq, unsigned int N)
  14. {
  15. double s_prev = 0.0;
  16. double s_prev2 = 0.0;
  17. double coeff,normalizedfreq,power,s;
  18. unsigned int i;
  19. normalizedfreq = freq / SAMPLEFREQUENCY;
  20. coeff = 2*cos(2*M_PI*normalizedfreq);
  21. for (i=0; i<N; i++) {
  22. s = samples[i] + coeff * s_prev - s_prev2;
  23. s_prev2 = s_prev;
  24. s_prev = s;
  25. }
  26. power = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2;
  27. return power;
  28. }
  29. float goertzelFilter2(int8_t samples[], float freq, unsigned int N)
  30. {
  31. float s_prev = 0.0;
  32. float s_prev2 = 0.0;
  33. float coeff,normalizedfreq,power,s;
  34. unsigned int i;
  35. normalizedfreq = freq / SAMPLEFREQUENCY;
  36. coeff = 2*cos(2*M_PI*normalizedfreq);
  37. for (i=0; i<N; i++) {
  38. s = samples[i] + coeff * s_prev - s_prev2;
  39. s_prev2 = s_prev;
  40. s_prev = s;
  41. }
  42. power = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2;
  43. return power;
  44. }
  45. void window_init(void)
  46. {
  47. // TODO: setup dynamic allocation
  48. for(unsigned int i=0;i<WINDOW_SIZE;i++)
  49. {
  50. window[i] = 0;
  51. }
  52. }
  53. void window_add(int8_t sample)
  54. {
  55. for(uint32_t i=0;i<(WINDOW_SIZE-1);i++)
  56. {
  57. window[(WINDOW_SIZE-1)-i] = window[(WINDOW_SIZE-2)-i];
  58. }
  59. window[0] = sample;
  60. }
  61. int8_t* window_get(void)
  62. {
  63. return window;
  64. }
  65. unsigned int window_get_size(void)
  66. {
  67. return sizeof(window);
  68. }