Autor Tema: conversion float_to_fix  (Leído 2893 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mateamargo

  • PIC10
  • *
  • Mensajes: 20
conversion float_to_fix
« 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: conversion float_to_fix
« Respuesta #1 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

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: conversion float_to_fix
« Respuesta #2 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,,
control de movimiento

Desconectado mateamargo

  • PIC10
  • *
  • Mensajes: 20
Re: conversion float_to_fix
« Respuesta #3 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


 

anything