Skip to content
This repository has been archived by the owner on May 19, 2023. It is now read-only.

Commit

Permalink
Implementação do namespace de filtros usando o modelo de template
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreyCortez committed Feb 4, 2022
1 parent a6cc826 commit 1cfb7a9
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 22 deletions.
50 changes: 34 additions & 16 deletions Filtros/Filtros.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@

namespace Filtros
{
std::vector<float> media_movel_simples(std::vector<float> dados, int tamanho_da_amostra)
template <typename T>
std::vector<T> media_movel_simples(std::vector<T> dados, uint8_t tamanho_da_amostra)
/*Media movel simples para atenuar variações bruscas da amostragem*/
{
int tamanho_vetor_dados = dados.size();
std::vector<float> vetor_retorno;
uint8_t tamanho_vetor_dados = dados.size();
std::vector<T> 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];
}
Expand All @@ -26,21 +27,27 @@ namespace Filtros
return vetor_retorno;
}

std::vector<float> media_movel_ponderada(std::vector<float> dados, std::vector<float> pesos)
template std::vector<uint8_t> media_movel_simples(std::vector<uint8_t> dados, uint8_t tamanho_da_amostra);
template std::vector<uint16_t> media_movel_simples(std::vector<uint16_t> dados, uint8_t tamanho_da_amostra);
template std::vector<uint32_t> media_movel_simples(std::vector<uint32_t> dados, uint8_t tamanho_da_amostra);
template std::vector<float> media_movel_simples(std::vector<float> dados, uint8_t tamanho_da_amostra);

template <typename T>
std::vector<T> media_movel_ponderada(std::vector<T> dados, std::vector<float> 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<float> vetor_retorno;
uint8_t tamanho_vetor_dados = dados.size();
uint8_t tamanho_vetor_pesos = pesos.size();
std::vector<T> 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];
Expand All @@ -53,24 +60,30 @@ namespace Filtros
return vetor_retorno;
}

std::vector<float> media_movel_exponencial(std::vector<float> dados, int tamanho_da_amostra)
template std::vector<uint8_t> media_movel_ponderada(std::vector<uint8_t> dados, std::vector<float> pesos);
template std::vector<uint16_t> media_movel_ponderada(std::vector<uint16_t> dados, std::vector<float> pesos);
template std::vector<uint32_t> media_movel_ponderada(std::vector<uint32_t> dados, std::vector<float> pesos);
template std::vector<float> media_movel_ponderada(std::vector<float> dados, std::vector<float> pesos);

template <typename T>
std::vector<T> media_movel_exponencial(std::vector<T> 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<float> vetor_retorno;
std::vector<T> 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);
Expand All @@ -82,4 +95,9 @@ namespace Filtros

return vetor_retorno;
}

template std::vector<uint8_t> media_movel_exponencial(std::vector<uint8_t> dados, uint8_t tamanho_da_amostra);
template std::vector<uint16_t> media_movel_exponencial(std::vector<uint16_t> dados, uint8_t tamanho_da_amostra);
template std::vector<uint32_t> media_movel_exponencial(std::vector<uint32_t> dados, uint8_t tamanho_da_amostra);
template std::vector<float> media_movel_exponencial(std::vector<float> dados, uint8_t tamanho_da_amostra);
}
14 changes: 11 additions & 3 deletions Filtros/Filtros.hpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#ifndef FILTROS
#define FILTROS

#include <iostream>
#include <array>
#include <vector>
Expand All @@ -7,13 +10,18 @@
namespace Filtros
{
// Media movel simples
std::vector<float> media_movel_simples(std::vector<float> dados, int tamanho_da_amostra);
template <typename T>
std::vector<T> media_movel_simples(std::vector<T> 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<float> media_movel_ponderada(std::vector<float> dados, std::vector<float> pesos);
template <typename T>
std::vector<T> media_movel_ponderada(std::vector<T> dados, std::vector<float> pesos);

// Media movel exponencial, um tipo de media onde os dados mais recentes
// possuem um peso maior
std::vector<float> media_movel_exponencial(std::vector<float> dados, int tamanho_da_amostra);
template <typename T>
std::vector<T> media_movel_exponencial(std::vector<T> dados, uint8_t tamanho_da_amostra);
}

#endif
28 changes: 25 additions & 3 deletions Filtros/Teste.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,33 @@
#include <iostream>
#include <vector>

void print_vetor(std::vector<float> vetor_impressao)
template <typename T>
void print_vetor(std::vector<T> 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<uint16_t> vetor_teste{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<float> vetor_pesos{0.2, 0.3, 0.5};

std::vector<uint16_t> vetor_resultado_mms = Filtros::media_movel_simples(vetor_teste, 3);
std::vector<uint16_t> vetor_resultado_mmp = Filtros::media_movel_ponderada(vetor_teste, vetor_pesos);
std::vector<uint16_t> 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<float> vetor_teste{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<float> vetor_pesos{0.2, 0.3, 0.5};
Expand All @@ -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();
}

0 comments on commit 1cfb7a9

Please sign in to comment.