Hola:
Estoy aprendiendo a realizar la fft usando un dspic 30f3011, estoy partiendo del ejemplo que provee microchip, donde la señal que se utiliza ya fue muestreada y los valores simplemente son cargdos en el pic, lo que estoy tratando de hacer modificar el mismo ejemplo para muestrear una señal de ADC, sin embargo al compilar el C30 me marca el siguiente erro:
fft.c: In function `ReadAdc':
fft.c:27: error: incompatible types in return
El ADC ya lo he configurado para que lea los valores en formato fraccional pero al momento de querer cargarlos en el arreglo de muestras me da este error pero no sè a que se deba, acon tinuaciòn les agrego el codigo con las peuqeñas modificaciones que he realizado en el momento:
#include <p30F3011.h>
#include <dsp.h>
#include "fft.h"
/* Device configuration register macros for building the hex file */
_FOSC(CSW_FSCM_OFF & XT_PLL8); /* XT with 8xPLL oscillator, Failsafe clock off */
_FWDT(WDT_OFF); /* Watchdog timer disabled */
_FBORPOR(PBOR_OFF & MCLR_EN); /* Brown-out reset disabled, MCLR reset enabled */
_FGS(CODE_PROT_OFF); /* Code protect disabled */
Esta funcione s para iniciarl el ADC:
void InitAdc() {
ADPCFG = 0x1FEF;
TRISBbits.TRISB4 = 1;
ADCHS = 4; //
ADCSSL = 0; //
ADCON3 = 0x1F3F; //
ADCON2 = 0; //
ADCON1 = 0x83E0; // ADC ON, fractional result
}
ESTA SIGUIENTE FUNCION ES DONDE TENGO EL PROBLEA ES LA FUNCION QUE SE UTILIZA PARA CARGAR EL VALOR DE ADC, SIN EMBARGO ME DA EL ERROR QUE LES MOSTRÉ AL INICIO DLE PROGRAMA, PERO EN REALIDAD NO SE A QUE SE DEBA.
fractcomplex ReadAdc() {
ADCON1bits.SAMP = 1; // Start AD conversion
while (ADCON1bits.DONE == 0) // Wait for ADC to finish
asm ("nop");
return ADCBUF0; // Get ADC value
}
EN ESTA SIGUIENTE PARTE SE DEFIENE EL ARREGLO DONDE TRATO DE ALMACENAR LAS LECTURAS DEL ADC, AQUI ES DONDE NO ESTOY PUDIENDO CARGAR LOS VALORES:
fractcomplex sigCmpx[FFT_BLOCK_LENGTH] /* Typically, the input signal to an FFT */
__attribute__ ((section (".ydata, data, ymemory"), /* routine is a complex array containing samples */
aligned (FFT_BLOCK_LENGTH * 2 *2))); /* of an input signal. For this example, */
/* we will provide the input signal in an */
/* array declared in Y-data space. */
/* Global Definitions */
#ifndef FFTTWIDCOEFFS_IN_PROGMEM
fractcomplex twiddleFactors[FFT_BLOCK_LENGTH/2] /* Declare Twiddle Factor array in X-space*/
__attribute__ ((section (".xbss, bss, xmemory"), aligned (FFT_BLOCK_LENGTH*2)));
#else
extern const fractcomplex twiddleFactors[FFT_BLOCK_LENGTH/2] /* Twiddle Factor array in Program memory */
__attribute__ ((space(auto_psv), aligned (FFT_BLOCK_LENGTH*2)));
#endif
int peakFrequencyBin = 0; /* Declare post-FFT variables to compute the */
unsigned long peakFrequency = 0; /* frequency of the largest spectral component */
void SampleInput() {
int i = 0;
while (i <= 255) {
sigCmpx = ReadAdc(); // Re
i++;
// sigCmpx[i++] = 0; // Im
}
// "Samples" now contains 128 pairs of <Re, Im> samples
}//~
int main(void)
{
InitAdc();
SampleInput();
int i = 0;
fractional *p_real = &sigCmpx[0].real ;
fractcomplex *p_cmpx = &sigCmpx[0] ;
#ifndef FFTTWIDCOEFFS_IN_PROGMEM /* Generate TwiddleFactor Coefficients */
TwidFactorInit (LOG2_BLOCK_LENGTH, &twiddleFactors[0], 0); /* We need to do this only once at start-up */
#endif
for ( i = 0; i < FFT_BLOCK_LENGTH; i++ )/* The FFT function requires input data */
{ /* to be in the fractional fixed-point range [-0.5, +0.5]*/
*p_real = *p_real >>1 ; /* So, we shift all data samples by 1 bit to the right. */
*p_real++; /* Should you desire to optimize this process, perform */
} /* data scaling when first obtaining the time samples */
/* Or within the BitReverseComplex function source code */
p_real = &sigCmpx[(FFT_BLOCK_LENGTH/2)-1].real ; /* Set up pointers to convert real array */
p_cmpx = &sigCmpx[FFT_BLOCK_LENGTH-1] ; /* to a complex array. The input array initially has all */
/* the real input samples followed by a series of zeros */
for ( i = FFT_BLOCK_LENGTH; i > 0; i-- ) /* Convert the Real input sample array */
{ /* to a Complex input sample array */
(*p_cmpx).real = (*p_real--); /* We will simpy zero out the imaginary */
(*p_cmpx--).imag = 0x0000; /* part of each data sample */
}
/* Perform FFT operation */
#ifndef FFTTWIDCOEFFS_IN_PROGMEM
FFTComplexIP (LOG2_BLOCK_LENGTH, &sigCmpx[0], &twiddleFactors[0], COEFFS_IN_DATA);
#else
FFTComplexIP (LOG2_BLOCK_LENGTH, &sigCmpx[0], (fractcomplex *) __builtin_psvoffset(&twiddleFactors[0]), (int) __builtin_psvpage(&twiddleFactors[0]));
#endif
/* Store output samples in bit-reversed order of their addresses */
BitReverseComplex (LOG2_BLOCK_LENGTH, &sigCmpx[0]);
/* Compute the square magnitude of the complex FFT output array so we have a Real output vetor */
SquareMagnitudeCplx(FFT_BLOCK_LENGTH, &sigCmpx[0], &sigCmpx[0].real);
/* Find the frequency Bin ( = index into the SigCmpx[] array) that has the largest energy*/
/* i.e., the largest spectral component */
VectorMax(FFT_BLOCK_LENGTH/2, &sigCmpx[0].real, &peakFrequencyBin);
/* Compute the frequency (in Hz) of the largest spectral component */
peakFrequency = peakFrequencyBin*(SAMPLING_RATE/FFT_BLOCK_LENGTH);
while (1); /* Place a breakpoint here and observe the watch window variables */
}
mUCHAS GRACIAS POR SU TIEMPO