TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: mateamargo en 28 de Septiembre de 2007, 16:49:41

Título: conversion float_to_fix
Publicado por: mateamargo en 28 de Septiembre de 2007, 16:49:41
hola todos. Estoy expeimentando con FFT, y necesito generar una tabla de "Twiddle Factors" de 1024 puntos, ya que la mas grande en C30 y MikroC es de 512. Tengo el siguiente codigo para generar los valores:



Código: [Seleccionar]
float real, imag;

  void main(){
   
  int i, nn;
  float frec ,pi;
     
  nn = 128;//array lenght
  nn = nn/2;
 
  pi = 4.0* atan(1.0);
 

  frec = 2.0*pi*0.5/(float)nn;
 
  for ( i=0; i<=nn-1; i++){
 
  real = cos((float)i*frec);  //real coefficients
  imag = sin((float)i*frec);  //imag coeff
   
  }
 
}



 Esto funciona, pero los resultados son en formato float, necesito convertirlos a radix 1.15.


Ej:

 9.98795456205172e-001(float) --------> 0x7FD9 (radix 1.15)


Pregunto si  alguien conoce un algoritmo para hacerlo.


Saludos
Ricardo
Título: Re: conversion float_to_fix
Publicado por: Nocturno en 29 de Septiembre de 2007, 02:04:50
Creo que basta con multiplicar tu float por 32768 y meterlo en una variable signed int16
Título: Re: conversion float_to_fix
Publicado por: Renatox_ en 29 de Septiembre de 2007, 13:45:51
Existe la función la float2fract, está en la librería dsp.h, que convierte números flotantes al formato fraccional o 1.15, esta función sigue siendo lenta para la versión 3.01. Piensas hacer la FFT con números flotantes o en formato 1.15.

saludos,,
Título: Re: conversion float_to_fix
Publicado por: mateamargo en 10 de Octubre de 2007, 09:36:58
Gracias Nocturno y Renatox por sus aportes. Demoré en responderles xq estuve ausente unos días.
La solución es multiplicar el float por 32768, que es 2^N-1 , siendo N el nro de bits del float (en este caso 16bits). Los valores imaginarios deben multiplicarse por -32768, y los resultados ponerlos en una variable del tipo  int
Lo que estoy intentando es una FFt de 1024 o mas muestras.
Trabajo con el compilador y hardware de MIkroelektronika, y en la librería de ejemplos hay una FFT de escasa resolución para mi aplicación. La pude llevar hasta 512 muestras, pero intento mejorala hasta donde se pueda con el 30F6014,
y en principio necesito generar la tabla de twiddle factors de 1024 valores.
No probé la funcion float2frac.
Les comento que toco bastante "de oído", trabajo mas a golpes de inspiración que con fundamentos sólidos, por eso a veces me trabo en cosas que para otros pueden resultar triviales.

Saludos y gracias,

Ricardo