#define Shift 11
const unsigned int signal_table[] = {
  509,  // 512
  615,  // 523
  469,  // 533
  655,  // 544
  508,  // 555
  622,  // 566
  615,  // 576
  552,  // 587
  675,  // 597
  606,  // 608
  588,  // 618
  660,  // 629
  625,  // 639
  741,  // 650
  754,  // 660
  723,  // 670
  697,  // 680
  700,  // 690
  803,  // 700
  763,  // 710
  634,  // 720
  813,  // 730
  705,  // 740
  736,  // 749
  748,  // 759
  858,  // 768
  849,  // 777
  857,  // 786
  737,  // 795
  727,  // 804
  770,  // 813
  914,  // 822
  884,  // 830
  803,  // 838
  888,  // 847
  890,  // 855
  970,  // 862
  873,  // 870
  889,  // 878
  846,  // 885
  936,  // 892
  814,  // 900
  962,  // 907
  880,  // 913
  1002,  // 920
  937,  // 926
  1023,  // 932
  856,  // 938
  925,  // 944
  1019,  // 950
  940,  // 955
  1010,  // 961
  1023,  // 966
  1023,  // 971
  884,  // 975
  927,  // 980
  941,  // 984
  1021,  // 988
  1019,  // 992
  946,  // 996
  960,  // 999
  959,  // 1002
  956,  // 1005
  1023,  // 1008
  978,  // 1010
  982,  // 1013
  1023,  // 1015
  1023,  // 1017
  991,  // 1019
  1023,  // 1020
  1023,  // 1021
  1023,  // 1022
  995,  // 1023
  1011,  // 1024
  1022,  // 1024
  1010,  // 1024
  1023,  // 1024
  1023,  // 1024
  954,  // 1023
  1023,  // 1022
  954,  // 1021
  946,  // 1020
  952,  // 1019
  969,  // 1017
  1023,  // 1015
  994,  // 1013
  1023,  // 1010
  972,  // 1008
  1023,  // 1005
  1023,  // 1002
  1023,  // 999
  974,  // 996
  1023,  // 992
  969,  // 988
  1023,  // 984
  999,  // 980
  962,  // 975
  1000,  // 971
  1023,  // 966
  1023,  // 961
  1023,  // 955
  1022,  // 950
  971,  // 944
  938,  // 938
  1023,  // 932
  853,  // 926
  857,  // 920
  1014,  // 913
  834,  // 907
  859,  // 900
  886,  // 892
  821,  // 885
  917,  // 878
  906,  // 870
  831,  // 862
  767,  // 855
  842,  // 847
  764,  // 838
  787,  // 830
  831,  // 822
  764,  // 813
  760,  // 804
  786,  // 795
  874,  // 786
  778,  // 777
  767,  // 768
  670,  // 759
  668,  // 749
  838,  // 740
  826,  // 730
  807,  // 720
  755,  // 710
  746,  // 700
  782,  // 690
  658,  // 680
  653,  // 670
  772,  // 660
  761,  // 650
  711,  // 639
  598,  // 629
  621,  // 618
  618,  // 608
  652,  // 597
  683,  // 587
  589,  // 576
  474,  // 566
  591,  // 555
  483,  // 544
  571,  // 533
  490,  // 523
  462,  // 512
  528,  // 501
  401,  // 491
  398,  // 480
  471,  // 469
  555,  // 458
  424,  // 448
  385,  // 437
  387,  // 427
  460,  // 416
  502,  // 406
  480,  // 395
  433,  // 385
  335,  // 374
  454,  // 364
  377,  // 354
  305,  // 344
  261,  // 334
  315,  // 324
  233,  // 314
  285,  // 304
  284,  // 294
  267,  // 284
  221,  // 275
  229,  // 265
  231,  // 256
  286,  // 247
  304,  // 238
  301,  // 229
  272,  // 220
  250,  // 211
  236,  // 202
  222,  // 194
  114,  // 186
  109,  // 177
  248,  // 169
  122,  // 162
  139,  // 154
  146,  // 146
  238,  // 139
  200,  // 132
  197,  // 124
  124,  // 117
  189,  // 111
  43,  // 104
  146,  // 98
  68,  // 92
  116,  // 86
  156,  // 80
  92,  // 74
  41,  // 69
  3,  // 63
  39,  // 58
  118,  // 53
  0,  // 49
  75,  // 44
  146,  // 40
  0,  // 36
  30,  // 32
  125,  // 28
  0,  // 25
  0,  // 22
  0,  // 19
  114,  // 16
  75,  // 14
  64,  // 11
  100,  // 9
  39,  // 7
  116,  // 5
  32,  // 4
  106,  // 3
  0,  // 2
  48,  // 1
  3,  // 0
  0,  // 0
  0,  // 0
  0,  // 0
  115,  // 0
  0,  // 1
  0,  // 2
  70,  // 3
  0,  // 4
  0,  // 5
  40,  // 7
  0,  // 9
  108,  // 11
  0,  // 14
  0,  // 16
  0,  // 19
  87,  // 22
  63,  // 25
  0,  // 28
  2,  // 32
  93,  // 36
  128,  // 40
  108,  // 44
  54,  // 49
  20,  // 53
  126,  // 58
  94,  // 63
  118,  // 69
  152,  // 74
  162,  // 80
  115,  // 86
  53,  // 92
  63,  // 98
  202,  // 104
  48,  // 111
  194,  // 117
  237,  // 124
  84,  // 132
  151,  // 139
  231,  // 146
  255,  // 154
  182,  // 162
  271,  // 169
  178,  // 177
  179,  // 186
  271,  // 194
  295,  // 202
  122,  // 211
  277,  // 220
  183,  // 229
  221,  // 238
  313,  // 247
  216,  // 256
  369,  // 265
  369,  // 275
  385,  // 284
  255,  // 294
  221,  // 304
  403,  // 314
  412,  // 324
  336,  // 334
  356,  // 344
  287,  // 354
  331,  // 364
  447,  // 374
  470,  // 385
  403,  // 395
  509,  // 406
  512,  // 416
  512,  // 427
  418,  // 437
  506,  // 448
  521,  // 458
  419,  // 469
  535,  // 480
  402,  // 491
  426,  // 501
};

int table_index, table_size;
int y0 = 0;
int x0 = 0;
int x1 = 0;
int x2 = 0;
int y1 = 0;
int y2 = 0;

void setup() {
  // Configurar interrupção baseada em tempo para chamar a função filter a cada período de amostragem para fs=30 em us=33333.333333333336(microsegundos).
  cli();  // Desabilitar interrupções

  // Configurar Timer1 para interrupção a cada SAMPLE_INTERVAL_US microssegundos
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  OCR1A = 3333;
  TCCR1B |= (1 << WGM12);  // Modo CTC (Clear Timer on Compare)
  TCCR1B |= (1 << CS11);   // Prescaler 8: Timer1 conta a cada 8 ciclos de clock
  TIMSK1 |= (1 << OCIE1A); // Habilitar interrupção por comparação com OCR1A
  
  Serial.begin(9600);
  sei();  // Habilitar interrupções
}

void loop() {
  // Outras tarefas do loop principal, se necessário
}

ISR(TIMER1_COMPA_vect) {
  // Função de interrupção chamada a cada período de amostragem fs
  // Ler o valor de entrada (exeISR(TIMER1_COMPA_vect) {
  // Função de interrupção chamada a cada período de amostragem fs
  // Ler o valor de entrada da tabela
  int inputValue = signal_table[table_index];
  // Incrementar o índice da tabela
  table_index++;
  if (table_index >= 299) {
                                table_index = 0;
                                 }

  // Chamar a função filter para processar a amostra
  int filteredValue = filter(inputValue);
  // Imprimir os valores brutos e filtrados
  Serial.print(inputValue);
  Serial.print(" ");
  Serial.print( table_index);
  Serial.print(" ");
  Serial.println(filteredValue);
}


int filter(int x0) {
  y0 = ((138.0 * x0) + (276.0 * x1) + (138.0 * x2) - (845.0 * y2) + (2341.0 * y1))/2048;
  // Atualizar as variáveis de entrada e saída para a próxima chamada da função filter
  x2 = x1;
  x1 = x0;
  y2 = y1;
  y1 = y0;
  return y0;
}