initial cleanup and mapping
This commit is contained in:
152
examples/Gertboard/vumeter.c
Normal file
152
examples/Gertboard/vumeter.c
Normal file
@ -0,0 +1,152 @@
|
||||
/*
|
||||
* vumeter.c:
|
||||
* Simple VU meter
|
||||
*
|
||||
* Heres the theory:
|
||||
* We will sample at 4000 samples/sec and put the data into a
|
||||
* low-pass filter with a depth of 1000 samples. This will give
|
||||
* us 1/4 a second of lag on the signal, but I think it might
|
||||
* produce a more pleasing output.
|
||||
*
|
||||
* The input of the microphone should be at mid-pont with no
|
||||
* sound input, but we might have to sample that too, to get
|
||||
* our reference zero...
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <gertboard.h>
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE (1==1)
|
||||
#define FALSE (!TRUE)
|
||||
#endif
|
||||
|
||||
#define B_SIZE 1000
|
||||
#define S_SIZE 128
|
||||
|
||||
static int buffer [B_SIZE] ;
|
||||
static int bPtr = 0 ;
|
||||
|
||||
/*
|
||||
* ledPercent:
|
||||
* Output the given value as a percentage on the LEDs
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void ledPercent (int percent)
|
||||
{
|
||||
unsigned int output = 0 ;
|
||||
|
||||
if (percent > 11) output |= 0x01 ;
|
||||
if (percent > 22) output |= 0x02 ;
|
||||
if (percent > 33) output |= 0x04 ;
|
||||
if (percent > 44) output |= 0x08 ;
|
||||
if (percent > 55) output |= 0x10 ;
|
||||
if (percent > 66) output |= 0x20 ;
|
||||
if (percent > 77) output |= 0x40 ;
|
||||
if (percent > 88) output |= 0x80 ;
|
||||
|
||||
digitalWriteByte (output) ;
|
||||
}
|
||||
|
||||
static unsigned int tPeriod, tNextSampleTime ;
|
||||
|
||||
/*
|
||||
* sample:
|
||||
* Get a sample from the Gertboard. If not enough time has elapsed
|
||||
* since the last sample, then wait...
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void sample (void)
|
||||
{
|
||||
unsigned int tFuture ;
|
||||
|
||||
// Calculate the future sample time
|
||||
|
||||
tFuture = tPeriod + tNextSampleTime ;
|
||||
|
||||
// Wait until the next sample time
|
||||
|
||||
while (micros () < tNextSampleTime)
|
||||
;
|
||||
|
||||
buffer [bPtr] = gertboardAnalogRead (0) ;
|
||||
|
||||
tNextSampleTime = tFuture ;
|
||||
}
|
||||
|
||||
|
||||
int main ()
|
||||
{
|
||||
int quietLevel, min, max ;
|
||||
int i, sum ;
|
||||
unsigned int tStart, tEnd ;
|
||||
|
||||
printf ("\n") ;
|
||||
printf ("Gertboard demo: VU Meter\n") ;
|
||||
printf ("========================\n") ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
gertboardSPISetup () ;
|
||||
|
||||
ledPercent (0) ;
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
pinMode (i, OUTPUT) ;
|
||||
|
||||
for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr)
|
||||
buffer [bPtr] = 99 ;
|
||||
|
||||
tPeriod = 1000000 / 1000 ;
|
||||
|
||||
printf ("Shhhh.... ") ; fflush (stdout) ;
|
||||
delay (1000) ;
|
||||
printf ("Sampling quiet... ") ; fflush (stdout) ;
|
||||
|
||||
tStart = micros () ;
|
||||
|
||||
tNextSampleTime = micros () ;
|
||||
for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr)
|
||||
sample () ;
|
||||
|
||||
tEnd = micros () ;
|
||||
|
||||
quietLevel = 0 ;
|
||||
max = 0 ;
|
||||
min = 1024 ;
|
||||
for (i = 0 ; i < B_SIZE ; ++i)
|
||||
{
|
||||
quietLevel += buffer [i] ;
|
||||
if (buffer [i] > max) max = buffer [i] ;
|
||||
if (buffer [i] < min) min = buffer [i] ;
|
||||
}
|
||||
quietLevel /= B_SIZE ;
|
||||
|
||||
printf ("Done. Quiet level is: %d [%d:%d] [%d:%d]\n", quietLevel, min, max, quietLevel - min, max - quietLevel) ;
|
||||
|
||||
printf ("Time taken for %d reads: %duS\n", B_SIZE, tEnd - tStart) ;
|
||||
|
||||
for (bPtr = 0 ;;)
|
||||
{
|
||||
sample () ;
|
||||
sum = 0 ;
|
||||
for (i = 0 ; i < S_SIZE ; ++i)
|
||||
sum += buffer [i] ;
|
||||
sum /= S_SIZE ;
|
||||
sum = abs (quietLevel - sum) ;
|
||||
sum = (sum * 1000) / quietLevel ;
|
||||
ledPercent (sum) ;
|
||||
if (++bPtr > S_SIZE)
|
||||
bPtr = 0 ;
|
||||
}
|
||||
|
||||
|
||||
return 0 ;
|
||||
}
|
Reference in New Issue
Block a user