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í?
//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);
}
//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;
}
//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
}
Area = (h / 2) (v[0] + 2 ∑ v[i] + x[n])//Autor: MigSantiago
//Enero 2010
/*
Orden de la barra de 10 leds
1 - a0
2 - a1
3 - b0
4 - b1
5 - b2
6 - b3
7 - a2
8 - a3
9 - b4
10 - a4
*/
#define L10 pin_a0
#define L20 pin_a1
#define L30 pin_b0
#define L40 pin_b1
#define L50 pin_b2
#define L60 pin_b3
#define L70 pin_a2
#define L80 pin_a3
#define L90 pin_b4
#define L100 pin_a4
float ValorRMS(float* var, int16 muestras);
////////////////////////////////////////////////////////////////////////////////
#define MUESTRASRMS 48 //muestras para valor rms
#define TMUESTREO 200 //us
//Rango de comparación
//const float MAX=362.0; //máximo puede ser 512 por raíz de 2 (RMS)
const float MAX=250.0;
float c[10];
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//Función para reordenar los 10 bits de un int10 en la barra de leds por ciento
void ordena_vumetro(float v)
{
int8 i=0;
if(v>=c[i++]) output_high(L10); else output_low(L10);
if(v>=c[i++]) output_high(L20); else output_low(L20);
if(v>=c[i++]) output_high(L30); else output_low(L30);
if(v>=c[i++]) output_high(L40); else output_low(L40);
if(v>=c[i++]) output_high(L50); else output_low(L50);
if(v>=c[i++]) output_high(L60); else output_low(L60);
if(v>=c[i++]) output_high(L70); else output_low(L70);
if(v>=c[i++]) output_high(L80); else output_low(L80);
if(v>=c[i++]) output_high(L90); else output_low(L90);
if(v>=c[i++]) output_high(L100); else output_low(L100);
}
////////////////////////////////////////////////////////////////////////////////
...
void main(void)
{
float binario[MUESTRASRMS];
...
//Calcula los límites de cada led
for(i=3; i<14;++i) //empiezo en 3 para eliminar ruido de fondo
c[i-3]=(MAX*(float)i)/10;
while(1)
{
for(i=0; i<MUESTRASRMS; ++i)
{
binario[i]=(float)read_adc()-512.0;
delay_us(TMUESTREO);
}
ordena_vumetro(ValorRMS(binario, MUESTRASRMS));
}
}