Nivel: Básico

Generador de LookUp Table de señales senoidales

Nivel: Básico

¿Qué tengo que saber para este post?

  • Compilar utilizando el comando make.

—————————————

Este no va a ser un posteo largo, simplemente para anunciar una pequeña práctica de programación en C++. Este es un software que ya había programado anteriormente en C, pero lo perdí en una formateada de mi PC y decidí rehacerlo en C++ para practicar un poco en este lenguaje.

Es algo que se puede conseguir facilmente online, pero ¿quién te quita la satisfacción de haberlo programado vos mismo? Además de que se adapta específicamente a tu necesidad. Por ejemplo, mi soft ya genera el nombre de la variable utilizando el tipo de datos de stdint necesario para la cantidad de bits o resolución que queramos para la tabla.

Aquí les dejo una captura de cómo se utiliza y lo que genera para 8 bits y 128 entradas en la LUT:

Les dejo el código que está bajo licencia AGPLv3, está señaladas las lineas donde se generan e imprimen los valores calculados y el repositorio para que puedan verlo y clonarlo:

https://gitlab.com/tute-avalos/sinewave-lut-generator

#include <iostream>
#include <string>
#include <sstream>
#include <cstdint>
#include <cmath>
#include <iomanip>

#define _exit_with_error(X) {cout << (X) << endl; exit(1);}

using namespace std;

int main(int argc, char *argv[]) {

    const uint8_t bytes[] = {8,16,32,64};

    if(argc != 3) {
        cout << "usage:\n\t " << *argv << " <bits> <steps>" << endl;
    } else {
        int ib, bits, entries;
        
        /****************************** Validaciones **********************************/        if(!(stringstream(argv[1]) >> bits) or bits <= 0 or bits > 64) 
            _exit_with_error("<bits> must be greater than 0 and less or equal than 64.");
        
        for(ib=0; ib < 4 and bits > bytes[ib]; ib++);

        if(ib == 4) 
            _exit_with_error("<bits> must be greater than 0 and less or equal than 64.");
        
        if(!(stringstream(argv[2]) >> entries) or entries <= 0)
            _exit_with_error("<entries> must be greater than 0.");
        /******************************************************************************/        
        /************************* Generación de la tabla *****************************/        // se calculan los pasos para 1 periodo
        const double step = (2.0*M_PI)/(double)entries; 
        
        // Se imprime el tipo de dato stdint
        cout << "uint" << (uint32_t)bytes[ib] << "_t sineLUT[] = {";
        cout << internal << setfill('0'); // formateo de la salida para rellenar con 0
        
        double value;
        const double maxValue = pow(2,bits)-1;
        // Se calculan los valores de la tabla:
        for(uint16_t i=0; i < entries; i++) {
            // cada 8 entradas 1 salto de linea:
            if(!(i%8)) cout << "\n    "; 
            // Se calcula el valor:
            value = ((sin(i*step)+1.0)/2.0)*(maxValue);
            // Se imprime el valor:
            cout << "0x" << hex << uppercase << setw(((bits-1)/4)+1) << (uint64_t)(value+0.5) << ",";
        }
        // Se borra la última coma y se termina la tabla:
        cout << "\b \n};" << endl;
        /******************************************************************************/    } 
}

Espero que les sea útil y son más que bienvenidos a criticar mi código y proponer mejoras en el gitlab.

msavalos

Soy un hobbista: toco la guitarra, mandolina, descompongo en partituras; también soy aficionado a la fotografía, he hecho algún cursillo por ahí; me encanta la programación, sea de un programa de PC para procesar datos, una interfaz gráfica o un microcontrolador; evidentemente linuxero; y, cayéndose de maduro, geek. Hincha del más grande, técnico en electrónica, ex-estudiante de ingeniería en electrónica en la UTN FRBA, Técnico Superior en Informática y Profesor. Doy clases en el nivel medio en el Gobierno de la Ciudad de Buenos Aires e instituciones privadas y a nivel terciario en una sede dependiente de la UTN. Sobre mi afinidad política, bueno, podría decir que soy militante del Software Libre y medio zurdito (no me ofende).

Ver comentarios

Entradas recientes

Páginas embebidas con ESP8266 (WebServer)

Nivel: Básico ¿Qué tengo que saber para este post? Diseño básico de páginas con HTML…

3 años hace

Modificación de fuente ATX para laboratorio.

Nivel: Avanzado. La modificación de fuentes ATX para su utilización en laboratorio o comunicaciones es…

3 años hace

FLISoL Shield ARDUINO

El pasado 23 de abril se celebró la 18° edición del FLISoL en la que…

3 años hace

Regulador de tensión MOSFET para Moto.

Circuito del regulador, con los elementos de simulación. Típicamente, las motocicletas de baja cilindrada utilizan…

3 años hace

Review Analizador Lógico de menos de u$s10 en Linux

¿Qué puedo decir? Siempre quise tener un analizador lógico, había visto estos pequeños y baratos…

4 años hace

Oversampling con bajos recursos (+Bits ADC)

Nivel: Intermedio ¿Qué tengo que saber para este post? Entender el uso de un ADC.Programación…

4 años hace

Esta web usa cookies.