Algoritmo de filtro Notch ou Band-pass para 60Hz no MSP430

888 views
Skip to first unread message

agaelema .

unread,
Aug 27, 2014, 10:30:30 PM8/27/14
to Texas Instruments Info para Designers e Projetistas, sis_emb...@googlegroups.com
Boa noite pessoal,

Alguém poderia indicar um algoritmo para aplicar um filtro Notch ou Band-pass em 60 Hz. Iria utiliza-lo no MSP430, então se a implementação for usando integer acaba ficando mais interessante.

A intenção da utilização deles é a identificação da fundamental dos sinais da rede elétrica sem precisar usar FFT ou outros algoritmos complexos.

Em uma apostila de um professor que tive aula encontrei isso: "... um filtro baseado na componente fundamental da Série Discreta de Fourier (SDF), o qual aplica sequências finitas de amostras pode ser denominado Transformada Discreta do Cosseno (DCT)".


​Na sequencia ele explica que o filtro resulta em um filtro de média móvel e que sua resposta é fixa e limitada a um ciclo de 60Hz.

Este filtro FIR é uma boa implementação para o problema?

Desde já, obrigado pessoal.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru

Francisco Fambrini

unread,
Aug 27, 2014, 11:20:22 PM8/27/14
to agaelema, texa...@googlegroups.com
No MATLAB, um Filtro Notch pode ser feito assim

  1. % Filtro notch no MATLAB para 60Hz

  2. Wo = 60/(Fs/2); BW = Wo/35;
  3. [b,a] = iirnotch(Wo,BW);
  4. m = filter(b,a,m);

Sobre implementação em C, dá uma olhada aqui




Em 28 de agosto de 2014 00:19, Francisco Fambrini <ffam...@gmail.com> escreveu:
No MATLAB, um Filtro Notch pode ser feito assim

  1. % Filtro notch no MATLAB para 60Hz

  2. Wo = 60/(Fs/2); BW = Wo/35;
  3. [b,a] = iirnotch(Wo,BW);
  4. m = filter(b,a,m);


Sobre implementação em C, dá uma olhada aqui



--
--
Você recebeu esta mensagem porque está inscrito no Grupo Google "Texas Instruments Info para Designers e Projetistas".
Para postar uma mensagem neste grupo, mande um email para texa...@googlegroups.com
Para deixar o grupo, mande um email para texas-sc+u...@googlegroups.com
Para mais opções, visite este grupo no endereço:
http://groups.google.com/group/texas-sc?hl=pt-BR

---
You received this message because you are subscribed to the Google Groups "Texas Instruments Info para Designers e Projetistas" group.
To unsubscribe from this group and stop receiving emails from it, send an email to texas-sc+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


PJ-MecNet

unread,
Aug 28, 2014, 11:58:30 PM8/28/14
to texa...@googlegroups.com, sis_emb...@googlegroups.com

Raphael Philipe

unread,
Aug 29, 2014, 8:13:32 AM8/29/14
to sis_emb...@googlegroups.com, Texas Instruments Info para Designers e Projetistas
Opa. Se vc for extrair somente a componente de 60Hz do sinal, vc pode usar uma DFT, que eh mais simples de implementar doque a FFT. Ainda no campo da Dft, voce pode usar algoritmos mais eficientes, como o Goertzel, que nao exige que vc tenha a função seno. Se o processamento de sinal for com janela deslizante, onde a diferenca de uma janela com a anterior for inferior a 1 ciclo de 60 Hz, voce pode usar uma DFT recursiva.

Nao conheco o filtro notch, mas para extracao de uma componente especifica de um sinal, recomendo a dft e afins.
--
Você recebeu essa mensagem porque está inscrito no grupo quot;sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.

Raimundo Nonato Pimenta Filho

unread,
Aug 29, 2014, 10:40:23 AM8/29/14
to rap...@gmail.com, sis_emb...@googlegroups.com, Texas Instruments Info para Designers e Projetistas
Notch é o complemento do passa-banda, é o bloqueia-banda, pára-banda...
Um passa-alta + passa-baixa.
[]s

Francisco Fambrini

unread,
Aug 29, 2014, 10:46:19 AM8/29/14
to Raimundo Nonato Pimenta Filho, texa...@googlegroups.com
void filter(const int *x, int *y, int n)
{
    static float x_2 = 0.0f;                    // delayed x, y samples
    static float x_1 = 0.0f;
    static float y_1 = 0.0f;

    for (i = 0; i < n; ++i)
    {
        y[i] = a0 * x[i] + a1 * x_1 + a2 * x_2  // IIR difference equation
                         + b1 * y_1 + b2 * y_2;
        x_2 = x_1;                              // shift delayed x, y samples
        x_1 = x[i];
        y_1 = y[i];
    }
}
Os coeficientes  a0, a1, a2, b1 e b2 podem ser calculados pela formula em anexo onde F é a frequencia de 60 Hz
e R depende da largura de banda da faixa a ser rejeitada



--
--
Você recebeu esta mensagem porque está inscrito no Grupo Google "Texas Instruments Info para Designers e Projetistas".
Para postar uma mensagem neste grupo, mande um email para texa...@googlegroups.com
Para deixar o grupo, mande um email para texas-sc+u...@googlegroups.com
Para mais opções, visite este grupo no endereço:
http://groups.google.com/group/texas-sc?hl=pt-BR

---
Você está recebendo esta mensagem porque se inscreveu no grupo "Texas Instruments Info para Designers e Projetistas" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para texas-sc+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.

screenshot.1.jpg

agaelema .

unread,
Aug 29, 2014, 11:59:03 AM8/29/14
to Texas Instruments Info para Designers e Projetistas, sis_emb...@googlegroups.com
Pessoal muito obrigado pelas dicas. Irei tentar implementar aqui e ver o resultado.

Francisco, se puder tirar algumas dúvida que ficaram, abusando mais um pouco...

- No algoritmo que passou os ponteiros "x" e "y" indicam os arrays de entrada e saída e "n" o total de valores dentro dele?
- Na fórmula "R = 1 - 3BW", BW é a banda passando do filtro em xHz?

Muito obrigado pela ajuda!



Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Você recebeu essa mensagem porque está inscrito no grupo quot;Texas Instruments Info para Designers e Projetistas" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para texas-sc+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Francisco Fambrini

unread,
Aug 29, 2014, 1:03:38 PM8/29/14
to agaelema, texa...@googlegroups.com
Exatamente

x  é um ponteiro  para x[i]   valores lidos pelo Conversor AD e já digitalizados

y é um ponteiro para  y[i],  vetor de saída de dados, já filtrado pelo filtro IIR


- Na fórmula "R = 1 - 3BW", BW é a banda passando do filtro em xHz?

Quase isso.
BW é  a largura de banda percentual

Por exemplo, desejamos fazer um filtro  notch cuja frequencia central é 60Hz

então  60Hz será 100%

Por exemplo:
Voce deseja uma largura de banda de 2 Hz para seu filtro (ou seja, seu filtro atenuará bem as frequencias no intervalo  entre 59 e 61Hz)

2 Hz representam  3,33%  em relação à frequencia central de 60Hz
então  BW = 0.333   e teremos  R = 1 - 3 x 0.333  = 0

Francisco Fambrini

unread,
Aug 29, 2014, 1:05:32 PM8/29/14
to agaelema, texa...@googlegroups.com
Em outras palavras, BW é a largura de banda em relação à frequencia central normalizada.

agaelema .

unread,
Aug 29, 2014, 1:26:30 PM8/29/14
to Francisco Fambrini, Texas Instruments Info para Designers e Projetistas
Francisco, novamente obrigado pela ajuda.

Só mais duas dúvidas, ainda sobre o BW, os "3,33%" não seriam "0,0333"?

Logo mais irei implementar o algoritmo que passou, ele é de um Notch ou Band-pass? Caso for o Notch, existe uma implementação do band-pass tão simples como a que você passou?

Eu poderia por exemplo obter a fundamental subtraindo a saída do filtro notch do sinal original correto? (se bem que não sei se isto é a melhor implementação teoricamente e computacionalmente).

Por último, você possui algum artigo ou trabalho seu ou do seu grupo que fale sobre este tipo de filtro, pois caso funcionar como espero, gostaria de referenciar em meu trabalho.

Assim que testar posto os resultados que obtive.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


agaelema .

unread,
Aug 31, 2014, 6:11:11 PM8/31/14
to Francisco Fambrini, Texas Instruments Info para Designers e Projetistas
Boa noite pessoal, passando para deixar o resultado que consegui com o filtro.

Acabei misturando o algoritmo passado pelo Francisco, com o que encontrei neste link "http://stackoverflow.com/questions/23368427/python-iir-filter-response" e neste onde são citados os cálculos dos coeficientes para os filtros notch e band-pass "https://github.com/ttm/dissertacao/blob/master/devEresultados.tex".

Aparentemente funcionou e consegui o seguinte resultado.



O primeiro gráfico é o somatório da fundamental e da terceira harmônica, o segundo gráfico é o algoritmo baseado no python, ele gera um probleminha com os dados iniciais que ainda não consegui corrigir, e o último gráfico é o algoritmo passado pelo Francisco mas com o código para um band-pass.

Não ficou uma senoide perfeita mas acho que devo conseguir o resultado esperado. Agora só preciso realizar alguns testes para ver como contornar a atenuação causada no sinal e depois tentar utilizar isso em meu projeto.

Nas buscas encontrei sobre este site que possibilita calcular alguns filtros e ainda passa os códigos. infelizmente não consegui rodar direito o código passado, mas tentarei nvoamente. "http://www-users.cs.york.ac.uk/~fisher/mkfilter/".

Caso funcionar irei modificar o código para utilizar somente inteiros e ganhar desempenho no MSP430.

Novamente obrigado pela ajuda de todos.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


agaelema .

unread,
Sep 1, 2014, 3:27:06 PM9/1/14
to sis_emb...@googlegroups.com, Texas Instruments Info para Designers e Projetistas
Anderson, o sample rate do meu projeto é de 3840 Hz.

Até agora não entendo muito a relação do filtro conseguir selecionar a frequência que você utiliza na fórmula, mas não levar em consideração a amostragem. Mas eu sou muito crú nesta matéria pois tive o básico do básico na faculdade, estou tentando aprender algo na marra agora.

Infelizmente o filtro não resultou uma saída totalmente senoidal (pode ser algum erro meu...), mas ainda vou tentar ver se consigo outras implementações.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Em 1 de setembro de 2014 11:10, Anderson <anderso...@gmail.com> escreveu:
Pergunta de leigo:

Qual a frequencia de sampling ?
Procurei e não encontrei onde ela é citada.

Obs.: Repeti a pergunta pois acho que foi somente pro Franscisco Fambrini.

Francisco Fambrini

unread,
Sep 1, 2014, 4:17:46 PM9/1/14
to agaelema, texa...@googlegroups.com
Nada a ver a frequencia de amostragem com a implementação de um filtro IIR.

A frequencia de amostragem define o intervalo de tempo entre amostras consecutivas.
Para uma frequencia de amostragem de 3840 amostras por segundo ( Hz) você tem uma amostra a cada 260,4 us (microsegundos).

O Filtro de Resposta Infinita ao Impulso (IIR) é um Filtro de resposta recursiva
cuja saida y[n]  depende da própria saída em instantes anteriores no tempo.



--

agaelema .

unread,
Sep 1, 2014, 4:51:08 PM9/1/14
to Francisco Fambrini, Texas Instruments Info para Designers e Projetistas
Eu achei que tivesse alguma relação, mas como comentei não tive muitas aulas sobre isso na faculdade.

Irei dar uma estudada no material.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Anderson

unread,
Sep 1, 2014, 6:08:32 PM9/1/14
to texa...@googlegroups.com, sis_emb...@googlegroups.com
Pergunta de leigo:

Qual a frequencia de sampling ?
Procurei e não encontrei onde ela é citada.

Obs.: Repeti a pergunta pois acho que foi somente pro Franscisco Fambrini.




Em 29/08/2014 14:05, Francisco Fambrini escreveu:
> Em outras palavras, BW é a largura de banda em relação à frequencia
> central *normalizada.*
>
>
> Em 29 de agosto de 2014 14:03, Francisco Fambrini <ffam...@gmail.com
> <mailto:ffam...@gmail.com>> escreveu:
>
> Exatamente
>
> x é um ponteiro para x[i] valores lidos pelo Conversor AD e já
> digitalizados
>
> y é um ponteiro para y[i], vetor de saída de dados, já filtrado
> pelo filtro IIR
>
>
> - Na fórmula "R = 1 - 3BW", BW é a banda passando do filtro em xHz?
>
> Quase isso.
> BW é a largura de banda percentual
>
> Por exemplo, desejamos fazer um filtro notch cuja frequencia
> central é 60Hz
>
> então 60Hz será 100%
>
> Por exemplo:
> Voce deseja uma largura de banda de 2 Hz para seu filtro (ou seja,
> seu filtro atenuará bem as frequencias no intervalo entre 59 e 61Hz)
>
> 2 Hz representam 3,33% em relação à frequencia central de 60Hz
> então BW = 0.333 e teremos R = 1 - 3 x 0.333 = 0
>
>
>
> Em 29 de agosto de 2014 12:59, agaelema . <agae...@gmail.com
> <mailto:agae...@gmail.com>> escreveu:
>
> Pessoal muito obrigado pelas dicas. Irei tentar implementar
> aqui e ver o resultado.
>
> Francisco, se puder tirar algumas dúvida que ficaram, abusando
> mais um pouco...
>
> - No algoritmo que passou os ponteiros "x" e "y" indicam os
> arrays de entrada e saída e "n" o total de valores dentro dele?
> - Na fórmula "R = 1 - 3BW", BW é a banda passando do filtro em
> xHz?
>
> Muito obrigado pela ajuda!
>
>
>
> *Haroldo L. M. Amaral*
> Mestrando em Eng. Elétrica - UNESP Bauru
> Laboratório de Sistemas de Potência e Técnicas Inteligentes -
> LSISPOTI
> Tecnólogo em Sistemas Biomédicos - FATEC Bauru
> Técnico em Eletrônica - CTI/UNESP Bauru
> Currículo Lattes: http://lattes.cnpq.br/3986982115883346
> agae...@gmail.com <mailto:agae...@gmail.com>
>
>
> Em 29 de agosto de 2014 11:46, Francisco Fambrini
> <ffam...@gmail.com <mailto:ffam...@gmail.com>> escreveu:
>
> |void filter(const int *x, int *y, int n)
> {
> static float x_2 = 0.0f; // delayed x, y samples
> static float x_1 = 0.0f;
> static float y_1 = 0.0f;
>
> for (i = 0; i < n; ++i)
> {
> y[i] = a0 * x[i] + a1 * x_1 + a2 * x_2 // IIR difference equation
> + b1 * y_1 + b2 * y_2;
> x_2 = x_1; // shift delayed x, y samples
> x_1 = x[i];
> y_1 = y[i];
> }
> }|
>
> |Os coeficientes a0, a1, a2, b1 e b2 podem ser calculados pela formula em anexo onde F é a frequencia de 60 Hz|
>
> e R depende da largura de banda da faixa a ser rejeitada
>
> |
>
>
>
>
> |
>
>
>
> Em 29 de agosto de 2014 11:40, Raimundo Nonato Pimenta
> Filho <mrbon...@gmail.com <mailto:mrbon...@gmail.com>>
> escreveu:
>
> Notch é o complemento do passa-banda, é o
> bloqueia-banda, pára-banda...
> Um passa-alta + passa-baixa.
> []s
>
>
> Em 28 de agosto de 2014 00:34, Raphael Philipe
> <rap...@gmail.com <mailto:rap...@gmail.com>> escreveu:
> > Nao conheco o filtro notch, mas para extracao de uma
> componente especifica
> > de um sinal, recomendo a dft e afins.
>
> --
> --
> Você recebeu esta mensagem porque está inscrito no
> Grupo Google "Texas Instruments Info para Designers e
> Projetistas".
> Para postar uma mensagem neste grupo, mande um email
> para texa...@googlegroups.com
> <mailto:texa...@googlegroups.com>
> Para deixar o grupo, mande um email para
> texas-sc+u...@googlegroups.com
> <mailto:texas-sc%2Bunsu...@googlegroups.com>
> Para mais opções, visite este grupo no endereço:
> http://groups.google.com/group/texas-sc?hl=pt-BR
>
> ---
> Você está recebendo esta mensagem porque se inscreveu
> no grupo "Texas Instruments Info para Designers e
> Projetistas" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber
> e-mails dele, envie um e-mail para
> texas-sc+u...@googlegroups.com
> <mailto:texas-sc%2Bunsu...@googlegroups.com>.
> Para obter mais opções, acesse
> https://groups.google.com/d/optout.
>
>
> --
> --
> Você recebeu esta mensagem porque está inscrito no Grupo
> Google "Texas Instruments Info para Designers e Projetistas".
> Para postar uma mensagem neste grupo, mande um email para
> texa...@googlegroups.com <mailto:texa...@googlegroups.com>
> Para deixar o grupo, mande um email para
> texas-sc+u...@googlegroups.com
> <mailto:texas-sc%2Bunsu...@googlegroups.com>
> Para mais opções, visite este grupo no endereço:
> http://groups.google.com/group/texas-sc?hl=pt-BR
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo
> quot;Texas Instruments Info para Designers e Projetistas"
> dos Grupos do Google.
>
> Para cancelar inscrição nesse grupo e parar de receber
> e-mails dele, envie um e-mail para
> texas-sc+u...@googlegroups.com
> <mailto:texas-sc+u...@googlegroups.com>.
> Para mais opções, acesse https://groups.google.com/d/optout.
>
>
> --
> --
> Você recebeu esta mensagem porque está inscrito no Grupo
> Google "Texas Instruments Info para Designers e Projetistas".
> Para postar uma mensagem neste grupo, mande um email para
> texa...@googlegroups.com <mailto:texa...@googlegroups.com>
> Para deixar o grupo, mande um email para
> texas-sc+u...@googlegroups.com
> <mailto:texas-sc%2Bunsu...@googlegroups.com>
> Para mais opções, visite este grupo no endereço:
> http://groups.google.com/group/texas-sc?hl=pt-BR
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo
> quot;Texas Instruments Info para Designers e Projetistas" dos
> Grupos do Google.
>
> Para cancelar inscrição nesse grupo e parar de receber e-mails
> dele, envie um e-mail para
> texas-sc+u...@googlegroups.com
> <mailto:texas-sc+u...@googlegroups.com>.
> Para mais opções, acesse https://groups.google.com/d/optout.
>
>
>
> --
> --
> Você recebeu esta mensagem porque está inscrito no Grupo Google "Texas
> Instruments Info para Designers e Projetistas".
> Para postar uma mensagem neste grupo, mande um email para
> texa...@googlegroups.com
> Para deixar o grupo, mande um email para
> texas-sc+u...@googlegroups.com
> Para mais opções, visite este grupo no endereço:
> http://groups.google.com/group/texas-sc?hl=pt-BR
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo quot;Texas
> Instruments Info para Designers e Projetistas" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele,
> envie um e-mail para texas-sc+u...@googlegroups.com
> <mailto:texas-sc+u...@googlegroups.com>.

Anderson

unread,
Sep 1, 2014, 6:28:28 PM9/1/14
to texa...@googlegroups.com, sis_emb...@googlegroups.com
Confesso que não entendi.

Você disse que esse filtro é válido para qualquer frequência de amostragem.

Entre os parâmetros que você mencionou anteriormente, está 'F', que é a
frequência, na qual o filtro será aplicado.
Inclusive você citou esse exemplo onde F = 60 Hz.

|Os coeficientes a0, a1, a2, b1 e b2 podem ser calculados pela formula em anexo onde F é a frequencia de 60 Hz|


Então os parâmetros desse exemplo são válidos para qualquer frequência
de amostragem ?
Digamos que seria válido até para uma amostragem de 30Hz ... o que não
faz muito sentido pra mim.

Você poderia explicar um pouco mais sobre como é feita a amostragem pra
esse filtro ?

Obrigado



Em 01/09/2014 17:17, Francisco Fambrini escreveu:
> Nada a ver a frequencia de amostragem com a implementação de um filtro
> IIR.
>
> A frequencia de amostragem define o intervalo de tempo entre amostras
> consecutivas.
> Para uma frequencia de amostragem de 3840 amostras por segundo ( Hz)
> você tem *uma amostra a cada 260,4 us *(microsegundos).
>
> O Filtro de Resposta Infinita ao Impulso (IIR) é um Filtro de resposta
> recursiva
> cuja saida y[n] depende da própria saída em instantes anteriores no
> tempo.
>
> https://fenix.tecnico.ulisboa.pt/downloadFile/3779572235132/fir-iir.pdf
>
>
> Em 1 de setembro de 2014 16:26, agaelema . <agae...@gmail.com
> <mailto:agae...@gmail.com>> escreveu:
>
> Anderson, o sample rate do meu projeto é de 3840 Hz.
>
> Até agora não entendo muito a relação do filtro conseguir
> selecionar a frequência que você utiliza na fórmula, mas não levar
> em consideração a amostragem. Mas eu sou muito crú nesta matéria
> pois tive o básico do básico na faculdade, estou tentando aprender
> algo na marra agora.
>
> Infelizmente o filtro não resultou uma saída totalmente senoidal
> (pode ser algum erro meu...), mas ainda vou tentar ver se consigo
> outras implementações.
>
> *Haroldo L. M. Amaral*
> Mestrando em Eng. Elétrica - UNESP Bauru
> Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
> Tecnólogo em Sistemas Biomédicos - FATEC Bauru
> Técnico em Eletrônica - CTI/UNESP Bauru
> Currículo Lattes: http://lattes.cnpq.br/3986982115883346
> agae...@gmail.com <mailto:agae...@gmail.com>
>
>
> Em 1 de setembro de 2014 11:10, Anderson
> <anderso...@gmail.com <mailto:anderso...@gmail.com>>
> escreveu:
>
> Pergunta de leigo:
>
> Qual a frequencia de sampling ?
> Procurei e não encontrei onde ela é citada.
>
> Obs.: Repeti a pergunta pois acho que foi somente pro
> Franscisco Fambrini.
>
> --
> --
> Você recebeu esta mensagem porque está inscrito no Grupo Google
> "Texas Instruments Info para Designers e Projetistas".
> Para postar uma mensagem neste grupo, mande um email para
> texa...@googlegroups.com <mailto:texa...@googlegroups.com>
> Para deixar o grupo, mande um email para
> texas-sc+u...@googlegroups.com
> <mailto:texas-sc%2Bunsu...@googlegroups.com>
> Para mais opções, visite este grupo no endereço:
> http://groups.google.com/group/texas-sc?hl=pt-BR
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo
> quot;Texas Instruments Info para Designers e Projetistas" dos
> Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails
> dele, envie um e-mail para texas-sc+u...@googlegroups.com
> <mailto:texas-sc+u...@googlegroups.com>.
> Para mais opções, acesse https://groups.google.com/d/optout.
>
>
> --
> --
> Você recebeu esta mensagem porque está inscrito no Grupo Google "Texas
> Instruments Info para Designers e Projetistas".
> Para postar uma mensagem neste grupo, mande um email para
> texa...@googlegroups.com
> Para deixar o grupo, mande um email para
> texas-sc+u...@googlegroups.com
> Para mais opções, visite este grupo no endereço:
> http://groups.google.com/group/texas-sc?hl=pt-BR
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo quot;Texas
> Instruments Info para Designers e Projetistas" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele,
> envie um e-mail para texas-sc+u...@googlegroups.com
> <mailto:texas-sc+u...@googlegroups.com>.

Christiano

unread,
Sep 4, 2014, 12:17:20 AM9/4/14
to texa...@googlegroups.com, ffam...@gmail.com
Haroldo, você quer somente uma forma de detectar qual é a frequência da rede elétrica? Precisa ser necessariamente usando ADC e processamento digital de sinais?

Usando um optoacoplador você consegue detectar passagens por zero e seu problema passa a ser basicamente usar o timer, bem simples.

http://electronics.stackexchange.com/questions/8672/120vac-60hz-zero-cross-detector

agaelema .

unread,
Sep 4, 2014, 1:23:15 AM9/4/14
to Christiano, Texas Instruments Info para Designers e Projetistas, Francisco Fambrini
Boa noite Christiano.

Na verdade a ideia é identificar a fundamental das ondas de tensão e corrente e seus valores, mesmo na presença de distorção harmônica. Se conseguir isso posso calcular o THD sem necessitar de utilizar uma FFT além de traçar alguns outros comparativos.

Em meu projeto da graduação identificava a freq da rede através de um circuito parecido, pegando a tensão do secundário e aplicando em um detector de zero-crossing, funcionou muito bem.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Você está recebendo esta mensagem porque se inscreveu no grupo "Texas Instruments Info para Designers e Projetistas" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para texas-sc+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.

Raphael Philipe

unread,
Sep 4, 2014, 3:10:02 PM9/4/14
to agae...@gmail.com, Christiano, Texas Instruments Info para Designers e Projetistas, Francisco Fambrini
Haroldo, 

Desculpa a pergunta, mas por que você não pode usar a FFT? Por conta de processamento ou algum outro tipo de restrição?

Iria te indicar extrair a fundamental usando a TDF (Transformada Discreta de Fourier), por meio do algoritmo de Goertzel. http://en.wikipedia.org/wiki/Goertzel_algorithm

A partir disso, vc pode extrair o THD aproximado, usando o valor RMS do sinal. 

THD ~= (RMS - Fundamental) / Fundamental


att

Francisco Fambrini

unread,
Sep 4, 2014, 3:15:11 PM9/4/14
to Raphael Philipe, texa...@googlegroups.com
Código que calcula FFT de um sinal:

#include<iostream.h>
#include<stdio.h>
#include<math.h>

main( )
{
int n=200;  // 200 pontos de amostra

double* tempo=new double[n];     //armazena as 200 amostras igualmente espaçadas 
do sinal
for(int i=0;i<n;i++)
tempo[i]=cos(6.2831853*10*((double) i/(double)n)) + cos(6.2831853*25*((double)i/(double)n)) + cos(6.2831853*50*((double)i/(double)n)) + cos(6.2831853*100*((double)i/(double)n)); 

 
double *tfr=new double[n]; // armazena a parte real do sinal
double *tfi=new double[n]; // armazena a parte imaginária do sinal

for(int u=1;u<(n/2)+1;u++) {
tfr[u]=0;
tfi[u]=0;
for(int x=0;x<n;x++)

{ // A exponencial de (-j2put)/N da equação eq 1, onde j é o número complexo v-1 é
 //  matematicamente igual a cos((-j2put)/N) – j*sin((-j2put)/N)

tfr[u]+=tempo[x]*cos(6.2831853*u*(double)x/(double)n);
tfi[u]-=tempo[x]*sin(6.2831853*u* (double)x/(double)n);
}
tfr[u]/=(double)n;
tfi[u]/=(double)n;
cout<<"\nNa frequência de "<<u<<" Hz, a amplitude é de "<<sqrt((tfr[u]*tfr[u])
+(tfi[u]*tfi[u])); //a raiz quadrada da
//soma dos quadrados das partes reais e imaginárias produz o módulo (amplitude) 
de cada frequência.
getchar();
}
}

agaelema .

unread,
Sep 4, 2014, 8:05:44 PM9/4/14
to Texas Instruments Info para Designers e Projetistas
Rafael, basicamente eu descartei o uso da FFT pois durante muito tempo procurei diversos algoritmos e basicamente nenhum deles funcionavam. Idealmente creio que seria a melhor manteira de realizar o que quero. Um segundo fator é com relação ao processamento em um uC simples como o MSP430 que estou utilizando. Entretanto com um algoritmo funcional eu com certeza tentaria implementar e otimizar para obter o melhor resultado. Já vi alguns projetos realizando FFT em MSP430 aparentemente com resultados bons com relação ao desempenho.

Vou dar uma olhada sobre este tipo de TDF usando algoritmo Goertzel e se consigo algum resultado. Com a fundamental consigo fazer a análise do THD aproximado como você comentou que seria algo a mais em meu trabalho.

Você tem algum algoritmo a indicar? este da página que citou serve como uma boa base para tentar montar um?

Obrigado pelas dicas.


Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Em 4 de setembro de 2014 16:09, Raphael Philipe <rap...@gmail.com> escreveu:

agaelema .

unread,
Sep 4, 2014, 8:07:56 PM9/4/14
to Texas Instruments Info para Designers e Projetistas
Francisco obrigado pelo código, mais tarde irei testa-lo.

Obrigado a todos pela ajuda, tem sido bastante interessante para meu aprendizado.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Raphael Philipe

unread,
Sep 4, 2014, 9:07:39 PM9/4/14
to agaelema, Texas Instruments Info para Designers e Projetistas
A Primeira resposta aqui no stack overflow parece uma boa implementação em C do Goertzel. Mas sugiro você brincar um pouco no Matlab para se familizarizar.
http://stackoverflow.com/questions/11579367/implementation-of-goertzel-algorithm-in-c

Naquela página do wikipedia que te passei tem o algoritmo em pseudocódigo tbm


Veja, no algoritmo que a grande vantagem do Goertzel, é que não precisamos o 

Raphael Philipe

unread,
Sep 4, 2014, 11:33:11 PM9/4/14
to agaelema, Texas Instruments Info para Designers e Projetistas
Complementando a resposta anterior, que foi sem querer.

A Primeira resposta aqui no stack overflow parece uma boa
implementação em C do Goertzel. Mas sugiro você brincar um pouco no
Matlab/Octave para se familizarizar.

http://stackoverflow.com/questions/11579367/implementation-of-goertzel-algorithm-in-c

Naquela página do wikipedia que te passei tem o algoritmo em
pseudocódigo do Goertzel.

A grande vantagem do Goertzel, é que não precisamos ter a função seno
e cosseno cálculadas a cada iteração, como na FFT.

O loop que extrai a componente da frequência w é só um conjunto de
somas e múltiplicações, de modo que w pode ser uma constante, que da
origen a q0, q1 e q2.

for(i=0; i<numSamples; i++)
{
q0 = coeff * q1 - q2 + data[i];
q2 = q1;
q1 = q0;
}


A formula que te passei anteriormente, para calcular o THD de forma
aproximada estava errada.

O correto seria:

THD~=sqrt(RMS_sinal^2 - RMS_fundamental^2) / RMS_fundamental;

O por que da fórmula é que o RMS total é iqual a raiz quadrada da soma
quadrática do RMS das componentes , para o caso de um sinal composto
de sinais ortogonais, como as harmônicas.
http://en.wikipedia.org/wiki/Root_mean_square

Como fiquei com peso na consciência de ter te passado a informação
errada, fiz um teste no octave para provar que o método funciona, e
dai você pode utilizar de exemplo se quiser. Acredito que de para
rodar no Matlab sem problemas:

%Neste exemplo, utilizei uma janela de um ciclo, com 16 amostras.
%valores de pico do sinal
A1=10; % fundamental
A2=2; % 2 harmonica
A3=4; % 3 harmonica
%valores RMS dos componentes. Vai ser usado no final para provar que o
metodo funciona
A1rms = A1 * sqrt(2);
A2rms = A2 * sqrt(2);
A3rms = A3 * sqrt(2);

%frequencia do sinal
f=60;
%frequencia de amostragem (16 amostras por ciclo).
fs = 16*60;
%periodo de amostragem
T=1/fs;
%amostras
k = 0:256;
%sinal amostrado
x=A1*sin(2*pi*f*k*T) + A2*sin(2*pi*(2*f)*k*T)+A3*sin(2*pi*(3*f)*k*T);

%tamanho da janela
N = 16;
%qual a raia ou bin vamos tirar do sinal (fundamental = 1)
bin = 1;
%frequencia angular
w = 2 * pi * bin / N;

%%algoritmo de goertzel
%%--------------
cr = cos(w);
ci = sin(w);

coeff = 2 * cr;
sprev = 0;
sprev2 = 0;
%%indice da janela deslizante
t = 20;

for i = t:(t+N-1)
s = x(i) + coeff * sprev - sprev2;
sprev2 = sprev;
sprev = s;
end
parte_real = (sprev - sprev2 * cr);
parte_imaginaria = (sprev2 * ci);
%componente fundamental na forma de fasor
X = parte_real + j * parte_imaginaria;
%sera extraido o valor rms
rms_fundamental = abs(X)*sqrt(2)/N;
%-----------------

%neste caso estamos o valor rms da componente fundamental do sinal,
caso quisessemos tirar o valor
%de pico, seria fundamental = abs(X)*2/N;

%valor RMS do sinal
%-------------
RMS = 0;
for i = t:(t+N-1)
RMS = RMS + x(i) * x(i);
end;

RMS = sqrt(RMS/N);
%---------------

%simulacao do calculo do thd usando uma fft, onde se extrai o valor de
cada componente
% FFT iria calcular o valor de A1rms, A2rms e A3rms.
THD=sqrt(A2rms^2 + A3rms^2)/(A1rms)
%valor aproximado do THD. Funciona pois a fundamental e as harmonicas
sao ortogonais
aprox_THD=sqrt(RMS^2 - rms_fundamental^2)/rms_fundamental;

agaelema .

unread,
Sep 5, 2014, 12:02:24 AM9/5/14
to Francisco Fambrini, Raphael Philipe, Texas Instruments Info para Designers e Projetistas
Francisco, rodei o código aqui no DevC e funcionou muito bem.

Este método não é baseado naquele "butterfly" que geralmente vemos sendo implementados, correto? Qual o método utilizado? Agora vou rodar no MSP430 e ver como fica o desempenho, o que posso tentar otimizar. Novamente muito obrigado.

Caso tiver alguma literatura, ou trabalho seu que eu possa referenciar caso implementar no projeto, será um prazer.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Em 4 de setembro de 2014 16:15, Francisco Fambrini <ffam...@gmail.com> escreveu:

agaelema .

unread,
Sep 5, 2014, 12:11:50 AM9/5/14
to Raphael Philipe, Texas Instruments Info para Designers e Projetistas
Raphael, obrigado pelo código. Acho que irei tentar implementar diretamente em C porque não me dou bem com o Matlab.

Sua explicação sobre "THD~=sqrt(RMS_sinal^2 - RMS_fundamental^2) / RMS_fundamental;" foi bastante interessante, enquanto testava os outros algoritmos me deparei com isso mas ainda iria pesquisar o porque.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Francisco Fambrini

unread,
Sep 5, 2014, 8:37:07 AM9/5/14
to agaelema, texa...@googlegroups.com
Oi Haroldo,

Eu estou vendo gente sugerir para voce fazer no Octave ou no Matlab... mas nesses programas não precisa inventar nada, já está tudo pronto, tem rotina de FFT pronta. Ou seja, Octave e MATLAB não vai te ajudar a fazer em C para posteriormente embarcar em microconotrlador.

Esta rotina que eu te passei não usa o método butterfly

Ela calcula FFT simplesmente baseado na Fórmula de Euler para exponenciais complexas:


E faz uma varredura no sinal por "força bruta" em toda a largura de banda da janela de amostragem






André Prado

unread,
Sep 5, 2014, 8:57:10 AM9/5/14
to Francisco Fambrini, agaelema, Texas Instruments Info para Designers e Projetistas
Olá Francisco, a ideia de utilizar o matlab é desenvolver o seu próprio algoritmo de FFT e comparar o resultado com a função FFT do matlab.
Considero bem mais fácil e rápido analisar e rodar um algoritmo em matlab do que fazê-lo primeiro em C. Dependendo de como você escrever o matlab o código em C fica uma mera tradução depois.

Abs
Atenciosamente/Regards
André Castelan Prado

Francisco Fambrini

unread,
Sep 5, 2014, 9:07:02 AM9/5/14
to André Prado, texa...@googlegroups.com
Assim está certo.
É que eu pensei que o pessoal estava propondo o uso de funções prontas

No MATLAB pode-se fazer FFT simplesmente assim

 L=length(y);

              NFFT = 2^nextpow2(L); 

              Y = fft(y,NFFT)/L;

              f = Fs/2*linspace(0,1,NFFT/2+1);

              plot(f,2*abs(Y(1:NFFT/2+1)))

              title('Espectro de Amplitude em Frequencia Unilateral de y(t)')

              xlabel('Frequencia (Hz)')

              ylabel('|Y(f)|')

O que não ajuda em nada na hora de escrever no microcontrolador, porque a função   fft ( y, k)   é uma caixa preta e fechada 

Raphael Philipe

unread,
Sep 5, 2014, 12:27:31 PM9/5/14
to Francisco Fambrini, André Prado, Texas Instruments Info para Designers e Projetistas
Ahh sim

Eu tinha sugerido essas ferramentas só para facilitar a validação do Algoritmo.
att,

agaelema .

unread,
Sep 5, 2014, 1:14:26 PM9/5/14
to Raphael Philipe, Francisco Fambrini, André Prado, Texas Instruments Info para Designers e Projetistas
Trabalhando como vocês comentaram usando o Matlab e este Octave (que não conheço) para validar os resultados é bastante interessante pois os resultados destes programas são bastante confiáveis. O meu problema é não saber usar o Matlab e não me dou bem com o help dele. Usei muito pouco em redes neurais e muito do que eu escrevia lembrava um código C.

Mas voltando ao código, testei o código da FFT original como estava e rodou no uC. Levava mais ou menos 14 segundos para execução total do código (gerar a onda, aplicar a fft, calcular os módulos das harmônicas).

Como 12 segundos seria algo inviável, tentei utilizar a lib IQmath e fui aos poucos substituindo as funções e acertando o tipo de IQ para que os resultados coubessem nas variáveis e não perdesse muito em precisão. 

No final, substituindo tudo e diminuindo o calculo das 32 harmônicas para as 9 primeiras, cheguei a uma execução próxima a 500ms. Fiquei impressionado com o ganho de desempenho mantendo uma precisão aceitável.

Vou passar a utilizar mais esta lib, e nos uC da linha MSP430 com multiplicador interno deve rodar mais rápido ainda. Depois vou testar na nova launchpad e ver como fica.

Se for interessante posso postar o código da versão modificada para esta lib.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


Francisco Fambrini

unread,
Sep 5, 2014, 1:23:39 PM9/5/14
to agaelema ., texa...@googlegroups.com
Haroldo,

Voce poderia por gentileza compartilhar a LIB e o código com os colegas desta lista ?

Muito agradecido

agaelema .

unread,
Sep 5, 2014, 3:21:36 PM9/5/14
to Francisco Fambrini, Texas Instruments Info para Designers e Projetistas
Enviando novamente, havia esquecido que o grupo não aceita anexos.

Aqui esta o link da LIB diretamente da TI, essa serve para qualquer linha de MSP430, tendo hardware de multiplicador ou não.


Existe também uma lib para ponto flutuante no MSP430, mas esta funciona somente em algumas linhas específicas, creio que pela existencia do hardware MPY32.


Neste link esta o código da FFT provido pelo Francisco usando a biblioteca padrão "math.h".

Neste link o código modificado para usar a IQlib.

Os projetos usam como base o MSP430G2955 que tem sido a base de meu projeto.

Creio que ainda de para otimizar umas coisas transformando algumas operações em leitura de valores em tabelas ou mesmo usar a Qlib ao invés da IQlib dependendo do range de valor que for utilizar.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru


agaelema .

unread,
Sep 8, 2014, 11:09:51 AM9/8/14
to Raphael Philipe, Texas Instruments Info para Designers e Projetistas
Raphael, testei seu código inicialmente no Matlab para entende-lo e funcionou perfeitamente.

Depois rodei no MSP430 e ficou ótimo, realmente o ganho de desempenho em relação a FFT é bem grande. Infelizmente implementa-lo usando a lib IQmathlib foi um parto tentando não perder precisão e me manter dentro dos limites das variáveis. No final deu certo com uma boa precisão mas o código acabou ficando maior do que eu esperava. Estou tentando melhorar minha implementação para ver se diminuo o tamanho.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru

Em 5 de setembro de 2014 01:11, agaelema . <agae...@gmail.com> escreveu:

Raphael Philipe

unread,
Sep 8, 2014, 1:01:08 PM9/8/14
to agaelema ., Texas Instruments Info para Designers e Projetistas
Fico feliz que tenha dado certo Haroldo.

Qual a frequência com que você precisa calcular o THD?

abraços

agaelema .

unread,
Sep 8, 2014, 3:18:01 PM9/8/14
to Raphael Philipe, Texas Instruments Info para Designers e Projetistas
O ideal seria conseguir realizar o cálculo do thd de tensão e corrente a cada execução do programa. Na estrutura atual o processo completo ocorre cerca de 10 a 12 vezes por segundo (salvar as amostras, processar, etc). Usando Goertzel creio que não haveria queda significativa. Utilizando a FFT para computar as 8 primeiras harmônicas creio que vá cair pela metade, mas posso restringir somente a fundamental que no momento é meu foco.

Haroldo L. M. Amaral
Mestrando em Eng. Elétrica - UNESP Bauru
Laboratório de Sistemas de Potência e Técnicas Inteligentes - LSISPOTI
Tecnólogo em Sistemas Biomédicos - FATEC Bauru
Técnico em Eletrônica - CTI/UNESP Bauru

Reply all
Reply to author
Forward
0 new messages