You are on page 1of 18

UNIVERSIDAD PRIVADA ANTENOR ORREGO

FACULTAD DE INGENIERA
ESCUELA PROFESIONAL DE INGENIERA
ELECTRNICA

ANALIZADOR DE ESPECTROS
Docente:
Integrantes:

Trujillo 2015

Cdigo programado en lenguaje C

#include <xc.h>
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
#include "fft.h"

#define _XTAL_FREQ 48000000


#pragma config PLLDIV = 5
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 1
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config BORV = 3
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config CCP2MX = ON
#pragma config PBADEN = ON
#pragma config LPT1OSC = OFF
#pragma config MCLRE = ON
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF

#pragma config CP3 = OFF


#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTC = OFF
#pragma config WRTB = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
short imaginaryNumbers[64];
short realNumbers[64];
char q;
void main(void)
{

ADCON1 = 0b00001110;

ADCON2 = 0b10110110;

TRISA = 0b00000001;
TRISB = 0b00000000;
TRISC = 0b00000000;
TRISD = 0b00000000;

PORTA = 0b00001110;
PORTB = 0b11111111;
PORTC = 0b11111111;
PORTD = 0b11111111;
PORTE = 0b00000000;
while(1)
{
short i = 0;
unsigned short result;
for (i = 0; i < 64; i++)
{
ADCON0 = 0b00000011;
while(GODONE);
realNumbers[i] = ((short)(ADRESH << 8) +
(short)ADRESL) - 512;
imaginaryNumbers[i] = 0;
__delay_us(7);
}

fix_fft(realNumbers, imaginaryNumbers, 6);


long place, root;
for (int k=0; k < 32; k++)
{
realNumbers[k] = (realNumbers[k] * realNumbers[k] +

imaginaryNumbers[k] * imaginaryNumbers[k]);

place = 0x40000000;
root = 0;
if (realNumbers[k] >= 0)
{
while (place > realNumbers[k]) place = place >> 2;
while (place)
{
if (realNumbers[k] >= root + place)
{
realNumbers[k] -= root + place;
root += place * 2;
}
root = root >> 1;
place = place >> 2;
}
}
realNumbers[k] = root;
}
short maximo=0;
PORTAbits.RA5 = 1;
PORTAbits.RA4 = 0;
if(PORTEbits.RE0 == 1 && PORTEbits.RE1 == 0 && PORTEbits.RE2
==0)
{
PORTD = 0b11111111;

PORTC = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
for (int i=1 ;i<32; i++)
{
PORTAbits.RA4 = 1;
if (realNumbers[i] >= 170)
PORTB = 0b00000000;
else if(realNumbers[i] >= 156)
PORTB = 0b10000000;
else if(realNumbers[i] >= 133)
PORTB = 0b11000000;
else if(realNumbers[i] >= 113)
PORTB = 0b11100000;
else if(realNumbers[i] >= 90)
PORTB = 0b11110000;
else if(realNumbers[i] >= 68)
PORTB = 0b11111000;
else if(realNumbers[i] >= 40)
PORTB = 0b11111100;
else if(realNumbers[i] >= 10)
PORTB = 0b11111110;
else
PORTB = 0b11111111;

__delay_us(500);
PORTAbits.RA5=0;
PORTAbits.RA4=0;

}
}
else if(PORTEbits.RE0 == 0 && PORTEbits.RE1 == 1 &&
PORTEbits.RE2 == 0)
{
PORTB = 0b11111111;
PORTC = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
for (int i=1 ;i<32; i++)
{
PORTAbits.RA4 = 1;
if (realNumbers[i] >= 170)
PORTD = 0b00000000;
else if(realNumbers[i] >= 156)
PORTD = 0b10000000;
else if(realNumbers[i] >= 133)
PORTD = 0b11000000;
else if(realNumbers[i] >= 113)
PORTD = 0b11100000;
else if(realNumbers[i] >= 90)
PORTD = 0b11110000;
else if(realNumbers[i] >= 68)
PORTD = 0b11111000;
else if(realNumbers[i] >= 40)
PORTD = 0b11111100;
else if(realNumbers[i] >= 10)
PORTD = 0b11111110;
else

PORTD = 0b11111111;
__delay_us(500);
PORTAbits.RA5=0;
PORTAbits.RA4=0;
}
}
else if(PORTEbits.RE0 == 0 && PORTEbits.RE1 == 0 &&
PORTEbits.RE2 == 1)
{
for (int i=1 ;i<32; i++)
{
PORTAbits.RA4 = 1;
if (realNumbers[i] >= 170)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 0;
PORTBbits.RB6 = 0;
PORTBbits.RB5 = 0;
PORTBbits.RB4 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 156)

{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 0;
PORTBbits.RB5 = 0;
PORTBbits.RB4 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 133)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 0;
PORTBbits.RB4 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 113)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;

PORTBbits.RB7 = 1;
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 1;
PORTBbits.RB4 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 90)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 1;
PORTBbits.RB4 = 1;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 68)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 1;

PORTBbits.RB4 = 1;
PORTBbits.RB3 = 1;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 40)
{
PORTB = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTDbits.RD7 = 1;
PORTDbits.RD6 = 1;
PORTDbits.RD5 = 1;
PORTDbits.RD4 = 1;
PORTDbits.RD3 = 1;
PORTDbits.RD2 = 1;
PORTDbits.RD1 = 0;
PORTDbits.RD0 = 0;
}
else if(realNumbers[i] >= 10)
{
PORTB = 0b11111111;
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 0;
}
else
{
PORTB = 0b11111111;
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;

PORTAbits.RA3 = 1;
}
__delay_us(500);
PORTAbits.RA5=0;
PORTAbits.RA4=0;
}
}
else {}
}
}

Librera fft.h
#ifndef FFT_C
#define FFT_C
#include <htc.h>
#include "fft.h"

// fix_fft.c - Fixed-point in-place Fast Fourier Transform


// All data are fixed-point short integers, in which -32768
// to +32768 represent -1.0 to +1.0 respectively. Integer
// arithmetic is used for speed, instead of the more natural
// floating-point.
//
// For the forward FFT (time -> freq), fixed scaling is
// performed to prevent arithmetic overflow, and to map a 0dB
// sine/cosine wave (i.e. amplitude = 32767) to two -6dB freq
// coefficients.
//
// Written by: Tom Roberts 11/8/89
// Made portable: Malcolm Slaney 12/15/94 malcolm@interval.com
// Enhanced: Dimitrios P. Bouras 14 Jun 2006 dbouras@ieee.org
// Ported to PIC18F: Simon Inns 20110104
/*
fix_fft() - perform forward fast Fourier transform.
fr[n],fi[n] are real and imaginary arrays, both INPUT AND
RESULT (in-place FFT), with 0 <= n < 2**m
*/
void fix_fft(short fr[], short fi[], short m)
{
long int mr = 0, nn, i, j, l, k, istep, n, shift;
short qr, qi, tr, ti, wr, wi;
n = 1 << m;
nn = n - 1;
/* max FFT size = N_WAVE */
//if (n > N_WAVE) return -1;
/* decimation in time - re-order data */
for (m=1; m<=nn; ++m)
{
l = n;
do
{
l >>= 1;
} while (mr+l > nn);

mr = (mr & (l-1)) + l;


if (mr <= m) continue;
tr = fr[m];
fr[m] = fr[mr];
fr[mr] = tr;
ti = fi[m];
fi[m] = fi[mr];
fi[mr] = ti;
}
l = 1;
k = LOG2_N_WAVE-1;
while (l < n)
{
/*
fixed scaling, for proper normalization -there will be log2(n) passes, so this results
in an overall factor of 1/n, distributed to
maximize arithmetic accuracy.
It may not be obvious, but the shift will be
performed on each data point exactly once,
during this pass.
*/
// Variables for multiplication code
long int c;
short b;
istep = l << 1;
for (m=0; m<l; ++m)
{
j = m << k;
/* 0 <= j < N_WAVE/2 */
wr = Sinewave[j+N_WAVE/4];
wi = -Sinewave[j];
wr >>= 1;

wi >>= 1;
for (i=m; i<n; i+=istep)
{
j = i + l;
// Here I unrolled the multiplications to prevent overhead
// for procedural calls (we don't need to be clever about
// the actual multiplications since the pic has an onboard
// 8x8 multiplier in the ALU):
// tr = FIX_MPY(wr,fr[j]) - FIX_MPY(wi,fi[j]);
c = ((long int)wr * (long int)fr[j]);
c = c >> 14;
b = c & 0x01;
tr = (c >> 1) + b;
c = ((long int)wi * (long int)fi[j]);
c = c >> 14;
b = c & 0x01;
tr = tr - ((c >> 1) + b);
// ti = FIX_MPY(wr,fi[j]) + FIX_MPY(wi,fr[j]);
c = ((long int)wr * (long int)fi[j]);
c = c >> 14;
b = c & 0x01;
ti = (c >> 1) + b;
c = ((long int)wi * (long int)fr[j]);
c = c >> 14;
b = c & 0x01;
ti = ti + ((c >> 1) + b);
qr = fr[i];
qi = fi[i];
qr >>= 1;
qi >>= 1;
fr[j] = qr - tr;
fi[j] = qi - ti;
fr[i] = qr + tr;

fi[i] = qi + ti;
}
}
--k;
l = istep;
}
}
#endif

DIAGRAMA ESQUEMTICO

You might also like