diff --git a/Filtros/Filtros.cpp b/Filtros/Filtros.cpp index 272d36b..ede002a 100644 --- a/Filtros/Filtros.cpp +++ b/Filtros/Filtros.cpp @@ -2,19 +2,20 @@ namespace Filtros { - std::vector media_movel_simples(std::vector dados, int tamanho_da_amostra) + template + std::vector media_movel_simples(std::vector dados, uint8_t tamanho_da_amostra) /*Media movel simples para atenuar variações bruscas da amostragem*/ { - int tamanho_vetor_dados = dados.size(); - std::vector vetor_retorno; + uint8_t tamanho_vetor_dados = dados.size(); + std::vector vetor_retorno; float acc; - for (int i = 0; i <= tamanho_vetor_dados - tamanho_da_amostra; i++) + for (uint8_t i = 0; i <= tamanho_vetor_dados - tamanho_da_amostra; i++) { acc = 0; - for (int j = 0; j < tamanho_da_amostra; j++) + for (uint8_t j = 0; j < tamanho_da_amostra; j++) { acc += dados[i + j]; } @@ -26,21 +27,27 @@ namespace Filtros return vetor_retorno; } - std::vector media_movel_ponderada(std::vector dados, std::vector pesos) + template std::vector media_movel_simples(std::vector dados, uint8_t tamanho_da_amostra); + template std::vector media_movel_simples(std::vector dados, uint8_t tamanho_da_amostra); + template std::vector media_movel_simples(std::vector dados, uint8_t tamanho_da_amostra); + template std::vector media_movel_simples(std::vector dados, uint8_t tamanho_da_amostra); + + template + std::vector media_movel_ponderada(std::vector dados, std::vector pesos) /*Media movel ponderada, onde pode-se escolher o quanto cada elemento*/ { - int tamanho_vetor_dados = dados.size(); - int tamanho_vetor_pesos = pesos.size(); - std::vector vetor_retorno; + uint8_t tamanho_vetor_dados = dados.size(); + uint8_t tamanho_vetor_pesos = pesos.size(); + std::vector vetor_retorno; float acc1, acc2; - for (int i = 0; i <= tamanho_vetor_dados - tamanho_vetor_pesos; i++) + for (uint8_t i = 0; i <= tamanho_vetor_dados - tamanho_vetor_pesos; i++) { acc1 = 0; acc2 = 0; - for (int j = 0; j < tamanho_vetor_pesos; j++) + for (uint8_t j = 0; j < tamanho_vetor_pesos; j++) { acc1 += dados[i + j] * pesos[j]; acc2 += pesos[j]; @@ -53,24 +60,30 @@ namespace Filtros return vetor_retorno; } - std::vector media_movel_exponencial(std::vector dados, int tamanho_da_amostra) + template std::vector media_movel_ponderada(std::vector dados, std::vector pesos); + template std::vector media_movel_ponderada(std::vector dados, std::vector pesos); + template std::vector media_movel_ponderada(std::vector dados, std::vector pesos); + template std::vector media_movel_ponderada(std::vector dados, std::vector pesos); + + template + std::vector media_movel_exponencial(std::vector dados, uint8_t tamanho_da_amostra) /* Media movel exponencial, um tipo de media onde os dados mais recentes possuem um peso maior */ { - int tamanho_vetor_dados = dados.size(); + uint8_t tamanho_vetor_dados = dados.size(); float alpha = 2 / ((float)tamanho_da_amostra + 1); - std::vector vetor_retorno; + std::vector vetor_retorno; float acc1, acc2; - for (int i = 0; i <= tamanho_vetor_dados - tamanho_da_amostra; i++) + for (uint8_t i = 0; i <= tamanho_vetor_dados - tamanho_da_amostra; i++) { acc1 = 0; acc2 = 0; - for (int j = 0; j < tamanho_da_amostra; j++) + for (uint8_t j = 0; j < tamanho_da_amostra; j++) { acc1 += dados[i + j] * pow(1 - alpha, tamanho_da_amostra - j - 1); acc2 += pow(1 - alpha, tamanho_da_amostra - j - 1); @@ -82,4 +95,9 @@ namespace Filtros return vetor_retorno; } + + template std::vector media_movel_exponencial(std::vector dados, uint8_t tamanho_da_amostra); + template std::vector media_movel_exponencial(std::vector dados, uint8_t tamanho_da_amostra); + template std::vector media_movel_exponencial(std::vector dados, uint8_t tamanho_da_amostra); + template std::vector media_movel_exponencial(std::vector dados, uint8_t tamanho_da_amostra); } \ No newline at end of file diff --git a/Filtros/Filtros.hpp b/Filtros/Filtros.hpp index 136a326..0b55fb2 100644 --- a/Filtros/Filtros.hpp +++ b/Filtros/Filtros.hpp @@ -1,3 +1,6 @@ +#ifndef FILTROS +#define FILTROS + #include #include #include @@ -7,13 +10,18 @@ namespace Filtros { // Media movel simples - std::vector media_movel_simples(std::vector dados, int tamanho_da_amostra); + template + std::vector media_movel_simples(std::vector dados, uint8_t tamanho_da_amostra); // Media movel ponderada, onde pode se escolher o quanto cada elemento // do vetor influencia no resultado da media - std::vector media_movel_ponderada(std::vector dados, std::vector pesos); + template + std::vector media_movel_ponderada(std::vector dados, std::vector pesos); // Media movel exponencial, um tipo de media onde os dados mais recentes // possuem um peso maior - std::vector media_movel_exponencial(std::vector dados, int tamanho_da_amostra); + template + std::vector media_movel_exponencial(std::vector dados, uint8_t tamanho_da_amostra); } + +#endif diff --git a/Filtros/Teste.cpp b/Filtros/Teste.cpp index 5c2911f..0737391 100644 --- a/Filtros/Teste.cpp +++ b/Filtros/Teste.cpp @@ -2,17 +2,33 @@ #include #include -void print_vetor(std::vector vetor_impressao) +template +void print_vetor(std::vector vetor_impressao) { std::cout << "{ "; for (int i = 0; i < vetor_impressao.size(); i++) { - printf("%.4f,", vetor_impressao[i]); + std::cout << vetor_impressao[i] << " "; } std::cout << "}" << std::endl; } -int main() +void teste_uint16() +{ + std::vector vetor_teste{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + std::vector vetor_pesos{0.2, 0.3, 0.5}; + + std::vector vetor_resultado_mms = Filtros::media_movel_simples(vetor_teste, 3); + std::vector vetor_resultado_mmp = Filtros::media_movel_ponderada(vetor_teste, vetor_pesos); + std::vector vetor_resultado_mme = Filtros::media_movel_exponencial(vetor_teste, 3); + + print_vetor(vetor_teste); + print_vetor(vetor_resultado_mms); + print_vetor(vetor_resultado_mmp); + print_vetor(vetor_resultado_mme); +} + +void teste_float() { std::vector vetor_teste{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; std::vector vetor_pesos{0.2, 0.3, 0.5}; @@ -25,4 +41,10 @@ int main() print_vetor(vetor_resultado_mms); print_vetor(vetor_resultado_mmp); print_vetor(vetor_resultado_mme); +} + +int main() +{ + teste_uint16(); + teste_float(); } \ No newline at end of file