Friday, October 19, 2012

Fun with Radio Meteors

Update -20121116- New Features in my software.
Well, The  dynamic level setting, was to complicated and unnecessary. The better way to detect events that helps with event visualisation is more sensitive. Even the small ones can be counted .
This has also simplified the interface controls.

A simpler interface
 
A collection of shapes and sizes
 Update -20121114- New Features in my software.
The interface now has dynamic level setting so that only high level events are triggered. Found a better way to detect events, helps with event visualisation . Added a Pingo Meter to the right hand side. ...



 

Update -20121112- New Features in my software.
The interface now has dynamic level setting so that only high level events are triggered. Also added a colourgram counter. A few more features in mind....


Update -20121025 - Mostly small and a few large meteors
Add caption

Update 20121023 -  If you don't want to do the programing with my little script.
Then this is the software that the big guys are using , ARGO can be found here
http://www.sdradio.eu/weaksignals/argo/index.html
It works with the Spaceweather audio stream just as mine does. Have fun......

UPDate: 20121022 - While watching the Audio trace from Space Weather Radio, this large burst happened by. Not sure what type of burst this was, usually they are spikes.
Large dispersed meteor trail....
What Roswell Radio saw......Image rights to Roswell Meteor
 
Original post -

Remember my  post "Fun With Geminids 2010". It was a bit complicated to get working.
I have been using Processing.org software lately, lots of fun. There are a few examples of how to show an audio spectra gram in real time.


Me whistling...
 With this little gem of code,  LiveSpectrogram -  Takes successive FFTs and renders them onto the screen as gray scale, scrolling left.  From Dan Ellis dpwe@ee.columbia.edu 2010-01-15.

 I wrapped a simple interface and triggered image saver around it.

I have it running now, but the big meteors just don't want to happen, so here's a few I have captured during testing.


Seven meteors across 1 hour...



A medium size Meteor ..
Now, it seems to work only if you have your mic line on or a headset mic on.But, if you now go to http://spaceweatherradio.com/  and
turn on the http://topaz.streamguys.tv/~spaceweather/  audio stream.
It will trigger on the larger Meteors, if you adjust the sensitivity correctly.




A larger longer Meteor trace....
Just beware it will create a lot of images if the sensitivity is to low.
And if you make a lot of noise, whistle or speak, it will trigger also.

You will need to be vwary vwary quite when hunting radio meteors....

How to make for your self -  Download Processing.org software, load the following text  into a new sketch and save. Make a data directory under this sketch folder. Then run it.
The images appear in the sketch folder.

Have fun...... try to catch a few ..... Orionids Oct 21-22, 2012  
.......hat tip to  http://astroblogger.blogspot.com.au/...





 ---------------------\/\/\/\/\/\/ cut here \/\/\/\/\/\/ -----------------
/**
 *** Radio Meteor Counter **** agw 20121021 ****
 *** modified from
 *
 * LiveSpectrogram
 * Takes successive FFTs and renders them onto the screen as grayscale, scrolling left.
 *
 * Dan Ellis
dpwe@ee.columbia.edu 2010-01-15
  */

import ddf.minim.analysis.*;
import ddf.minim.*;

Minim minim;
AudioInput in;
FFT fft;
int colmax = 400;
int rowmax = 256;
int[][] sgram = new int[rowmax][colmax];
int[][] sgramb = new int[rowmax][colmax+1];
int col;
int leftedge;
int count = 0 ;
int sgwt = 0 ;
int sens = 155;
int lvl = 0;
int lvlm = 0;
int trig = 99 ;

String  mode = "AUTO";
//
PFont fontA = createFont("Verdana", 12);
 //

 
void setup()
{
  size(colmax+ 150, rowmax+125, P3D);
 // colorMode(RGB, 255);
   background(0);
  noStroke();
  frameRate(100);
 
  //
 fontA = loadFont("CourierNew-12.vlw");

  //
  textFont(fontA, 12);
  textMode(SCREEN);
  textAlign(LEFT);
  //
  //
   minim = new Minim(this);
  
  in = minim.getLineIn(Minim.STEREO,2048);

  fft = new FFT(in.bufferSize(), in.sampleRate());
  fft.window(FFT.HAMMING);
}

void draw()
{
 // background(0);
   // perform a forward FFT on the samples in the input buffer
  fft.forward(in.mix);

  for(int i = 0; i < rowmax /* fft.specSize() */; i++)
  {
  // fill in the new column of spectral values
    sgram[i][col] = (int)Math.round(Math.max(0,2*20*Math.log10(1000*fft.getBand(i))));
     sgramb[i][col+1] = (int)Math.round(Math.max(0,2*20*Math.log10(1000*fft.getBand(i))));
    //
    if ( sgramb[i][col] >= sens) {
      //
      count++;
      trig = 10;
      //
     }
     fill(0, sgram[i][col], 255);
     rect(460, 381, 5, -((sgram[i][col]*2)));
    //
    //
  }
  // next time will be the next column
  col = col + 1;
 
  // wrap back to the first column when we get to the end
  if (col == colmax) { col = 0; }
   
  // Draw points. 
  // leftedge is the column in the ring-filled array that is drawn at the extreme left
  // start from there, and draw to the end of the array
  for (int i = 0; i < colmax-leftedge; i++) {
     for (int j = 0; j < rowmax; j++) {
      //
     // sgwt =(sgram[j][i+leftedge])-(sgramb[j][255]);
      //stroke(sgwt);
      stroke(sgram[j][i+leftedge]);
      //
      point(i,height-j);
     //rect(i,height-j,2,2);
     }
  }
  // Draw the rest of the image as the beginning of the array (up to leftedge)
  for (int i = 0; i < leftedge; i++) {
    for (int j = 0; j < rowmax; j++) {
      //
      stroke(sgram[j][i]);
       point(i+colmax-leftedge,height-j);
     //rect(i+colmax-leftedge,height-j,2,2);
    }
  }
  // Next time around, we move the left edge over by one, to have the whole thing
  // scroll left
  leftedge = leftedge + 1;
  // Make sure it wraps around
  if (leftedge == colmax) { leftedge = 0; }
 
  // Add frequency axis labels
 int x = colmax + 5; // to right of spectrogram display
 stroke(255);
 line(x,0,x,height); // vertical line
  // Make text appear centered relative to specified x,y point
 textAlign(LEFT,CENTER);
 for (float freq = 0.0; freq < in.sampleRate()/2; freq += 500.0) {
   int y = height - fft.freqToIndex(freq); // which bin holds this frequency?
    line(x,y,x+3,y); // add tick mark
   text(Math.round(freq)+" Hz", x+5, y); // add text label
 }
   // zoom around mouse
  //copy((mouseX-25), (mouseY-25), 50, 50, 1, 1, 100, 100);
  fill(0, 0, 0);
  rect(1, 1, 465, 120);
  fill(255, 255, 255);
   //
    lvlm = mouseY-125;
    if(lvlm < 0){ lvlm = 0 ;}
    if (lvlm > 255) { lvlm =255;}
    lvl = sgramb[lvlm][395] ;
  //
  text(mouseX+" "+mouseY+" "+lvl, 10,10 );
  userinfo() ;
  //text( date()+" "+time());
  // 395 338 main ffequency location.
  if (trig <= 10) {
    copy(335, 125, 75, 256, 475, 125, 75, 256);
    fill(0, 0, 0);
    rect(475, 1, 72, 120);
    fill(255, 255, 255);
    text(mode+"\nSENS\n"+sens+"\nMtR\n"+count+"\n"+trig, 480,50);
    trig-=1 ;
    //
    if (trig == 1) {
        saveimg();
        trig = 0 ;
        }
      }
  
    if (trig <= 0) {
      trig = 99 ;
     }
   }


void keyPressed() {
  //
   if (key =='x') {
    exit();
  }
  if (key =='c') {
    count = 0;
    background(0);
    text(mode+"\nSENS\n"+sens+"\nMtR\n"+count, 480,50);
  }
   if (key =='-') {
    sens-=1 ;
   background(0);
   text(mode+"\nSENS\n"+sens+"\nMtR\n"+count, 480,50);
  }
   if (key =='=') {
    sens+=1 ;
    background(0);
    text(mode+"\nSENS\n"+sens+"\nMtR\n"+count, 480,50);
   }
   if (key =='m') {
    if (mode == "AUTO") { mode = "MANU"; }
     else { mode = "AUTO"; }
    background(0);
    text(mode+"\nSENS\n"+sens+"\nMtR\n"+count, 480,50);
   }
}

void saveimg() {
      saveFrame("Meteor-####.jpg");
}

void userinfo() {
   //
   textFont(fontA, 14);
   text("RADIO METEOR COUNTER\n"+"[E(x)it][Sensitivity -(-)/+(=)]\n"+"[(C)lear counter][(M)ode AUTO/MANU ]", 50, 50 );
   textFont(fontA, 12);
   //
}

void stop()
{
  // always close Minim audio classes when you finish with them
  in.close();
  minim.stop();

  super.stop();
 }


 ---------------------/\/\/\/\/\ cut here /\/\/\/\/\-----------------