Autor Tema: Tutorial para calcular valores RMS  (Leído 24901 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Tutorial para calcular valores RMS
« en: 15 de Diciembre de 2008, 16:08:11 »
Hola

Estoy investigando aquí en el foro cómo se calcula el valor RMS de una onda no periódica muestreada digitalmente. Encontré unos cuantos temas en los que se menciona que es muy difícil de hacer y que es necesario hacer integración.

Quisiera saber si alguien tiene un tutorial para realizar este cálculo.

Gracias.

 :mrgreen:

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Tutorial para calcular valores RMS
« Respuesta #1 en: 15 de Diciembre de 2008, 16:34:33 »
Desde la perspectiva discreta no es neceaario aplicar calculos integrales,simplemente habría que busca la manera de sustituir la integral de la fórmula de la imagen por el valor numérico del área bajo la curva representada por los valores digitales (cada uno multiplicado por sí mismo) comprendidos en un periodo de la señal. Ahora mismo no se me ocurre una forma directa de usar dichos valores para hacer el cálculo numérico de dicha integral, pero sí te digo que hay mil maneras de hacerlo. Una vez tengas hecho ese cálculo, el resto es sencillo


Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Tutorial para calcular valores RMS
« Respuesta #2 en: 15 de Diciembre de 2008, 16:40:09 »
ahm que dijiste onda no periódica....
Pues...imagino que deberás tomar un intervalo si es que quieres obtener un valor eficaz (dicho intervalo vendría a ser el período en ondas periódicas)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #3 en: 15 de Diciembre de 2008, 16:42:38 »
El calcular la integral con muestras discretas va a ser fácil, necesito buscar mis apuntes de métodos numéricos en los que se usaban los métodos del trapecio y simpson para calcularla.

Si tengo 10 muestras, una cada segundo, entonces calculo el área bajo la curva que generan esas 10 muestras y la sustituyo en la ecuación, luego divido entre 10s y saco raíz cuadrada, ¿es así?

En cuanto tenga los datos te aviso cómo resultó el asunto  :D

Gracias por la ecuación Modu  :mrgreen:

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Tutorial para calcular valores RMS
« Respuesta #4 en: 15 de Diciembre de 2008, 16:48:07 »
Si tengo 10 muestras, una cada segundo, entonces calculo el área bajo la curva que generan esas 10 muestras y la sustituyo en la ecuación, luego divido entre 10s y saco raíz cuadrada, ¿es así?

Efectivamente, pero lo primero que debes hacer es multiplicar cada muestra por sí misma y sobreescribir su valor

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #5 en: 15 de Diciembre de 2008, 16:57:20 »
Cierto, ya que si no lo hiciera, entonces tendría áreas bajo la curva positivas y negativas y para el caso de ondas senoidales, las áreas se cancelarían.

¿De casualidad tienes una referencia de dónde sacaste la ecuación?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Tutorial para calcular valores RMS
« Respuesta #6 en: 15 de Diciembre de 2008, 17:11:19 »

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Tutorial para calcular valores RMS
« Respuesta #7 en: 15 de Diciembre de 2008, 21:18:34 »
Mira este hilo donde tengo un aporte para un voltímetro de verdadero valor eficaz:

http://www.todopic.com.ar/foros/index.php?topic=11720.msg113837#msg113837

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #8 en: 16 de Diciembre de 2008, 16:32:54 »
Ya lo descargué JFH900, gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #9 en: 17 de Diciembre de 2008, 19:54:54 »
Bueno, ya creé mi subfunción para calcular el valor rms de cualquier arreglo de números flotantes. La integral la hice con el método de los trapecios múltiples.

Su prototipo es:

float ValorRMS(float *arreglo, int samples);

Se le entrega un apuntador al arreglo de flotantes y en samples el número de elementos del arreglo y listo, entrega el valor en flotante a la salida.  :mrgreen:

La subfunción se declara así:

Código: [Seleccionar]
//Subfunción Calcula Valor RMS de un arreglo flotante de n muestras
float ValorRMS(float *arreglo, int samples)
{
int i;
float suma=0;

for(i=0;i<samples;i++)
arreglo[i]*=arreglo[i];

for(i=1;i<samples-1;i++)
suma+=arreglo[i];

suma+=(arreglo[0]+arreglo[samples-1])/2.0;

return sqrt(suma/samples);
}

Si alguien la llega a implementar en un PIC16, no olvidar que int samples deberá ser capaz de apuntar a todas las muestras de arreglo.

Ah y los valores en arreglo son modificados (elevados al cuadrado). Si es necesario dejarlos intactos entonces hay que clonar el arreglo con un realloc o algo por el estilo.

La probé con una onda senoidal a 60Hz y Vpico de 180V. El programa de prueba es éste:

Código: [Seleccionar]
//Programa para calcular el valor RMS de una señal discreta

#include "stdafx.h"
#include "math.h"
#include "malloc.h"
#include "conio.h"

//Constantes
#define dospi 6.283185

//Variables
float vpico=180.0;
int muestras=22050; //muestras totales del arreglo
float frec=60.0;
int fsample=22050;
float *seno;
int i,j;
float vrms;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
//Subfunción Calcula Valor RMS de un arreglo flotante de n muestras
float ValorRMS(float *arreglo, int samples)
{
int i;
float suma=0;

for(i=0;i<samples;i++)
arreglo[i]*=arreglo[i];

for(i=1;i<samples-1;i++)
suma+=arreglo[i];

suma+=(arreglo[0]+arreglo[samples-1])/2.0;

return sqrt(suma/samples);
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////
//Función principal
int main(int argc, char* argv[])
{
printf("Programa para calcular el valor RMS de una señal discreta");
printf("\nVoltaje pico = %f",vpico);

printf("\nGenerando onda senoidal %fHz @ %dsps",frec,fsample);

//Genera el arreglo senoidal
seno=(float *)malloc(sizeof(float)*muestras);
for(i=0;i<muestras;i++)
seno[i]=vpico*sin((float)dospi*frec*i/fsample);

//Sobre el arreglo senoidal se calcula el valor rms usando el método del trapecio múltiple
vrms=ValorRMS(seno,muestras);
printf("\nValor RMS %f",vrms);

printf("\nPresione enter");
getch();

return 0;
}
« Última modificación: 17 de Diciembre de 2008, 20:01:10 por migsantiago »

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Tutorial para calcular valores RMS
« Respuesta #10 en: 17 de Diciembre de 2008, 21:56:12 »
¿Qué cotas de error estás manejando?

¿La aplicación vale para trabajar sobre archivos de audio o simplemente lo implementaste para un arreglo sencillo basado en array?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #11 en: 18 de Diciembre de 2008, 18:50:29 »
¿Cotas de error? mmhh no sé  :D

El método del trapecio tiene errores pero dependen de la distancia entre muestras y del área bajo la curva que no se llega a calcular. También puedo implementar el método de Simpson que es más preciso, pero es más pesado para el microcontrolador.

La subfunción ValorRMS sirve para cualquier arreglo de números flotantes con n muestras en ese arreglo, puede ser cualquier unidad lineal de ingeniería (Volts, Pascales, aceleración, etc.).

La aplicación que escribí sólo fue para poner a prueba la función. Sería interesante generar una señal aleatoria y calcularle el valor RMS con mi subfunción y con un método de Matlab para ver si realmente entregan algo similar.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Tutorial para calcular valores RMS
« Respuesta #12 en: 19 de Diciembre de 2008, 11:03:41 »
El valor de las cotas de error evidentemente depende del método que uses para el cálculo de la integral, de los datos con los que lo apliques, etc...
Sólo lo menciono como sugerencia para afinar tu aplicación, o al menos, tener controlado el error que cometes en las mediciones.
De seguro que matlab cuenta con alguna función de uso sencillo para hacer cálculos de valores rms

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #13 en: 20 de Diciembre de 2009, 15:26:21 »
Una pequeña corrección a la función RMS, al final se debe dividir la suma entre el número de trapecios del cálculo. El número de trapecios es igual al número de muestras menos uno.

Código: [Seleccionar]
//Subfunción Calcula Valor RMS de un arreglo flotante de n muestras
float ValorRMS(float *arreglo, int samples)
{
int i;
float suma=0;

for(i=0;i<samples;i++)
arreglo[i]*=arreglo[i];

for(i=1;i<samples-1;i++)
suma+=arreglo[i];

suma+=(arreglo[0]+arreglo[samples-1])/2.0;

return sqrt(suma/(samples-1)); //Corregido :D
}

Se asume el que número de muestras es la unidad t y es adimensional, no se maneja en segundos. El valor de t0 = 0. El valor de T = samples-1.

Desconectado jorgeaf_59

  • PIC10
  • *
  • Mensajes: 26
Re: Tutorial para calcular valores RMS
« Respuesta #14 en: 21 de Diciembre de 2009, 21:01:47 »
Hola migsantiago;

Permitime dos observaciones/preguntas:
1- Creo que se pueden reemplazar los 2 ciclos for por uno solo
Código: C
  1.      for(i = 0; i < samples; i++)
  2.                suma = suma + arreglo[i] * arreglo[i];
  3.  

2- La expresión suma+=(arreglo[0]+arreglo[samples-1])/2.0;
no sería necesaria (aparte no tengo claro porque hay que dividir por 2).

Mis comentarios están motivados en las ganas de aprender y no de criticar: un mal alumno NO puede hacerle objeciones a un gran maestro como vos.

Saludos,

Jorge
« Última modificación: 21 de Diciembre de 2009, 21:06:45 por jorgeaf_59 »