afsk_demodulator.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. void goertzel_init(float freq0, float freq1, float *coeff0, float *coeff1)
  14. {
  15. float normalizedfreq;
  16. // calculate coeff0
  17. normalizedfreq = freq0 / SAMPLEFREQUENCY;
  18. *coeff0 = (float) 2*cos(2*M_PI*normalizedfreq);
  19. // calculate coeff1
  20. normalizedfreq = freq1 / SAMPLEFREQUENCY;
  21. *coeff1 = (float) 2*cos(2*M_PI*normalizedfreq);
  22. }
  23. float goertzelFilter(int samples[], float freq, int N) {
  24. float s_prev = 0.0;
  25. float s_prev2 = 0.0;
  26. float coeff,normalizedfreq,power,s;
  27. int i;
  28. normalizedfreq = freq / SAMPLEFREQUENCY;
  29. coeff = 2*cos(2*M_PI*normalizedfreq);
  30. for (i=0; i<N; i++) {
  31. s = samples[i] + coeff * s_prev - s_prev2;
  32. s_prev2 = s_prev;
  33. s_prev = s;
  34. }
  35. power = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2;
  36. return power;
  37. }
  38. float goertzel_filter(int8_t samples[], float coeff, unsigned int N)
  39. {
  40. float s_prev = 0.0;
  41. float s_prev2 = 0.0;
  42. float power, s;
  43. unsigned int i;
  44. for (i=0; i<N; i++) {
  45. s = samples[i] + coeff * s_prev - s_prev2;
  46. s_prev2 = s_prev;
  47. s_prev = s;
  48. }
  49. power = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2;
  50. return power;
  51. }
  52. void window_init(void)
  53. {
  54. // TODO: setup dynamic allocation
  55. for(unsigned int i=0;i<WINDOW_SIZE;i++)
  56. {
  57. window[i] = 0;
  58. }
  59. }
  60. void window_add(int8_t sample)
  61. {
  62. for(uint32_t i=0;i<(WINDOW_SIZE-1);i++)
  63. {
  64. window[(WINDOW_SIZE-1)-i] = window[(WINDOW_SIZE-2)-i];
  65. }
  66. window[0] = sample;
  67. }
  68. int8_t* window_get(void)
  69. {
  70. return window;
  71. }
  72. unsigned int window_get_size(void)
  73. {
  74. return sizeof(window);
  75. }