TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 13 de Octubre de 2009, 08:34:38

Título: Analizador de espectro de audio.
Publicado por: micro_pepe en 13 de Octubre de 2009, 08:34:38
He encontrado en esta pagina: http://www.circuitcellar.com/microchip2007/winners/DE/MT1750.html un analizador de espectro de audio, me gustaria entender como funcionan las funciones del C30 para la FFT, y este creo que es un buen ejemplo.

Hace poco que estoy con el C30, y la primera duda con el codigo son estas definiciones:

Código: [Seleccionar]
fractcomplex inputSignal[NUMSAMP]                                     /* The inputSignal is defined */
__attribute__ ((section (".ydata, data, ymemory"),                         /* as a complex array containing samples */
aligned (NUMSAMP * 2 *2 )));                                            /* of the real input signal. */
                                         
fractcomplex twiddleFactors[NUMSAMP/2]                                       /* Declare Twiddle Factor coefficients array in X-space*/
__attribute__ ((section (".xbss, bss, xmemory"),aligned (NUMSAMP*2)));         /* Twiddle Factors are needed for the FFT computation  */ 

// Contains a normalized to 0.5  Hamming window
fractional HammingFactors[NUMSAMP*2] __attribute__ ((section (".xbss, bss, xmemory"), aligned (NUMSAMP*2)));

// Contains the discrete spectral-Power of the input signal
fractional Power_Vector[NUMSAMP] __attribute__ ((section (".xbss, bss, xmemory"), aligned (NUMSAMP)));

volatile fractcomplex * p_inputSignal = &inputSignal[0] ;   // Points to the inputSignal

Un saludo.
Título: Re: Analizador de espectro de audio.
Publicado por: micro_pepe en 13 de Octubre de 2009, 13:08:53
Vamos a empezar por esto:

Código: [Seleccionar]
fractcomplex inputSignal[NUMSAMP]                                     /* The inputSignal is defined */
__attribute__ ((section (".ydata, data, ymemory"),                         /* as a complex array containing samples */
aligned (NUMSAMP * 2 *2 )));                                            /* of the real input signal. */

Me imagino que fractcomplex es un tipo de dato definido, inputSignal es una variable, pero el resto no entiendo para que sirve. En el manual del C30 viene algo, pero no me aclaro.

Un saludo.
Título: Re: Analizador de espectro de audio.
Publicado por: micro_pepe en 14 de Octubre de 2009, 06:54:50
Bueno, con un traductor he avanzado un poco mas, __attribute__ da atributos a una variable.

aligned reserva memoria, pero si inputsignal es un vector, al poner (NUMSAMP * 2 *2 ) ¿Que reserva, un vector de tamaño NUMSAMP * 2 *2 ?

Lo que sigo sin entender es para que sirve section (".ydata, data, ymemory")

Saludos.
Título: Re: Analizador de espectro de audio.
Publicado por: fuente en 15 de Octubre de 2009, 17:12:27
Hace tiempo estuve pensando en simplifacarlo un poco y convertirlo a un analizador de 10 canales únicamente.
Llegué a hacer que compilara, para lo que tuve que cambiar un par de lineas, ya que la versión de C30 que tenía era algo más nueva que la que utilizó el autor. Ahí quedó la cosa por falta de tiempo.

Lo que cambié fue:

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////////
/*                     Variables-definitions                                 */
///////////////////////////////////////////////////////////////////////////////
fractcomplex inputSignal[NUMSAMP] /* The inputSignal is defined */
__attribute__ ((space(ymemory),far,aligned(NUMSAMP * 2 *2))); /* as a complex array containing samples */
//aligned (NUMSAMP * 2 *2 )));              /* of the real input signal. */

fractcomplex twiddleFactors[NUMSAMP/2]                  /* Declare Twiddle Factor coefficients array in X-space*/
__attribute__ ((space(xmemory),far,aligned(NUMSAMP * 2)));      /* Twiddle Factors are needed for the FFT computation  */ 

Como ves cambia precisamete lo que estás preguntando. No llegué a saber por qué, pero así hice que por lo menos compilara.
Me alegro que hayas empezado con el tema, a ver si qasí me animo a retomarlo yo tambien.
Título: Re: Analizador de espectro de audio.
Publicado por: micro_pepe en 15 de Octubre de 2009, 17:37:59
Es cierto que no compila, pero yo pense que era porque la funcion SquareMagnitudeCplx no esta definida en ningun lado, y en el Languaje Tools no aparece tampoco.

Probare con esos cambios.

Un saludo.
Título: Re: Analizador de espectro de audio.
Publicado por: RICHI777 en 15 de Octubre de 2009, 19:51:11
Perdon que me meta, no uso MicroChip, pero basicamente las palabras reservadas __attribute__, align,yspace son palabras reservadas del compilador, attribute como bien dijieron permite modificar aspectos de una variable, align no reserva memoria sino lo que hace es definir un comienzo de la misma, se usa mucho en arquitecturas donde el direccionamiento es mas eficiente cuando las address son pares ( ejemplo los 68XXX ) e yspace me parece que se refiere a algun banco de los DSPIC, seguramente por performance. Pego un link donde hablan mas de esto:

http://www.reproductormp3.net/bricoreproductormp3/contruye-tu-propio-reproductor-de-mp3-hilo-para-postear/5/?wap2

Saludos !
Título: Re: Analizador de espectro de audio.
Publicado por: micro_pepe en 16 de Octubre de 2009, 07:56:56
Pues seguramente sea asi RICHI777. Por lo que veo se trata de hacer que los datos pasen por buses de datos distintos para hacer operaciones mas rapido.

Un saludo.
Título: Re: Analizador de espectro de audio.
Publicado por: micro_pepe en 19 de Octubre de 2009, 10:55:10
Pues resulta que le mande un correo al autor del proyecto, y me ha contestado diciendo que haga los siguientes cambios:

Código: [Seleccionar]
This error message is due to the compiler version you use. Probably, you are using the most recent version of the compiler (student version)
which uses a slightly different format for the "attribute" parameters than my version. You can solve the problem by removing the ".ydata"
keyword from the definition of the  fractcomplex inputSignal[NUMSAMP] variable in ADC.c and Audio Spectrum.c files.

Código: [Seleccionar]
You can also include the auto_psv statement in the _ADCInterrupt()  definition as follows (in order to avoid the warning message):        
void __attribute__((__interrupt__,auto_psv )) _ADCInterrupt(void)

Y este cambio lo hice yo, en el ADC.c:
Código: [Seleccionar]
volatile extern unsigned int SamplesReadyFlag;

Sigue sin compilar, pero si se elimina de la cabecera el #include "ADC.c" del programa principal, si compila. Entonces seria cuestion de diseñar la funcion que captura los datos, o tratar de resolver los errores.

Estos son los errores que aparecen:

Código: [Seleccionar]
Executing: "D:\Archivos de programa\microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F6012A "ADC.o" "Audio Spectrum.o" -o"AudioSpectrum.cof" -Wl,-L"C:\Program Files\Microchip\MPLAB C30\lib",--script="linkerscript.gld",--defsym=__MPLAB_BUILD=1,-Map="AudioSpectrum.map",--report-mem
Audio Spectrum.o(.text+0x0): In function `ADC_Init':
E:\juanjo\Code #MT1750\Audio Spectrum.c:45: multiple definition of `ADC_Init'
ADC.o(.text+0x0):E:\juanjo\Code #MT1750\ADC.c:45: first defined here
Audio Spectrum.o(.text+0x68): In function `_ADCInterrupt':
E:\juanjo\Code #MT1750\Audio Spectrum.c:118: multiple definition of `_ADCInterrupt'
ADC.o(.text+0x68):E:\juanjo\Code #MT1750\ADC.c:118: first defined here
Audio Spectrum.o(.nbss+0xa8):E:\juanjo\Code #MT1750\Audio Spectrum.c: multiple definition of `adcPtr'
ADC.o(.nbss+0x0):E:\juanjo\Code #MT1750\ADC.c: first defined here
d:\archivos de programa\microchip\mplab c30\bin\bin\pic30-coff-ld.exe: Link terminated due to previous error(s).
Link step failed.

Saludos.
Título: Re: Analizador de espectro de audio.
Publicado por: micro_pepe en 21 de Octubre de 2009, 18:46:08
Aqui os dejo el proyecto compilado, a parte de los cambios que comente he nombrado el ADC.c como .h

Si alguien se atreve a montarlo que cuente los resultados, mi idea es aprender sore la FFT, y darle alguna otra aplicacion.

Un saludo.