TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: franco en 05 de Octubre de 2006, 21:37:46
-
kiubole kiero acer un proyecto con el dspic 2010 para realizar una FFT a una señal de entrada y me estoi basando en el programa ke viene de ejemplo en MPLAB pero en ese prog viene simulada la entrada y kiero ver komo lleno el arreglo de entradas reales y komo sako la FFT para el resultado de la transfromada en un osciloscopio
este es mi prog: SI AI OTRO PROGRAMA MAS SENCILLO O KOMO SEA PERO KE FUNCIONE LES AGRADECERIA KE ME LO PASARAN
#include <p30f2010.h>
#include <stdio.h>
#include <dsp.h>
#include "fft1.h"
#define ENTRADA PORTBbits.RB0 /****** aki es donde kiero ke este la señal de entrada*/
#define SALIDA PORTEbits.RE0
_FOSC(CSW_FSCM_OFF & XT);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & MCLR_DIS);
_FGS(CODE_PROT_OFF);
fractcomplex ENTRADAS[MUESTRAS]__attribute__ ((section (".ydata, data, ymemory"),aligned (MUESTRAS * 2 *2)));
#ifndef TABLA_DE_COEFICIENTES
fractcomplex COEFICIENTES[MUESTRAS/2] __attribute__ ((section (".xbss, bss, xmemory"), aligned (MUESTRAS*2)));
#else
extern const fractcomplex COEFICIENTES[MUESTRAS/2]__attribute__ ((space(auto_psv), aligned (MUESTRAS*2)));
#endif
int peakFrequencyBin = 0;
unsigned long peakFrequency = 0;
int main(void)
{
int i = 0;
fractional *p_real = &ENTRADAS[0].real ;
fractcomplex *p_cmpx = &ENTRADAS[0] ;
TRISB=0XFFFF; /****no se si esten bien estas abilitaciones
TRISE=0X0000;
ADPCFG=0xFFFF;
#ifndef TABLA_DE_COEFICIENTES
TwidFactorInit (LOG2_MUESTRAS, &COEFICIENTES[0], 0);
#endif
for ( i = 0; i < MUESTRAS; i++ )
{
*p_real = ENTRADA >>1 ;
*p_real++;
}
p_real = &ENTRADAS[(MUESTRAS/2)-1].real ;
p_cmpx = &ENTRADAS[MUESTRAS-1];
for ( i = MUESTRAS; i > 0; i-- )
{
(*p_cmpx).real = (*p_real--);
(*p_cmpx--).imag = 0x0000;
}
#ifndef TABLA_DE_COEFICIENTES
FFTComplexIP (LOG2_MUESTRAS, &ENTRADAS[0], &COEFICIENTES[0], COEFFS_IN_DATA);
#else
FFTComplexIP (LOG2_MUESTRAS, &ENTRADAS[0], (fractcomplex *) __builtin_psvoffset(&COEFICIENTES[0]), (int) __builtin_psvpage(&COEFICIENTES[0]));
#endif
BitReverseComplex (LOG2_MUESTRAS, &ENTRADAS[0]);
SquareMagnitudeCplx(MUESTRAS, &ENTRADAS[0], &ENTRADAS[0].real);
VectorMax(MUESTRAS/2, &ENTRADAS[0].real, &peakFrequencyBin);
peakFrequency = peakFrequencyBin*(SAMPLING_RATE/MUESTRAS);
*p_real = &ENTRADAS[0].real ;
*p_cmpx = &ENTRADAS[0] ;
for ( i = 0; i < MUESTRAS; i++ ) /* SEGUN IO AKI SAKO EL RESULTADO DE LA ffT */
{
SALIDA = *p_real >>1 ;
*p_real++;
}
for
while(1);
}
-
Hola franco, podrías poner cual es el problema que tienes con la compilación del programa?.
Uno de los detalles que debes de tomar en cuenta es que el dsPIC30F2010 tiene tan solo 512 bytes de memoria, por lo tanto, solo podría realizar una FFT para 64 muestras a lo más. El programa original esta hecho para hacer un calculo de 256 muestras pensado para ser ejecutado en el dsPIC30F6014, el cual contiene 4Kbytes de memoria. El numero de muestras, las cambias en el archivo fft.h incluido en el proyecto.
Por otra parte en el código:
for ( i = 0; i < MUESTRAS; i++ ) /* SEGUN IO AKI SAKO EL RESULTADO DE LA ffT */
{
SALIDA = *p_real >>1 ; //.... en esta linea equivale a dividir el numero apuntado por *p_real entre 2.
//... el ejemplo lo incluye porque la biblioteca de la FFTcomplexIP recomienda que los
//... de entrada esten dentro del rango [-0.5:0.5].
*p_real++;
}
Cambia la linea 3, por
SALIDA = *p_real << 1 ; //... aqui multiplicas el resultado por 2
-
ok gracias por tu ayuda
vamos a probarlo y checar los resultados