Función de generador de tonos dentro del firmware

Hola a todos,

Soy nuevo por aquí y viendo las dudas que tengo y el nivel de conocimientos que hay por aquí, he decidido abrir un tema para ver si me podéis ayudar.

Resulta que he heredado un proyecto de un sonómetro en el que los desarrolladores ya no nos dan soporte y tengo que mirar todo sin explicaciones previas de nadie jejej.

El tema es que es un sonómetro, el cual no tiene analizador de espectros a nivel de hardware, pero por lo que dijeron los desarrolladores en su momento si que tiene hecha una ponderación A, todo a nivel de firmware. En el código del firmware hay una parte que hace referencia a un generador de tonos con diferentes frecuencias, cuya frecuencia se puede ajustar vía hyperterminal. Desconozco cual es la función de este generador, pero si que es cierto que el micrófono que trae está calibrado, por lo que pienso que este generador tiene algo que ver con el proceso de calibración. ¿Se os ocurre a vosotros como se puede hacer una ponderación vía software?

Toda respuesta es bienvenida, a ver si consigo algo de luz en este tema.

Saludos,
 
Por software se puede hacer cualquier cosa con relativa facilidad, y una ponderacion A no es mas que un calculo sobre la señal de entrada al sonometro.
Esto es todo lo que puede decirse, por que no nos das fotos, esquemas ni nada.
 
Es que como es un tema bastante específico no se que daros. ¿Con un pantallazo del código os valdría? El código es bastante extenso.

Está claro que vía software se puede hacer muchas cosas y una ponderación es un calculo, pero lo que no se me ocurre como via software puedes separar el espectro frecuencial, sin tener un codec(hardware) que lo haga. Al final, la ponderación A, no es otra cosas que saber cuanta cantidad de sonido cae en cada banda frecuencial para aplicarle una ganancia a cada banda...

Dime que necesitas y te paso.
 
Y si no tiene un codec por hardware deberá tener una FFT en software que lo haga, a riesgo de demorarse más...bastante más.
Como dices, es tan específico que solo conociendo el hardware y el software disponible y la interacción entre ellos se podría aproximar algo mas o menos coherente. El resto son suposiciones.
 
Codec si que tiene, pero lo que quería decir es que el codec en sí no hace de analizador de espectros, ya que no tiene esa funcionalidad.
Te dejo el esquemático que corresponde a la parte de sonido, el cual viene el codec utilizado. Todo esto va conectado a un PIC de microchip PIC32MX530F128H. Voy a intentar poner el código (si puedo) de la parte del generador de tonos.

C:
/**
 * @file ToneGen.c
 *
 * Funciones del Generador de Tonos
 *
 * @version  1.00a
 * @date     12/04/2016
 * @author   Pirx
 *
 */

/****************************** Include Files *********************************/

#include <math.h>
#include "ToneGen.h"
#include "Hardware.h"


/************************** Constant Definitions ******************************/

#define        PI                    3.1415926535897932384626433832795


/***************************** Type Definitions *******************************/

/* None */

/****************************** Variable Definitions **************************/

DefTone        Tone;

/*************************** Function Prototypes ******************************/

/* None */


/*******************************************************************************
 * Inicia la estructura del Generador
 *
 * @param    none
 * @return    none
 * @note    none
 ******************************************************************************/
extern void ToneGenInit(void)
{
    _Bool _rt;
    
    _rt = ToneSetActive(FALSE);
    _rt = ToneSetAttn(0);
    _rt = ToneSetFreq(NOTONE);
}


/*******************************************************************************
 * Activacion del Generador
 *
 * @param    none
 * @return    none
 * @note    none
 ******************************************************************************/
extern _Bool ToneSetActive(_Bool _ena)
{
    Tone.ptr = 0;
    Tone._ena = _ena;
    if (_ena == TRUE)
        SetMuteBTL(NS._mute);
    else
        SetMuteBTL(TRUE);
}


/*******************************************************************************
 * Activacion del Generador
 *
 * @param    none
 * @return    Active Estatus
 * @note    none
 ******************************************************************************/
extern _Bool ToneGetActive(void)
{
    return Tone._ena;
}


/*******************************************************************************
 * Seleccion de la frecuencia del generador
 *
 * @param    freq    Frecuencia seleccionada
 * @return    TRUE    Cambio
 * @note    La funcion sin(x) es en radianes. [360∫Sexagesimales = 2PI radianes]
 ******************************************************************************/
extern _Bool ToneSetFreq(Tone_Freq freq)
{
    _Bool _ret = (freq != Tone.Freq)? TRUE : FALSE;
    _Bool _b = Tone._ena;
    UINT8    i;
    UINT8    c = 0;
    static const UINT8 spc[8] = {96, 96, 48, 32, 24, 16, 12, 8};        // Numero de muestras por ciclo
    
    Tone._ena = FALSE;
    Tone.ptr = 0;
    Tone.Freq = freq;
    
    for (i=0; i<(sizeof(Tone.Dat)/2); i++){
        if (Tone.Freq == NOTONE){
            Tone.Dat[i] = 0;
        } else {
            Tone.Dat[i] = (INT16)((double)0x7fff * sin((c*2*PI)/spc[Tone.Freq]));
        }
        c++;
        c %= spc[Tone.Freq];
    }
    Tone._ena = _b;
    
    return (_ret)? TRUE : FALSE;
}


/*******************************************************************************
 * Selecciona la Atenuacion en dB [0 .. 44]
 *
 * @param    dB    Atenuancion en dB
 * @return    TRUE    Cambio
 * @note    La atenuacion se programara en rangos de 3. (0dB,1dB,2=0dB / 3,4,5=6dB
 ******************************************************************************/
extern _Bool ToneSetAttn(UINT8 dB)
{
    _Bool _ret = (Tone.Attn != dB)? TRUE : FALSE;
    
    if (dB > 44){
        Tone.Attn = 15;
    } else {
        Tone.Attn = 1+(dB/3);
    }
    
    return (_ret)? TRUE : FALSE;
}
 

Adjuntos

  • sonido.pdf
    606.5 KB · Visitas: 14
Ok.
Ahora, con todo esto, cual es exactamente la consulta???
Por que el generador de tonos usa unas funciones que deben dialogar con el hardware, aunque probablemente generen los tonos con el DAC del TLV320 pero no hay mucho que decir, pero el asunto va a ser largo por que hay que analizar todo el código para encontrar la relación con el hardware:

Por ejemplo, en ToneSetFreq parece estar generando las muestras del tono a enviar, pero como tampoco tenemos la declaración del tipo DefTone, no sabemos que es lo que lleva adentro, aunque parece un arreglo...entre otras cosas.

Disculpame, pero no dá para estudiarlo en el foro. Es una tarea muy específica que vos debes llevar a cabo o pagarle a alguien capacitado para que lo haga. Aquí, con lo que has subido, poco y nada se puede opinar
 
Hola Dr Zoidberg ni mucho menos era mi intención que alguien de aquí revisara todo el código, simplemente era por si alguien se había enfrentado a algún poryecto similar y sabría de antemano para que es cada cosa para luego yo poder ir investigando más afondo. Por eso tampoco quería subir mucho código, porque es extenso y no pretendo que aquí la gente dedique tiempo a revisar.

Es probable, como bien comentas, que sea para el DAC, me informaré más sobre este tema.

Te dejo adjunto la cabecera del código anterior, no creo que aporte mucho más, pero ahí está definido el DefTone.

Muchas gracias!
C:
/*
 * File:   ToneGen.h
 * Author: Pirx
 *
 * Generador de Tonos
 *
 * Created on 12 de abril de 2016, 8:08
 */

#ifndef TONEGEN_H
#define    TONEGEN_H

#ifdef    __cplusplus
extern "C" {
#endif

#ifdef    __cplusplus
}
#endif

/****************************** Include Files *********************************/

#include <GenericTypeDefs.h>

/*************************** Constant Definitions *****************************/

/* None */

/***************************** Type Definitions *******************************/

typedef enum {
    NOTONE = 0,                        // Generador Desactivado
    FT166,                            // Frecuencia a  166Hz    / 96s    ( 1ciclo  en 96dat)
    FT333,                            // Frecuencia a  333Hz    / 48s    ( 2ciclos en 96dat)
    FT500,                            // Frecuencia a  500Hz    / 32s    ( 3ciclos en 96dat)
    FT666,                            // Frecuencia a  666Hz    / 24s    ( 4ciclos en 96dat)
    FT1K0,                            // Frecuencia a 1000Hz    / 16s    ( 6ciclos en 96dat)
    FT1K3,                            // Frecuencia a    1333Hz    / 12s    ( 8ciclos en 96dat)
    FT2K0,                            // Frecuencia a 2000Hz    / 8s    (12ciclos en 96dat)
}Tone_Freq;

typedef struct{
    INT16        Dat[96];            // Datos
    Tone_Freq    Freq;                // Frecuencia
    UINT8        Attn;                // Atenuacion en DB's
    UINT8        ptr;                // Puntero
    _Bool        _ena;                // Habiliatcion
}DefTone;


/********************* Variable Definitions (Globales) ************************/

extern DefTone        Tone;                                // Generador de Tonos                   


/*************************** Function Prototypes ******************************/

extern void ToneGenInit(void);                            // Iniciar la estructura del Generador
extern _Bool ToneSetActive(_Bool _ena);                    // Activar o Desactivar el Generador
extern _Bool ToneGetActive(void);                        // Obtener el estado de activacion
extern _Bool ToneSetFreq(Tone_Freq freq);                // Seleccion de la Frecuencia
extern _Bool ToneSetAttn(UINT8 dB);                        // Seleccion de la Atenuaniion


#endif    /* TONEGEN_H */
 
Encapsula todos los archivos del proyecto en un ZIP o RAR, y subelo al foro, asi subiendo de a poco, poco y nada se va a entender el codigo total.
 
Atrás
Arriba