Analizador de espectro de bricolaje - Calendae - Calendae | Informática, Electrónica, CMS, Ciberseguridad

Analizador de espectro de bricolaje – Calendae

Hola, ¿qué tal colega?. En el teclado Jordi Oriol y en el día de hoy te voy a hablar sobre Analizador de espectro de bricolaje – Calendae

Alan X trabajó en un proyecto de analizador de espectro que puede mostrar el espectro visualmente. Empezó a trabajar con ATTiny85 y ha continuado actualizando el proyecto a lo largo del tiempo.

Alan X utilizó Algoritmo de Goertzel con un Ventana de Hamming, este algoritmo se puede utilizar para detectar una frecuencia a partir de los datos muestreados. Aquí está el código preliminar para un analizador de espectro:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// Uses Daniil Guitelson's BGI library
#include "graphics.h" // -lBGI -lgdi32


#define SampleFreq 125000


int main(void)

  int N=250;
  double data[N];
  double samples[N];
  double freq;
  double s;
  double s_prev;
  double s_prev2;
  double coeff;
  double magn;
  int i;


  int gd=CUSTOM, gm=CUSTOM_MODE(700,700);
  initgraph(&gd, &gm, "");
  setcolor(WHITE);


  int X1,Y1,X2,Y2;
  double scale,xmin,ymin,xmax,ymax;


  // Find the maximum and minimum data range
  xmin=0;
  ymin=0;
  xmax=50000;
  ymax=N;
  scale=1.1*(xmax-xmin>ymax-ymin?xmax-xmin:ymax-ymin);


  // Generate samples
  for (i=0;i<N;i++) 
    samples[i]=(50*sin(2*M_PI*i*3300/SampleFreq)+50*sin(2*M_PI*i*5700/SampleFreq)+50*sin(2*M_PI*i*25700/SampleFreq)+100);
    // Window the data
    // data[i]=samples[i]; // Straight Goertzel - not great
    // data[i]=samples[i]*(0.5-0.25*cos(2*M_PI*i/N)); // Hanning Window
    data[i]=samples[i]*(0.54-0.46*cos(2*M_PI*i/N)); // Hamming Window
    // data[i]=samples[i]*(0.426551-0.496561*cos(2*M_PI*i/N)+0.076848*cos(4*M_PI*i/N)); // Exact Blackman Window
  


  // Scan frequencies
  for (freq=100;freq<=50000;freq+=100) 
    coeff=2*cos(2*M_PI*freq/SampleFreq);
    s_prev=0.0;
    s_prev2=0.0;
    for (i=0;i<N;i++) 
      // Goertzel
      s=data[i]+coeff*s_prev-s_prev2;
      s_prev2=s_prev;
      s_prev=s;


    


    // Get magnitude
    magn=2*sqrt(s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2)/N;
    printf("Freq: %6f Mag: %6.4fn",freq,magn);


    // Plot data
    X1=(int)((freq-(xmin+xmax)/2)*700/scale+350);
    Y1=(int)((0+(ymin+ymax)/2)*700/scale+650);
    X2=(int)((freq-(xmin+xmax)/2)*700/scale+350);
    Y2=(int)((-magn*700/2+(ymin+ymax)/2)*700/scale+650);
    line(X1,Y1,X2,Y2);


  
  getchar();
  closegraph();


  return 0;

BGI por Daniil Guitelson la biblioteca también se utilizó para gráficos.

Producción

Aquí está la salida que muestra las señales DC, 3300Hz, 5700Hz y 25700Hz:

El siguiente paso es llevar el código a una placa Arduino adecuada y mostrar los resultados físicamente. Entonces, usó un archivo Pantalla OLED MicroView y aquí está escuchando una onda cuadrada de 3v 1kHz:

#incluye  // Analizador de espectro de audio #define SampleInput A0 // Nombre el pin de entrada de muestra #define BandWidth 500 // BandWidth #define MaxFreq 4000 // Frecuencia máxima de análisis #define Trigger 10 // Trigger para sincronizar el muestreador de 2vpp at 1kHz = 32 // Defina varios caracteres sin firmar del prescaler ADC PS_16 = (1 

Este proyecto puede inspirar ideas y proyectos increíbles. ¡Puede descargar estos archivos para iniciar su analizador de espectro!

El proyecto completo y la información detallada están disponibles en página del proyecto en Hackaday. Puede seguirlo para mantener actualizaciones con las últimas versiones.

Deberías compartir en una historia de tu Instagram para que tus colegas lo vean

??? ? ? ???

Comparte